struts学习笔记

作者: Dl_毛良伟 | 来源:发表于2017-05-22 21:12 被阅读347次

    传统的mvc模式

    Struts开源架构很好的实现了MVC模式,MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。

    实现一个简单的struts案例

    实现步骤

    • 创建一个javaweb工程,并选中struts2,
    • 创建jsp页面(创建视图)
    • 创建action类(Action 类是 Struts 2 应用程序的关键,并且我们在 action 类中实现大部分的业务逻辑)
    • 配置文件

    创建一个javaweb工程,并选中struts2,

    在idea中创建好之后,会自动导入struts相关的核心包,并在web.xml中初始化配置一些相关的文件

    完整项目路径

    创建index.jsp页面

    <%--
      Created by IntelliJ IDEA.
      User: pc
      Date: 17-5-22
      Time: 上午8:05
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
    hello!
      </body>
    </html>
    

    成功时,会在jsp中显示一句话hello!

    创建action类 UserAction

    package action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * Created by pc on 17-5-22.
     */
    public class UserAction extends ActionSupport {
    
        //action中业务处理方法
        public String login() {
            System.out.println("User.action");
            return "success";
        }
    
        public String register() {
            System.out.println("User.action User.action");
            return "success";
        }
    }
    
    

    1.Action映射:
    action映射是Struts2框架中的基本” 工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。

    
    属性   是否必须    说明
    name      是      action的名字,用于匹配URL
    class     否      Action实现类的完整类名
    method    否     执行Action类时调用的方法
    convert   否     应用于action的类型转换的完整类名
    
    

    2.使用method属性
    在配置action时,我们可以通过action元素的method属性来指定action调用的 方法,所指定的方法,必须遵循与execute方法相同的格式。

    配置文件

    • 在web.xml中需要如下配置
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    
    • 在action包下需要再次创建一个struts.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <!-- 包配置:一般都要继承struts-default,因为该包有默认的拦截器等东西 -->
        <!--namespace:命名空间,考虑到可能出现相同的action,如果有命名空间就可以解决  -->
        <package name="config" namespace="/user" extends="struts-default" abstract="false">
             <!-- 定义一个action -->
             <!--对应UserAction中login方法-->
            <action name="login" class="action.UserAction" method="login">
                 <!--  返回一个String常量,转发至对应的JSP页面--> 
                <result name="success">/index.jsp</result>
            </action>
            <!--对应UserAction中register方法-->
            <action name="register" class="action.UserAction" method="register">
                <result name="success">/index.jsp</result>
            </action>
        </package>
    
    </struts>
    

    常量配置:用到 constant 标签 ,name 和 value 两属性

    命名空间: namespace=”/user”,http://localhost:8080/user/login.action 查找条件是优先到指定命名空间寻找对应的action,如果找到就用不再继续找,如果找不到,则到默认的命名空间找,否则报错。

    在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

    • 在src根目录下面找到struts.xml,这个文件称为总配置文件,作用是引入其他所有配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <!--全局配置-->
        <!--1.修改struts默认的访问后缀-->
        <constant name="struts.action.extension" value="action,do,"/>
        <!--总配置文件,引入其他所有配置文件-->
        <include file="action/struts.xml"></include>
    </struts>
    

    struts2的工作流程

    1. 客户端提起一个(HttpServletRequest)请求,在浏览器中输入http://localhost:8080/user/login就是提起一个(HttpServletRequest)请求。其中user就是namespace="/user",login<action name="login" class="action.UserAction" method="login">
    2. 在web.xml文件中定义核心Filter拦截用户请求。
    3. 通过post或get提交请求。
    4. 定义处理用户请求的Action类。在MVC框架中,控制器C实际上是由拦截所有用户请求,处理请求的通用代码两个部分共同组成的,实际的业务逻辑则由Action来处理。
    成功时的截图 UserAction中打印的字符串

    struts.xml中常用到的标签

    1、<include>
    利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。
    3、<package>
    1、包

    在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。包属性如下:

    属性          是否必需       描述
    
    name            是        包名,作为其它包应用本包的标记
    extends      否      设置本包继承其它包
    namespace      否        设置包的命名空间
    abstact      否      设置为抽象包
    
    <package name="config" namespace="/user" extends="struts-default" abstract="false">
            <action name="login" class="action.UserAction" method="login">
                <result name="success">/index.jsp</result>
            </action>
    
            <action name="register" class="action.UserAction" method="register">
                <result name="success">/index.jsp</result>
            </action>
        </package>
    
    

    2、extends

    当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括action、result、interceptor等。
    由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。
    通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包。

    <package name="config" namespace="/user" extends="struts-default" abstract="false">
    

    3、namespace

    namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一个命名空间的Action可以使用相同的Action名的。

    namespace="/user"
    

    4、<action>与<result>

    1、<action>属性介绍
    
    属性名称  是否必须  功能描述
    
    name        是   请求的Action名称
    class      否    Action处理类对应具体路径
    method    否 指定Action中的方法名
    converter   否   指定Action使用的类型转换器
    
    如果没有指定method则默认执行Action中的execute方法。
    
    2、<result>属性介绍
    
    属性名称 是否必须 功能描述
    
    name    否   对应Action返回逻辑视图名称,默认为success
    type    否   返回结果类型,默认为dispatcher
    
    

    相关文章

      网友评论

      • 逍遥键客:JAVA高级开发群:647355916 大量学习资料和项目实战视频尽情领取
      • 啥也不说了:struts要被淘汰的技术,漏洞太多了。
        Dl_毛良伟: @cleaner_wei 谢谢你的意见
        啥也不说了:我自己的看法是这样。mvc这种框架你应该去学习。spring需要大力学习。struts了解下就可以了,这个框架漏洞实在是太多了,我们公司新项目已经不提倡使用Struts,老项目有机会去改成spring mvc。对应hibernate也有缺陷,主要是不够灵活,且很难精通在级联等方面。所以如果你是新手,我的不成熟建议是你狂高spring mvc,数据库就用mybatis
        Dl_毛良伟: @cleaner_wei 你觉得对于一个刚接触框架的新手来说,应该怎么学才好,应不应该学ssh三大框架,或是该不该学struts?其他框架跟这些基础的框架的原理一样吗?

      本文标题:struts学习笔记

      本文链接:https://www.haomeiwen.com/subject/ntdixxtx.html