Struts2
1.开发步骤:
1.在web.xml文件中定义核心Filter来拦截用户请求
由于web应用是基于请求/响应架构的应用,因此MVC Web框架,都需要在web.xml中配置该框架的核心Servlet或filter
这样才能让该框架介入Web应用中。
2.如果以post方式提交请求,则定义包含表单数据的jip页面,若以get方式方发送请求,则不需要定义
3.定义处理用户请求的Action类
拦截所有用户请求,处理请求的通用代码由核心控制器完成
实际业务控制(如调用model,返回处理结果)由Action(业务控制器)处理
4.配置Action
a.包和命名空间
<package name="".../>属性:
name:必选属性
aextends:
namespace:主要为了处理同一个web中包含同名Action的情况
abstract:
配置文件从上到下处理,所以父包应该在子包前面定义
b.Action配置
<action name="名字即Action所处理的URL" class="默认为ActionSupport类" method="默认execute"/>
5.配置处理结果和物理视图资源之间对应的关系
<result name="默认为SUCCESS"></result>
6.编辑视图资源
此时,基本完成Struts2处理流程开发,即执行一次完整的请求->响应过程
2.Struts2的常规配置
主要配置Action和请求之间对应关系,并配置逻辑视图名和物理视图资源之间的对应关系
struts.xml还可以额外功能:Bean配置,常量配置等等
常量配置:
需要指定两个属性:常量name和常量value
Struts2属性:Struts2常量相当于对struts2应用整体起作用的属性
使用struts.properties文件来管理常量
Properties文件:
包含了系列的key-value对,每个key是一个struts2常量,value为常量值
配置方式:
1.struts.properties文件配置
2.struts.xml文件配置(推荐方式)
<constant name="属性名" value="属性值” />
3.通过web应用的web.xml文件
<init-param>
<param-name>属性名</param-name>
<param-value>属性值</param-value>
</init-param>
Struts2框架搜索常量加载顺序:
struts-default.xml>struts-plugin.xml>struts.xml>struts.properties>web.xml
如果在多个文件中配置了同一个struts2常量,后面配置的常量值覆盖之前的
3.Action
Action只是Struts2控制器的一部分,不能直接生成对浏览器的响应
负责处理请求,为jsp页面提供显示数据
实现Action(业务控制器)
1.通常直接使用Action来封装http请求参数
因此,Action类中应包含与请求参数对应的实例变量,并提供getter&setter方法
2.通常包含一个无参数的execute()方法,用来处理用户请求的逻辑控制方法
3.Action类的实例变量,不仅可以用于封装请求参数,还可以用于封装处理结果
ActionSupport类:
是一个默认Action实现类,提供许多默认实现的方法
若配置Action类没有指定class属性,系统默认使用
ActionSupport类作为处理类
Action访问Servlet API:
提供一个ActionContext类来访问ServletAPI
getContext():获取系统的ActionContext实例
Action直接访问Servlet API:
1.提供如下接口来访问
ServletContextAware实现该接口的action可以直接访问ServletContext实例
ServletRequestAware实现该接口的action可以直接访问HttpServletRequest实例
ServletResponseAware实现该接口的action可以直接访问HttpServletResponse实例
2.或使用ServletActionContext类
Action基本配置
使用Action的动态方法调用:
允许一个Action内包含多个控制处理逻辑
1.在struts.xml开启系统的动态方法调用
通过设置struts.enable.DynamicMethodInvocation常量值为true完成
2.指定表单action属性
action="actionName!methodName"或...
3,在struts.xml配置Action时指定<allowed-methods../>子元素
允许在指定name属性时使用”*“(代表一个或多个字符串),
接下来就可以在class,method属性及<result../>子元素中
使用{N}的形式来代表前面第N个”*”所匹配的子串
对于动态调用方法,其方法声明与系统默认execute方法
应只有方法名不同,形参列表,返回值类型都应该完全相同
配置默认Action
当用户请求找不到对应的Action时,系统默认的Action即将处理用户请求
配置方法:
<package name="">
<default-action-ref name="默认action名" />
<action name="默认action名" class="">
<result.../>
</action>
</package>
配置Action默认处理类
系统默认使用ActionSupport作为Action处理类
配置action的默认处理类
<default-class-ref class="默认类名"/>
4.配置处理结果
Action处理完用户请求后,返回一个普通的字符串,即为一个逻辑视图名
Struts2通过配置逻辑视图名和物理视图之间的映射关系,系统收到action返回
的逻辑视图名,就会把对应的物理视图返回给浏览者
配置结果
局部结果:将<result…/>作为<action…/>子元素配置
全局结果:对所有action有效
将<result…/>作为<global-results…/>子元素配置
局部结果覆盖全局结果
<result../>属性:
name:所匹配逻辑视图名
type:该属性指定结果类型
Struts2支持结果类型:
dispatcher结果类型:默认结果类型,指定使用jsp作为视图的结果类型
chain结果类型:action链式处理的结果类型
freemarker,httpheader,redirect,redirectAction等等
Action属性值决定物理视图资源
配置<result../>时,不仅可以使用${N}表达式形式来指定视图资源,
还可以使用${属性名}里的属性名就是对应Action实例里的属性
还可以完全使用OGNL表达式,即:
${属性名.属性名.属性名...}
OGNL语言
Object-Graph Navigation Language,可以方便操作对象属性的开源表达式语言(EL)
Struts2框架默认使用OGNL作为默认表达式语言
三大要素:
表达式:做什么
根对象:对谁操作
Context对象:是一个map类型对象 在表达式访问Context对象:"#对象名称"
使用PreResultListener
监听器接口,通过ActionInvocation的addPreResultListener()方法完成,
在action完成控制处理后,系统转入实际的物理视图之前回调该监听器beforeResult()方法,
一旦为拦截器添加了PreResultListener监听器,该监听器会对拦截器所拦截的所有Action都起作用
5.配置Struts2的异常处理
通过声明的方式管理异常
使用Struts2的异常处理机制,必须打开Struts2的异常映射功能,开启异常映射功能需要一个拦截器
struts-default.xml配置文件中开启了Struts2的异常映射
1.声明异常捕捉
1.在struts.xml中配置<exception-mapping.../>元素完成,需要指定以下两个属性:
exception:指定该异常所设置的异常类型
result:指定action出现异常时,返回result属性值对应的逻辑视图名
2.异常映射种类
局部异常映射:将<exception-mapping../>元素作为<action../>元素子元素配置
全局异常映射:将<exception-mapping../>元素作为<global-exception-mapping>元素子元素配置
Action内局部异常映射会覆盖全局异常映射
2.输出异常信息
<s:property value="exception.message"/>:输出异常本身
<s:property value="exceptionStack"/>:输出异常堆栈信息
6.Convention插件与"约定”支持
Convention插件主要解决Action管理,Result管理等常见配置,而不是完全舍弃struts.xml
约定优于配置
1.Action的搜索和映射约定
1.安装Convention插件
将Struts2项目下struts2-convention-plugin-…jar文件复制到WEB-INF\l ib路径下
Convention插件把两种java类当作Action处理:
1.所有实现了com.opensymphony.xwork2.Action的java类
2.所有类名以Action结尾的java类
2.找到Action后,插件按约定部署Ation
actions,action,struts,struts2包会映射成为根命名空间
这些包下子包被被映射成对应的命名空间
Action的name属性(也就是Action所要处理的URL)
根据该Action类名映射遵循规则:
1.若Action类包含Action后缀,将后缀去掉,否则不做任何处理
2.将Action类名的驼峰写法转换成中划线写法
eg:LoginAction映射Action的name属性为login
GetBooks映射的Action的name属性为get-books
AddEmployeeAction映射的Action的name属性为add-employee
3.采用Convention插件之后,Action类的代码依旧不需要任何额外变化
2.按约定映射Result
默认情况下,Convention总会到Web应用的WEB-INF/content路径下定位物理资源,
定位资源约定:actionName+resultCode+suffix。当某个逻辑视图找不到对应的
资源时,Convention会自动视图使用actionName+suffix作为物理视图资源
Config Browser插件:
有利于开发者调试,使用该插件可以更清楚看出Struts2应用下部署哪些Action
,以及其详情的映射信息。
安装:Struts2 lib下struts2-config-browser-plugin-jar复制到web应用WEB-INF\lib下
3.Action链的约定
一个Action处理结束后进入另一个Action形成Action链
通过Convention遵守三个约定:
1.第一个Action返回逻辑视图名字符串没有对应的视图资源
2.第二个Action与第一个Action处于同一包下
3.第二个Action映射的URL为:firstactionName+resultcode
4.自动重加载映射
配置应用处于开发者模式
<constant name="struts.devMode" value="true"/>
配置Convention插件自动重加载映射
<constant name="struts.convention.classes.reload" value="true"/>
5.convention的常量
6.Convention插件相关注解
还允许使用注解管理Action和Result的配置,从而覆盖Convention
的约定
7.Struts2的国际化
步骤:
1.系统加载国际化文件
自动加载:Action范围的国际化资源文件,包范围国际化资源文件由系统自动加载
手动加载:jsp范围的国际化资源文件,全局范围国际化资源文件,分别使用标签
<s:il8n…/>,配置常量的方式手动加载
2.输出国际化
在视图页面上输出国际化消息,需要使用struts2的标签库
在action类中输出国际化消息,需要使用actionSupport的getText()方法完成
8.Struts2的标签库
1.概述
Struts2标签库不依赖于任何表现层技术,大部分标签可以在所有表现层技术中使用
所有标签定义在uri为“/sruts-tags”下,简单分类:
UI(用户界面)标签:生成html元素标签
表单标签:生成html的form元素及普通表单元素的标签
非表单标签:生成页面上的树,tab页等标签
非UI标签:数据访问,逻辑控制标签
流程控制标签:实现分支循环等流程控制的标签
数据访问标签:包含用于输出Value,完成国际化等功能标签
2.使用Struts2标签
自定义标签开发,struts2提供标签处理类,也提供了标签库定义文件
struts2-core-.jar下META-INF路径下找到struts-tags.tld(标签库定义文件)
导入标签库,在jsp中导入Struts2标签库:
<%@ taglib prefix=“s” uri="/struts-tags"%>
9.Struts2的类型转换
http请求都是字符串类型,java是强类型语言,因此mvc框架必须转换这些字符串参数
1.Struts2内建的类型转换器,可以自动完成大多数常用类型转换
2.Struts2的类型转换可以基于OGNL表达式,以另一种简单方式将请求参数转换成复合类型
3.允许开发者通过局部类型转换文件(*.properties)来指定集合元素类型
4.实现自定义类型转换器需要重写DefaultTypeConverter类的convertValue()方法
5.注册类型转换器
10.struts2的输入校验
11.Struts2控制文件上传
12.Struts2控制文件下载
13.Struts2拦截器机制
14.Struts2的Ajax支持