概述
一、Action获值
Action获值即表示action类中如何获得地址栏参数、表单参数的值,同时将获取的值放入不同的作用域中。
1.使用ActionContext类(解耦方式)
Web应用中通常需要访问的Servlet API就是HttpServletRequest、HttpSession和ServletContext,这三个接口分别代表JSP内置对象中的request、session和application。
Struts2提供了一个ActionContext类(com.opensymphony.xwork.ActionContext),它是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。可以通过下面方法访问Servlet API:
Object get(key) | 类似于HttpServletRequest的getAttribute(String) |
Map getApplication() | 返回一个Map对象 |
static ActionContext getContext() | 返回静态的ActionContext实例,相当于HttpServletRequest对象 |
Map getParameters() | 获取所有的请求参数,返回Map对象 |
Map getSession() | 返回一个Map对象 |
void setApplication(Map) | 向application传入一个Map对象 |
void setSession(Map) | 向session传入一个Map对象 |
void put(key, value) | 添加对象 |
案例1:使用ActionContext操作作用域
ActionContext ac = ActionContext.getContext(); Integer count = (Integer) ac.getApplication().get(“count”); // 通过ActionContext设置application范围的属性 ac.getApplication().put(“count”, 100); // 通过ActionContext设置session范围的属性 ac.getSession().put(“max”, 1000); // 通过ActionContext设置request范围的属性 ac.put(“min”, 10); |
前端页面:
统计总人数:${applicationScope.count} 最大人数:${sessionScope.max} 最小人数:${requestScope.min} |
案例2:使用ActionContext获得JSP表单中的数据
(1)创建表单,提交表单到action里面
<form action=”/register” method=”post”> 用户名:<input type=”text” name=”uname” /> 手机号:<input type=”text” name=”moblie” /> 性别:<input type=”radio” name=”sex” value=”1” / >男 <input type=”radio” name=”sex” value=”0” />女 <input type=”submit” value=”提交” /> </form> |
(2)在action使用ActionContext获取表单数据:
ActionContext ac = ActionContext.getContext(); // map的key就是表单项的各name Map<String, Object> map = ac.getParameters();
//查看Map中的数据 Set<String> keys = map.keyset(); for(String key : keys){ Object[] obj = (Object[])map.get(key); System.out.println(Arrays.toString(obj)); } |
2.使用ServletActionContext类(耦合方式)
HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("request", "1");
HttpSession session = request.getSession(); session.setAttribute("session", "2");
ServletContext application = request.getSession().getServletContext(); application.setAttribute("application", "3"); |
3.使用ServletXxxAware接口注入(耦合方式)
使用ServletContextAware、ServletRequestAware、ServletResponseAware三个接口可直接获得Servlet API。
Step1:类实现ServletResponseAware接口(或其它两个接口)。
Step2:重写相应的方法:
// 自定义类实现:ServletXXXAware接口,实现方法 public class Test implements ServletRequestAware,ServletSessionAware……{ private HttpServletRequest request;
@Override public void setServletRequest(HttpServletRequest request){ this.request = request; }
public String execute() throws Exception{ return NONE; } } |
4.清空Session的值
HttpSession session = ServletActionContext.getRequest().getSession(); session.invalidate(); sessionMap.invalidate(); |
session.invalidate():将session设置为失效,一般在退出时使用,但要注意的是:session失效的同时,浏览器会立即创建一个新的session,你第一个session已经失效了,所以调用它的getAttribute方法时候一定会抛出NullPointerException的。
二、实现Action
案例:表单数据提交
对应数据在前台与后台中的交互,Struts2框架替我们做了很大部分的数据封装工作。既可以封装单个对象,也可以封装集合。
实现Action有两大方式:属性驱动、模型驱动。
(1)属性驱动
使用属性作为贯穿MVC流程的信息携带者,依附于Action实例,Action实例封装请求参数和处理结果。
属性驱动有三种:普通POJO类、实现Action接口、继承ActionSupport。
(2)模型驱动
就是使用单独的JavaBean实例来贯穿整个MVC流程,JavaBean实例封装请求参数和处理结果。
模型驱动有一种:ModelDriven。
1.普通POJO类
实现一个登录Action:
public class LoginAction { //私有属性 private String username; private String password; //struts2的拦截器机制,getter/setter方法负责解析用户请求参数,并且将请求参数值赋给action对应的属性(也就是说将form表单的数据赋值给Action类中的属性,属性名与表单项控件名一致) //此处省略set和get方法
public String execute() throws Exception { if("test".equals(getUsername()) && "123".equals(getPassword())){ return "success"; }else{ return "error"; } } } |
2.实现Action接口
为了让用户开发的Action类更加规范,Struts2提供Action接口,定义了Action处理类应该实现的规范。
实现步骤:
- Action类实现Action接口,重写execute()方法,返回时使用Action接口中的常量;
- 在Action中声明成员变量,成员变量名与表单项name属性一致;
- 封装。
案例:
//1. 实现Action接口 public class LoginAction implements Action { //2. 私有属性 private String username; private String password; //3. 此处省略set和get方法
//返回使用Action接口中的常量 public String execute() throws Exception { if("test".equals(getUsername()) && "123".equals(getPassword())){ return SUCCESS; }else{ return ERROR; } } } |
Action接口代码:
public interface Action{
// 定义Action接口里包含的一些结果字符串
public static final String ERROR=”error”;
public static final String INPUT=”input”;
public static final String LOGIN=”login”;
public static final String NONE=”none”;
public static final String SUCCESS=”success”;
// 定义处理用户请求的execute方法
public String execute() throws Exception;
}
3.继承ActionSupport类(推荐)
ActionSupport类是Action接口的实现类。该类提供了许多默认的方法,这些默认方法包括获得国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。
如果配置Action没的指定的Action类,系统自动使用ActionSupport类作为Action处理类。
实现步骤:
- 继承ActionSupport,重写execute()方法。不继承也可以,直接写execute()方法;
- 在Action中声明成员变量,成员变量名与表单项name属性一致;
- 封装。
案例:
//1. 继承ActionSupport类 public class LoginAction extends ActionSupport { //2. 声明成员变量(与表单项name一致,这里最好是私有化一个实体类对象,参见后面的) private String username; private String password; //3. 封装,省略getter/setter方法 //struts2的拦截器机制,getter/setter方法负责解析用户请求参数,并且将请求参数值赋给action对应的属性
public String execute() throws Exception { if("test".equals(getUsername()) && "123".equals(getPassword())){ return SUCCESS; }else{ return ERROR; } } } |
4.模型驱动封装:ModelDriven
模型驱动:就是使用单独的JavaBean实例来贯穿整个MVC流程,JavaBean实例封装请求参数和处理结果。
实现步骤:
(1)Action类实现ModelDriven接口;
(2)实现接口的getModel()方法,并把创建对象返回;
(3)在Action中创建实体类对象;
(4)execute()一样法中使用实体类对象名即可。
案例:
//1. 实现ModelDriven接口 public class LoginAction3 implements Action, ModelDriven<User> { //定义用于封装请求参数和处理结果的Model private User user = new User(); //2. 实现接口的getModel()方法,并把创建对象返回 @Override public User getModel() { return user; } //4. 在execute()中使用对象 public String execute() throws Exception { if("test".equals(user.getUsername()) && "123".equals(user.getPassword())){ return SUCCESS; }else{ return ERROR; } } } |
User类:属性名要与表单控件名字相同,否则报错。
//3. 创建实体类并封装 public class User implements Serializable{ private static final long serialVersionUID = 1L; // 私有的请求参数 private String username; private String password; // 省略set和get方法
public User() { } public User(String username, String password) { super(); this.username = username; this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } }
|
最后
以上就是狂野金毛为你收集整理的struts2中Action获取值的方法一、Action获值二、实现Action的全部内容,希望文章能够帮你解决struts2中Action获取值的方法一、Action获值二、实现Action所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复