Struts2开发流程分析

来源:互联网 发布:linux解压软件下载 编辑:程序博客网 时间:2024/06/07 05:32

1.从客户端发送请求过来 先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器 就会完成部分功能代码)执行目标Action,在Action中返回一个结果视图,根据Result的配置进行页面的跳转.
2. 配置struts.xml,DTD存放的路径:src\core\src\main\resources\struts-2.3.dtd.
3. Struts2的配置文件的加载顺序:

    查看StrutsPrepareAndExecuteFilter:(核心过滤器)两个功能 :预处理 和 执行     在预处理功能中 init 方法中会有加载配置文件的代码:    dispatcher.init();                    init_DefaultProperties(); // [1]                    ---- 加载org.apache.struts.default.properties.配置的是struts2的所有常量.                    init_TraditionalXmlConfigurations(); // [2]     ---- 加载struts-default.xml、struts-plugin.xml、struts.xml                    init_LegacyStrutsProperties(); // [3]               ---- 加载用户自定义struts.properties                    init_CustomConfigurationProviders(); // [5]     ---- 加载Struts2定义Bean.                    init_FilterInitParameters() ; // [6]                ---- 加载web.xml                    init_AliasStandardObjects() ; // [7]                ---- 用户自定义Bean            结论:             1. default.properties             2. struts-default.xml             3. struts-plugin.xml             4. struts.xml              ---- 配置Action以及常量.(******)             5. struts.properties       ---- 配置常量             6. web.xml             ---- 配置核心过滤器及常量.            ***** 后配置的常量 会 覆盖先配置的常量.

4.Action的配置:

<package>的配置:       * package:包. 不是java中说那个包. Struts2中的包 管理<action>.    * 属性:    * name      :包名.包名是唯一的不能重复的.    * extends   :继承.继承struts-default.(struts-default包中定义结果类型和拦截器.)    * namespace :名称空间.与<action>标签中的name属性共同决定Action的访问路径.    * 写法:    * namespace有名称: namespace=”/aa”    * namespace只是一个/:    namespance=”/”    * namespace默认的: namespace没写.    * abstract  :抽象的.用于使其他的包可以继承的.    * <package name="struts-default" abstract="true"> . 所以可以继承struts-default.    <action>的配置:    * action:配置Action类的访问路径.    * 属性:    * name  :名称.与<package>中的namespace属性共同决定访问路径.    * class :类的全路径.要执行的Action类的全路径.    * method    :方法.用来指定Action中执行那个方法的方法名.(默认的值execute)    <result>的配置:    * result:配置Action执行后的页面跳转.    * 属性:    * name  :逻辑视图名称.(不是真实的视图,为真实的视图起了一个别名,在Action中返回这个字符串的别名,从而找到具体页面.)    * type  :跳转的类型.

5.默认的Action和Action的默认处理类:

默认的Action:<!-- 配置默认的Action:Action的访问路径不存在的时候,执行一个默认的Action --><default-action-ref name="strutsDemo1"/>Action的默认处理类:<!-- Action的默认处理类:Action的访问路径配置正确了,但是没有配置class属性. --><default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>

6.Struts2常量的配置:

    修改常量:* struts.xml中修改常量(推荐使用)    <!-- 修改Struts2的常量的值 -->    <constant name="struts.action.extension" value="abc"/>* struts.properties修改常量    struts.action.extension=xxx* web.xml中修改常量  <filter>    <filter-name>struts2</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>    <init-param>        <param-name>struts.action.extension</param-name>        <param-value>xyz</param-value>    </init-param>  </filter>

7.分模块开发的时候

<include file="cn/itcast/struts2/demo1/struts_demo1.xml"/>  整合其他的struts的配置文件.

8.Action的编写的方式:

