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/>
阅读全文
0 0
- Struts2开发流程分析
- struts2执行流程分析
- struts2运行流程分析
- Struts2-运行流程分析
- struts2 流程分析
- Struts2运行流程分析
- struts2运行流程分析
- Struts2处理流程分析
- struts2执行流程分析
- Struts2 运行流程分析
- Struts2运行流程分析
- Struts2 运行流程分析
- 二、Struts2开发流程
- Struts2 开发流程
- Struts2 开发流程
- Struts2框架开发流程
- struts2 一般开发流程
- struts2项目开发流程
- RH254-第二十五节-Samba和NFS以及Iscsi服务
- 2017 杭电多校赛第八场 1011题 Killer Names HDu 6143
- 使用java字符串中的反斜杠和特殊符号的表示
- jquery选择器用法总结
- js中遍历
- Struts2开发流程分析
- 2080 特殊的质数
- 排序--希尔排序
- jquery easyUI 手风琴首页实例样例代码
- 使用__del__方法在Python文件处理时保证文件关闭
- Struts2进阶
- android retrofit 示例(一)
- Angular2 使用ngcontent 投影来自父组件的html(Projection)
- Linux文件与目录管理的常用命令