Struts2
- 文章内容:
- 结果页面配置
- action获取表单提交数据
- 扩展–表达式封装和模型驱动比较
- 数据封装到集合中
一、结果页面配置
1.全局结果页面
背景:一个package里面多个action的结果页面,都是同一个页面。
以前情况,会生成多个result标签,容易混乱,可以package里面定义一个global-results标签
<!--全局结果页面-->
<package name="" extends="">
<global-results>
<result name="success">/xx.jsp</result>
</global-results>
<action ...></action>
<action ...></action>
</package>
2.局部结果页面
<action>
内的页面。如果即配置了全局页面,也配置了局部页面,结果以局部页面为准
3.result标签和type属性
-
type属性:如何到路径里面去,转发还是重定向
-
type属性值
-
默认值–做的操作是转发操作 值为dispatcher
-
做重定向操作,值 是redirect
-
上面的两个一般都是针对页面配置的
-
chain :转发到action ,但是一般不建议使用,用缓存问题
<result name="success" type="chain">
-
redirectAction :重定向到action
<result name="success" type="redirectAction ">
-
<action name="xxx" class...> <result name="ok" type="redirectAction">orders</results> </action> <action name="orders" class...></action>
-
二、action 获取表单提交数据
之前的方法,都是提交表单到servlet里面,在servlet里面使用request对象里面的方法获得,getParameter,getParameterMap
现在提交表单是到action里面,action里面没有request中对象.
获取数据有以下3中方式
1.使用ActionContext类获取–官方推荐
ActionContext类来访问Servlet API,ActionContext 是Action执行的上下文对象,保存了Action的执行的所需对象,包括parameters,request,Session,application
ActionContext context = ActionContext.getContext();
Map<String,Object> map = context.getParameters();
Set<String> keys = map.keySet();
for(String key:keys){
// 根据key得到value
Object[] obj = (Object[])map.get(key);// 有的表单如复选框,会有多个值,所以用集合接收
System.out.println(Arrays.toString(obj));// Arrays.toString() 可以输出数组内容
}
用的人不是很多
2.使用ServletActionContext类获取
ServletActioncontext 类里面的静态方法
static HttpServletRequest getRequest(); //获取web应用的HttpServletRequest 对象
static HttpServletResponse getResponse(); // 获取web应用的HttpServletResponse 对象
static ServletContext getServletContext(); // 获取web应用的ServletContext对象
static PageContext getPageContext();// 获取web应用的PageContext对象
- 调用类里面的静态方法,得到request对象
// 使用ServletActionContext 类获取
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getparameter("xxx");
使用action 操作域对象
request . session . servletContext 域对象
具体操作方法,同上,先获取request对象,然后在获取Session对象
3.使用接口注入方式获取
让action实现接口,为了得到request对象
在类中,定义成员变量,然后调用
// 实现以下接口
implements ServletRequestAware
implements ServletResponseAware
implements SessionAware
implements ServletContextAware
三、Struts2 提供获取表单
原始操作方法:取得request对象,提取出相应的parameter值,然后用javabean 对象的get和Set方法赋值
如果内容过多,代码实现十分复杂
1.属性封装 —(会用)
- 直接把表单提交的属性,封装到action的属性中
- 在action中的成员变量位置定义变量,与表单输入项的名称一样
- 生成变量的Set方法
- 表单提交的时候,action实现了ActionSupport类,会自动将表单中的数据封装。
提示:该方法只是把数据封装到属性里面,没有封装到实体类对象里面
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(this.username+this.password);
return NONE;
}
有的表达式封装也被分到了属性封装里面
- 在action中,声明实体类,就是定义对象,但是没有new出来
- 生成实体类里面的Set get 方法
- 在表当输入项的name值里面写表达式形式
private User user;
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
public String execute(){ return NONE;}
---------- 表单输入项------------
<input type="text" name="user.username"> // 表示封装到user类的username中
<input type="text" name="user.password"> // 表示封装到user类的password中
2.模型驱动封装—(重点、常用)
可以直接把数据封装到对象中。
- action 实现接口 ModelDriven
- 实现接口里面的方法 getModel ---- 把创建对象返回
- 在 action 里面创建实体类对象 new JavaBean();
public class DataAction02 extends ActionSupport implements ModelDriven<User>{
private User user= new User(); // 这里必须new一个新的对象
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
提示:两个方法不能同时在一个action中,获取一个表单提交的数据。否则,属性封装会为null。执行驱动封装
3.表达式和模型驱动对比
-
使用模型驱动,只能把数据封装到一个实体类对象里面
在一个action里面,不能把模型驱动封装到不同的实体类对象里面
-
使用表达式封装,可以把数据封装到不同的实体类对象中
表单项里面,该项的name写入新的类对象.属性
四、Struts2 获取数据封装到集合中
1.封装到list集合
- 在action中声明list;
- 生成list变量的set和get方法
- 在表单输入项里面写表达式
<input type="text" name="list[0].username"/>
<input type="text" name="list[0].password"/>
<input type="text" name="list[1].username"/>
<input type="text" name="list[1].password"/>
2.封装到MAP集合
- 声明Map集合
- 生成get和set方法
- 在表单输入项的name值里写表达式
<input type="text" name="map['one'].username">
<input type="text" name="map['one'].password">
<input type="text" name="map['two'].username">
<input type="text" name="map['two'].password">
最后更新:2018.10.31