Action是简单的Java对象没有实现任何借口 和 继承任何类.public class ActionDemo1 {public String execute(){    System.out.println("ActionDemo1执行了...");    return null;}}【Action类实现一个Action的接口】public class ActionDemo2 implements Action{@Overridepublic String execute() throws Exception {    System.out.println("ActionDemo2执行了...");    return null;}}Action接口中提供了5个已经定义好的视图名称:    * SUCCESS       :success,代表成功.    * NONE          :none,代表页面不跳转    * ERROR         :error,代表跳转到错误页面.    * INPUT         :input,数据校验的时候跳转的路径.    * LOGIN         :login,用来跳转到登录页面.     *       【Action类继承ActionSupport类】    public class ActionDemo3 extends ActionSupport{    @Override    public String execute() throws Exception {        System.out.println("ActionDemo3执行了...");        return NONE;    }}ActionSupport中提供了一些功能,比如数据校验,比如国际化… 如果Action继承了ActionSupport,那么Action就会有这些功能.

8.Action的访问:
Action的访问不是难题,因为之前已经访问过了,但是出现一个问题一次请求现在对应一个Action,那么如果请求很多对应很多个Action.现在要处理的问题就是要让一个模块的操作提交到一个Action中。
【解决Action的访问的问题的方式一:通过配置method属性完成】

页面:<h3>客户的管理</h3><a href="${ pageContext.request.contextPath }/saveCustomerAction.action">添加客户</a> <br/><a href="${ pageContext.request.contextPath }/updateCustomerAction.action">修改客户</a> <br/><a href="${ pageContext.request.contextPath }/deleteCustomerAction.action">删除客户</a> <br/><a href="${ pageContext.request.contextPath }/findCustomerAction.action">查询客户</a> <br/>编写Action:public class CustomerAction extends ActionSupport{    public String save(){        System.out.println("CustomerAction中save方法执行了...");        return NONE;    }    public String update(){        System.out.println("CustomerAction中update方法执行了...");        return NONE;    }    public String delete(){        System.out.println("CustomerAction中delete方法执行了...");        return NONE;    }    public String find(){        System.out.println("CustomerAction中find方法执行了...");        return NONE;    }}配置Action:    <package name="demo3" extends="struts-default" namespace="/">        <action name="saveCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="save"></action>        <action name="updateCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="update"></action>        <action name="deleteCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="delete"></action>        <action name="findCustomerAction" class="cn.itcast.struts2.demo3.CustomerAction" method="find"></action>    </package>【解决Action的访问的问题的方式二:通过通配符的配置完成】

第一种解决方案不是很优秀,因为在Action的配置中配置多条.能不能一个Class类只对应一个配置?

页面:<h3>联系人的管理</h3><a href="${ pageContext.request.contextPath }/linkman_save.action">添加联系人</a> <br/><a href="${ pageContext.request.contextPath }/linkman_update.action">修改联系人</a> <br/><a href="${ pageContext.request.contextPath }/linkman_delete.action">删除联系人</a> <br/><a href="${ pageContext.request.contextPath }/linkman_find.action">查询联系人</a> <br/>编写Action:public class LinkManAction extends ActionSupport{    public String save(){        System.out.println("保存联系人...");        return NONE;    }    public String update(){        System.out.println("修改联系人...");        return NONE;    }    public String delete(){        System.out.println("删除联系人...");        return NONE;    }    public String find(){        System.out.println("查询联系人...");        return NONE;    }}配置Action:    <!-- 通配符的配置 -->    <action name="linkman_*" class="cn.itcast.struts2.demo3.LinkManAction" method="{1}"></action>

【解决Action的访问的问题的方式三:动态方法访问】
开启一个常量:动态方法访问.

编写Action:public class UserAction extends ActionSupport{    public String save(){        System.out.println("保存用户...");        return NONE;    }    public String update(){        System.out.println("修改用户...");        return NONE;    }    public String delete(){        System.out.println("删除用户...");        return NONE;    }    public String find(){        System.out.println("查询用户...");        return NONE;    }}配置Action:<!-- 动态方法访问的配置 --><action name="userAction" class="cn.itcast.struts2.demo3.UserAction"></action>页面路径写法:<h3>用户的管理</h3><a href="${ pageContext.request.contextPath }/userAction!save.action">添加用户</a> <br/><a href="${ pageContext.request.contextPath }/userAction!update.action">修改用户</a> <br/><a href="${ pageContext.request.contextPath }/userAction!delete.action">删除用户</a> <br/><a href="${ pageContext.request.contextPath }/userAction!find.action">查询用户</a> <br/>
原创粉丝点击