Struts2数据封装、拦截器、标签基础
Struts2执行过程:
Struts2每次访问action时默认执行execute方法。
struts2配置标签:
package 区别不同的action。
name:唯一标识的包名。
extends:继承其他包,可以直接使用继承包的资源。
abstract:(ture/false) 包是否为抽象包,抽象包不能写入action标签。
namespace:命名空间,默认值为“/”,如果改为“/a”,则jsp跳转action名需要改为“/a/action_name”。
action 控制跳转。
name:请求地址名,不同命名空间可以重复name名,相同命名空间下不能重复。
class:action对应的实现类路径。
method:对应实现类中具体执行哪个方法。默认值为execute。
result 同时配置全局和局部result,最终结果以局部result为准。
name:方法返回值
type:配置如何到路径中(转发或者重定向),默认转发操作。
redirectAction 重定向到action,一个方法跳(重定向)到另一个action方法。
chain 链,一个方法跳(转发)到另一个action方法。
global-results 全局的结果返回,在package里,action外。所有的action都共用的一套result。
constant 常量配置 name-value形式。
分模块开发:
可以引入单独配置Struts的xml文件
<include file="xx.xx.xx"></include> 值为配置文件路径。
实现action的三种编写方式:
①普通类,不继承,不实现
②实现action接口,接口中有方法和常量可以直接使用
③创建继承类,继承方法ActionSupport(建议使用)该继承方法也实现action接口
访问action的方法:
①用method属性实现,值为action的方法名(适用于方法较少的action)
②使用通配符(常用)
name属性里的 * 星号。
*表示匹配任意内容
method值表示取第一个*星号的值。 (固定的表达式结构{x})。
result标签不用通配符。
③动态访问(不常用)
action里的方法返回值类型必须是String类型,若没有返回值(返回值为“none”),result标签不需要配置。
四大作用域: 操作域对象
request(常用):
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("name",”value");
response:
HttpServletResponse response = ServletActionContext.getResponse();
session:
HttpSession session = request.getSession();
application:
ServletContext application = ServletActionContext.getServletContext();
Struts实现拦截器: implements Interceptor 继承自xwork2。
映射拦截器,arg.invoke();
Struts.xml配置文件中声明拦截器:
interceptors拦截器标签在package里,action外. 可定义多个拦截器
Interceptor单个拦截器 name属性(拦截器名称) class属性(拦截器路径)
action方法映射拦截器:
action标签内<interceptor-ref name="声明的拦截器名称"></nterceptor-ref>
配置自定义拦截器后,默认拦截器会失效,需在拦截器后加入<interceptor-ref name="basicStack"></nterceptor-ref>里面有exception等拦截。
配置全局的一个package里所有action使用相同的拦截器:
<default-interceptor-ref name="声明的拦截器名称"></default-interceptor-ref>
配置action里面某些方法不进行拦截:
在<interceptor-ref></interceptor-ref>标签内加个param标签,name属性值:excludeMethods,值为action不拦截的方法名称如login方法。 多个方法的话用逗号隔开。
<interceptor-ref>
<param name="excludeMethods">login</param>
</interceptor-ref>
拦截器底层原理:
第一种 aop原理 面向切面的横向编程 不修改源代码,添加扩展功能
第二种 责任链模式 属于java设计模式的一种,类似于过滤链——一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器
执行默认器的过程使用aop思想,用配置文件的方式进行操作不修改源代码,执行很多拦截器时会使用责任链模式
过滤器和拦截器的区别:
过滤器:理论上可以过滤任意内容,比如html,jsp,servlet,图片路径
拦截器:只可以拦截action
Action中获取表单数据:
①使用ActionContext类获取
完全解耦合的一种方法
//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2.调用方法得到表单数据
//key是表单输入项name属性值,value是输入的值
Map<String,Object> map = context.getParameters();
Set<String> keys = map.keySet();
for(String key:keys){
//根据key得到value obj就是value值
//数组形式,因为输入项中有可能有复选框情况
Object[] obj = (Object[]) map.get(key);
}
②使用ServletActionContext类获取request对象 (常用)
包含很多静态方法
//1.使用ServletActionContext获取request对象
HttpServletRequest request = ServletActionContext.getRequest();
//2.调用request里面的方法得到结果
String name = request.getParameter("name名");
③实现接口注入方式,获取request对象
Struts2封装数据到实体类对象:
原始方式繁琐不适合过多对象(但是功能有效)⬇️
①属性封装
在action中声明变量和生成对应的set和get方法,在action的方法中就可以直接获取属性的值。
注意:该方式只是获取表单数据到属性里,不能把数据直接封装到实体类对象里。
②模型驱动封装(重点)——可以直接把数据封装到实体类对象里面
1.action实现接口 ModelDriven(泛型)模型驱动 泛型是实体类的名称
2.创建实体类对象
3.实现接口里面的方法 getModel()方法
把创建的对象返回
4.在action的方法中执行操作
注意:属性封装和模型驱动封装不能同时使用,同时使用只会执行模型驱动封装
③表达式封装 ——可以把表单数据封装到实体类对象里面
1.在action里面声明实体类private User user
2.在action里面生成实体类对象(tUser)和变量(username)的set和get方法
3.在表单输入项的name属性值里面写表达式形式
表单形式:<Input type="text" name="user.username"> user是声明实体类的对象名 username是实体类变量名
模型驱动封装与表达式封装的不同点:
模型驱动封装只能封装一个实体类数据(因为使用的泛型,里面只能声明一个实体类对象),而表达式封装可以封装多个实体类对象数据(可以在action声明多个实体类,并生成相应的set和get方法,但要注意表单输入项的表达式写法,对象名要与变量名相对应)。
Struts2封装数据到集合里面
封装数据到list集合
步骤类似表达式封装,先声明有泛型(实体类对象)的list,再生成set和get方法(不需要变量的set和get方法),然后注意表达式形式。
表单形式:<Input type="text" name="list[0].username"> list[0]:表示list集合里的第一个user对象
封装数据到map集合
步骤同list结合。只是声明的map的泛型中有两个,一个类型,一个对象名(Map<String,User>)
表单形式:<Input type="text" name="map['one'].username"> 设置key值map['key值'] 设置value值(就是变量名)
使用Struts2标签
1.在jsp中引入标签库
<%@ taglib uri="/struts-tags" prefix="s"%>
2.使用标签
<s:property value=""/>
3.修改外观样式,在Struts配置中
<constant name="struts.ui.theme" value="simple"></constant>
Struts2标签库
s:property: 和ognl表达式在jsp页面中获取值栈数据
s:iterator: 获取值栈list集合数据,表示list集合
s:debug: 查看值栈结构和数据
表单标签:
strtus2表单标签(默认会放到表格中) form可以设置主题方式 里面有theme="simple"可以单行显示。
演示:
校验器
action方法继承ActionSupport类,重写validate方法。
<s:fielderror filename="username"></s:fielderror>
国际化
1.在src下创建文件global_en_US.properties,global_zh_CN.properties
2.struts配置中指定国际化文件的名字,使用<constant>常量标签 name值是“struts.custom.i18n.resources” value值是"global"
3.页面中引用国际化<s:text name="tttle"></s:text> name值都在国际化属性文件中配置
4.切换语言跳转链接 href=“t?request_locate=en_US” t是在Struts配置文件中配置的action。使用jsp不能直接跳转