Struts2 数据处理
结果页面配置
- result 标签 配置 action 返回的值,最终的去向;
1. 全局结果页面
- 如果 多个返回值 和 跳转页面 一致时使用
<package>
<global=results>
<result name="返回值">跳转路径</result>
</global=results>
.........
</package>
2. 局部结果页面
- 最终以局部结果为准
<package>
<action name="提交名称" class="指定类路径">
<result name="返回值">跳转路径</result>
.........
</action>
.........
</package>
3. result 标签 type 属性
- type值 规定了 跳转方式
- dispatcher 默认值 转发
- redirect 重定向
- chain 转发到 action (几乎不用)
- redirectAction 重定向到 action
<package>
<action name="提交名称" class="指定类路径">
<result name="返回值1" type="dispatcher">跳转路径1</result>
<result name="返回值2" type="redirect">跳转路径2</result>
.........
</action>
.........
</package>
在 action 获取 from 数据 *
- 提交到 action , 但是 action没有 request ,也不能直接使用 request
1. 使用ActionContext类获取
- ActionContext 类的方法
void put( String key , Object value ) | 将key 和 value 放入 ActionContext 中,模拟HttpServletRequest的 setAttribute方法 |
Object get(String key) | 通过 key 的值 查找 ActionContext中的值 |
Map <String,Object>.getApplication() | 返回一个Application作用域的Map对象 |
static ActionContext.getContext() | 获取当前线程的ActionContext对象,通过这个方法获得 |
Map <String,Object>.getParamenters() | 返回一个包含所有HttpServletRequest参数的信息的Map对象 |
Map <String,Object>.getSession() | 返回一个Map类型的HttpSession对象 |
void setApplication(Map <String,Object> application) | 设置Application上下文 |
void setSession(Map <String,Object> session) | 设置一个Map类型的Session值 |
2. 使用SercletActionContext类获取
httpServletRequest.getRequest() | 获取web应用的HttpServletRequest 对象 |
httpServletResponse.getResponse() | 获取web应用的HttpServletResponse 对象 |
ServletContext.getServletContext() | 获取web应用的ServletContext 对象 |
PageContext.getPageContext() | 获取web应用的PageContext 对象 |
封装数据到值栈
属性封装
- 定义变量,变量和表单输入项name的属性值一样
- 生成 getter 和 setter 方法
注意值栈的有效范围为*类似request,如果要获取必须存在,如有2个跳转以上,必须改为转发,也就是说struts.xml中 配置结果发送模式为转发
提交页面
<form action="users_action" method="post">
用户:<input type="text" name="uname" required="required" />
密码:<input type="password" name="password" required="required"/>
<input type="submit" value="login" />
</form>
展示页面
<%@taglib uri="/struts-tags" prefix="s"%>
......
用户:
<s:property value="uname"/>
<br>
密码:
<s:property value="password"/>
<br>
struts.xml 配置
<struts>
<package name="Users" namespace="/" extends="struts-default">
<action name="users_action" class="com.action.UsersAction" method="login">
<result name="ok" >ok.jsp</result>
</action>
</package>
</struts>
Action类
package com.action;
public class UsersAction {
private String uname;
private String password;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String login() {
return "ok";
}
}
模型封装
- action 实现接口
ModelDrive
. - 实现接口 的方法
getModel
.
** 把创建的对象返回 - 在action中创建实体类对象
Users us = new Users();
action类
public class UsersAction extends ActionSupport implements ModelDriven<Users> {
//必须创建实体类对象
private Users us = new Users();
public Users getUs() {
return us;
}
public void setUs(Users us) {
this.us = us;
}
public String login() {
return "ok";
}
@Override
public Users getModel() {
//返回一个Users对象
return us;
}
}
表达式封装
前台展示
<!-- !标签导入 -->
<%@taglib uri="/struts-tags" prefix="s"%>
....
<p>
用户:
<s:property value="us.uname"/>
密码:
<s:property value="us.password"/>
</p>
前台提交
<form action="users_action" method="post">
用户:<input type="text" name="us.uname" />
密码:<input type="text" name="us.password" />
<input type="submit">
</form>
struts.xml配置
<struts>
<package name="users" extends="struts-default" namespace="">
<action name="users_action" class="com.action.UsersAction" method="login">
<result name="ok">index.jsp</result>
</action>
</package>
</struts>
Action动作类
package com.action;
import com.bean.Users;
public class UsersAction {
private Users us ;
public Users getUs() {
return us;
}
public void setUs(Users us) {
this.us = us;
}
public String login(){
System.out.println(us);
return "ok";
}
}
实体类
package com.bean;
public class Users {
private String uname;
private String password;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Users [uname=" + uname + ", password=" + password + "]";
}
}
表达式封装和模型驱动的区别
- 相同:可以把数据封装到实体类里面
- 不同:表达式封装可以到不同的实体类里面
封装到集合里面
- List集合
- Action类中声明List集合
- 表单输入项name属性值按照这样的格式填写
例:name="list[0].us.uname"
实体类
package com.action;
import java.util.List;
import com.bean.Users;
public class UsersAction {
List<Users> list;
public List<Users> getList() {
return list;
}
public void setList(List<Users> list) {
this.list = list;
}
public String login() {
return "ok";
}
}
提交页面
<form action="users_action" method="post">
用户:<input type="text" name="list[0].uname" />
密码:<input type="text" name="list[0].password" /><br>
用户:<input type="text" name="list[1].uname" />
密码:<input type="text" name="list[1].password" /><br>
用户:<input type="text" name="list[2].uname" />
密码:<input type="text" name="list[2].password" /><br>
用户:<input type="text" name="list[3].uname" />
密码:<input type="text" name="list[3].password" /><br>
<input type="submit">
</form>
展示页面
<%@taglib uri="/struts-tags" prefix="s"%>
....
<s:iterator value="list">
用户:
<s:property value="uname"/>
密码:
<s:property value="password"/><br>
</s:iterator>
struts.xml
<struts>
<package name="users" extends="struts-default" namespace="">
<action name="users_action" class="com.action.UsersAction" method="login">
<result name="ok">index.jsp</result>
</action>
</package>
</struts>
- Map集合
- Action类中声明Map集合
- 表单输入项name属性值按照这样的格式填写
例:name="map['声明键值'].us.uname"