Struts2 学习小结
一、Struts工作原理
1.1 Struts拦截用户请求
Struts框架控制器分为核心控制器(拦截用户请求ActionServlet)和业务逻辑控制器(处理用户请求Action)。下面是序列图:
1.2 Struts程序流程
Client发出的请求被 ActionServlet拦截到后有两种情况:1.要求逻辑控制器处理,2.简单转发请求(Http请求无需Action处理,也不用填充ActionForm,直接转发)。
Forward有全局和局部两种,局部优先。Action使用ActionMapping控制转发时,只需要转发到Forward的逻辑名,而无需知道具体的资源,这样可降低耦合程度。逻辑名与实际资源的映射在struts-config.xml中配置。Forward的主要作用就是定义转发逻辑名和表现层资源的关联。
二、深入struts配置文件
2.1 配置ActionServlet拦截用户请求
ActionServlet用来拦截所有的Http请求,因此该Servlet配置成自启动Servlet,即为该Servlet配置load-on-startup属性。Struts支持多个配置文件。
2.2 配置ActionForm封装请求参数
应保证ActionForm的参数和表单域的名字相同。
2.3 配置Action处理请求
ActionServlet拦截到用户请求后,根据用户请求在配置文件中查找对应的Action,Actioin的name属性指定了用于封装请求
参数的ActionForm,ActionServlet将创建默认的ActionForm实例,然后调用setter方法完成初始化。
ActionServlet在转发用户请求时,也将对应的ActionForm的实例一同发给Action。
三、Struts标签库
3.1 在web.xml文件中引入标签库的定义
增加标签库定义的目的是定义标签定义文件和URI之间的对应关系。(使用标签目的减少页面中Java脚本,增加可读性和可维护性)
3.2 bean标签库
bean标签库主要用于显示相关功能,如用于输出属性值,提示消息,定义请求参数等。还可用于输出国际化信息。bean标签库中常用标签如下:
- cookie:将请求的cookie值定义成脚本可访问的JavaBean实例
- define:将某个bean属性值定义成脚本可访问的变量
- header:将请求头的值定义成脚本可访问的变量
- parameter:将请求参数定义成脚本可访问的变量
- include:将某个jsp资源完成定义成一个bean实例,导入资源
- message:用于输出国际化信息
- page:将PageContext中特定项定义成一个bean
- resource:加载web应用资源,并将其变成JavaBean
- struts:用于将某个struts的内容配置暴露给一个bean
- write:用于输出某个bean的属性值
3.3 logic标签库
主要用于害怕基本的流程控制,如循环和选择等。logic标签库的主要标签:
- empty/notEmpty:若变量为空或空串,则计算、输出标签体内容
- equal/notEqual:若变量与指定值相等,则计算、输出标签体内容
- match/notMatch:若特定字符串是给定变量的子串,则计算、输出标签体内容
- present/notPresent:如果特定字符串的值出现在请求中,则计算、输出标签体内容
- messagePresent/messageNotPresent:若请求中包含特定的内容,则计算、输出标签体内容
- lessThan/greaterThan:给定变量小于/大于特定值,则计算、输出标签体内容
- lessEqual/greaterEqual:给定变量小于等于/大于等于特定值,则计算、输出标签体内容
- forward:将整个页面控制权forward确定炎ActionForward项
- redirect:重定向页面(丢失请求中的参数)
- iterate:遍历给定集合的元素,对标签体的内容循环执行
四、动态ActionForm
为避免编写ActionForm,可以使用动态ActionForm.
4.1 使用动态ActionForm
所有动态ActionForm都是DynaActionForm类或其子灰。另外必须在配置文件中配置对应的属性,用form-property元素: <form-property name="xxxx" type = "yyyy" />
4.2DynaActionForm类
DynaActionForm类提供了多个重载的getter方法用于获取请求参数,其getter方法主要有3种:
- Object get(String name)
- Object get(String name, int idx) :用于重名表单域
- Object get(String name, String key):Map属性
五、Struts数据校验
数据校验也称输入校验,指对用户的输入进行基本过滤,包括字段必填、字段需为数字,两次输入密码相同等。 其数据校验大概可分为以下三种:
5.1 ActionForm的代码校验
1.这种校验是重写validate方法,在该方法内对所有字段进行基本校验。如果出现不合要求的输入将出错提示封装在ActionError对象
中,最后将多个ActionError组合成ActioinErrors对象,该对象中封装所有的出错信息。
2.JSP页面使用<html:errors />即可输出出错提示。
注:使用ActionForm的输入校验时,应为对应的Action增加input属性,指定校验失败后的返回页面。
5.2 Ation的代码校验(略)
5.3 结合commons_validator.jar校验
需要使用此校验框架,有三个通用配置:
- 增加校验资源
- 利用validator加载校验资源
- ActionForm使用ValidateForm的子类
六、Struts异常框架
借助于struts的异常框架,异常处理只需要通过struts-config.xml文件定义即可。
- 局部异常:在action的子元素中定义<exception />
- 全局异常:在global-exceptions元素中定义
七、Struts的特殊用途
7.1 使用Struts控制文件上传
commons-fileupload.jar文件就是用于上传文件的类库文件,使用
org.apache.struts.upload.FormFile,该类对应一个文件项。在Jsp页面中定义一个包含文件域的表单,其中
enctype="multipart/form-data".
7.2 使用struts管理数据源(后续补充)
八、常用Action简介
- DispatchAction:可以在一个Action内同时完成多个Action功能
- ForwardAction:整合Struts和其他业务逻辑组件,通常只对请求做有效性检查,用parameter参数指定前往页面
- IncludeAction:用于引入其他的资源和页面
- LookupDispatchAction:根据按钮的Key控制转发给action的方法
- MappingDispatchAction:一个action可映射出多个Action地址
- SwitchAction:从一个模块转换至另一个模块
九、Struts常见扩展方法
a.实现plugIn接口,如果需要在应用启动或关闭前完成某些操作,可以创建自己的PlugIn类。
b.继承RequestProcessor,如果想在请求被处理中做一些业务逻辑的话,可以继承它,其是Struts的核心
类,ActionServlet只是调用RequestProcessor。
c。继承ActionServlet,如果需要在每次开始处理请求之前或处理请求结束之后完成某些操作,可实现自己的ActionServlet。