1、结果页面配置
(1)全局结果页面
A、result标签配置action方法的返回值到不同的路径里面去。
B、创建两个action,执行不同的方法或都执行默认方法,让两个action的方法都返回一个字符串,配置到同一个页面里面。
a、如果多个action,方法里卖弄返回值相同,到页面也是相同的,这个时候使用全局结果页面进行配置
<package ...>
<global-results>
<result name="error">/jsp/error.jsp</result>
</global-results><!--只在该package中的action生效-->
</package>
(2)局部结果页面
配置了全局页面,又配置了局部页面,最终结果以局部的配置为准。
<action ...>
<result name="error">/jsp/error.jsp</result>
</action>
(3)result标签type属性
配置如何到路径中去(转发or重定向)
A、默认值:做转发操作,值是dispatcher,一次请求,地址栏不发生变化
B、redirect:做重定向操作,两次请求,地址栏发生变化
以上是针对页面的配置的值
以下是针对action的配置的值
C、chain:转发到action,一般不用,有缓存问题
D、redirectAction:重定向到某个action
<package...>
<action...>
<result name="xxx" type="rediretAction">xxx.action</result>
</action>
</package>
2、在action获取表单提交数据
取getParameter,getParameterMap
(1)使用ActionContext类获取(官方推荐使用)
A、创建表单,提交表单到action里面
B、创建action
ActionContext actionContext = ActionContext.getContext();
Map<String,object> map = actionContext.getParameters();
set<String> keys = map.keySet();//获取key
for(String key:keys){
Object[] obj = (Object[])map.get(key);//因为可能有复选框的存在,因此是数组的形式
System.out.prinln(Arrays.toString(obj));
}
(2)使用ServletActionContext类获取(大部分使用的方式)
A、调用静态方法,得到request对象
HttpServletRequest request = ServletActionContex.getRequest();
String value = request.getParameter(key);
(3)使用接口注入方式获取(一般不用)
让action类实现接口ServletRequestAware,实现setServletRequest()方法
3、struts2获取表单数据方式
原始方式获取表单封装到实体
HttpServletRequest request = ServletActionContext.getRequest();
String value = request.getParameter(key);
Entity entity = new Entity();
entity.setValue(value);
(1)属性封装
A、直接把表单提交的属性封装到action的属性里面
B、实现步骤
a、在action成员变量位置定义变量:变量名称和表单输入项的name属性值一样
b、生成变量的set方法(get,set方法都写出来,可以避免混淆)
C、只能把表单数据封装到属性里面去,不能把数据直接封装到实体类对象中
(2)模型驱动封装(使用最多)
A、直接把表单数据封装到实体类对象里面
B、实现步骤
a、action实现接口ModelDriven
b、实现接口里面的方法getModel
c、在action里面创建实体类对象
private Entity entity = new Entity();
public Entity getModel(){
return entity;
}
C、注意问题:一个action,获取表单数据可以使用属性封装或使用模型驱动封装,不能同时使用属性封装和模型驱动封装
(3)表达式封装
实现步骤:
a、在action中声明实体类
private Entity entity;
b、生成实体类变量set和get方法
public void setEntity( Entity entity){
return this.entity;
}
public Entity getEntity(){
this.entity;
}
c、在表单输入想的name属性里面写表达式
<input type="text" name="entity.id">
4、struts2获取数据封装到集合中
(1)封装到list集合
-声明List<Entity> entityList;
-创建get/set方法
-<input name="entityList[0].name"..>
(2)封装到map集合
-声明map集合
-生成get/set方法
-表单输入项中写表达式<input name="map['key'].name"..>
5、表达式封装和模型驱动比较
(1)相同点:都可以把数据封装到实体类对象中去
(2)不同点:
-表达式封装,可以把数据封装到不同的实体类对象中去
-模型驱动封装,不能把数据封装到不同的实体类对象中去