接受网页中的输入

转载自http://www.iteye.com/topic/285144,特此声明。

1、使用领域对象来接收用户输入

【工程1:sx_ch0301】:

User对象中包含两个字段:username和password,在Action中有一个User对象user,则在jsp中:

Jsp代码  收藏代码
  1. <input type="text" name="user.username">  
  2. <input type="password" name="user.password">  

 来进行数据绑定。

当Struts2尝试设置user对象的username属性时,将依次调用以下的方法:

Java代码  收藏代码
  1. action.getUser();  
  2. action.setUser(new User());  
  3. action.getUser().setUserName();  

Struts2首先尝试获得User对象的引用,当它发现User对象为null时,它将使用User类的默认构造方法创建一个User实例,并调用action的setUser()方法设置这个实例。这样,Struts2就可以设置Usser对象的username字段了。

 

在Struts2中,自动实例化对象的特性对于任意层次的对象包含关系都是适用的。

 

例如, user.address.street这样的表达式会调用:

Java代码  收藏代码
  1. getUser().getAdderss().setStreet(...);  

 Struts2会先创建User对象,接着创建Address对象,然后设置Address对象的street属性。

 

2、使用ModelDriver action
【工程2:sx_ch0302】:

LoginAction 类实现了 ModelDriven 接口:(注意要实例化 User 对象,否则在 getModel() 时会取不到对象。)

Java代码  收藏代码
  1. public class LoginAction implements Action, ModelDriven<User> {  
  2.       
  3.     private User user = new User();  
  4.   
  5.     @Override  
  6.     public User getModel() {  
  7.          return user;  
  8.     }  
  9.   
  10. }  

在login.jsp页面中,表单字段就不需要再使用“user.”前缀了:

Jsp代码  收藏代码
  1. <input type="text" name="username">  
  2. <input type="password" name="password">  

在sucess.jsp页面中,表单字段也不需要再使用“user.”前缀了:

Jsp代码  收藏代码
  1. <s:property value="username" />  

3、使用action的属性接收用户输入

【工程3:sx_ch0303】:

在 Struts2 中,可以直接使用 action 的属性来接收用户的输入。为LoginAction添加 username 和 password 属性,同时实现这两个属性的getter和setter方法(这样可以直接删除 User 类):

 

Java代码  收藏代码
  1. public class LoginAction implements Action {  
  2.   
  3.       private String username;  
  4.   
  5.     private String password;  
  6.   
  7.     public String execute() throws Exception {  
  8.                // 这里直接和属性比对  
  9.         if ("zhangsan".equals(username) && "1234".equals(password)) {  
  10.             return SUCCESS;  
  11.         } else {  
  12.             return ERROR;  
  13.         }  
  14.     }  
  15.   
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.   
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.   
  24.     public String getPassword() {  
  25.         return password;  
  26.     }  
  27.   
  28.     public void setPassword(String password) {  
  29.         this.password = password;  
  30.     }  
  31. }      

4、访问request、session和application对象

4.1 与 Servlet API 解耦的访问方式

【工程4:sx_ch0304】:

Java代码  收藏代码
  1. // 获得action的执行上下文  
  2. ActionContext context = ActionContext.getContext();  
  3.   
  4. // 得到三个对象  
  5. Map request = (Map)context.get("request");  
  6. Map session = context.getSession();  
  7. Map application = context.getApplication();  
  8.   
  9. // 使用三个对象  
  10. // 在请求中放置欢迎信息  
  11. request.put("greeting""欢迎光临");  
  12.   
  13. // 在Session中保存 User 对象  
  14. session.put("user", user);  
  15.   
  16. // 统计用户访问量,在 application 中保存用户访问量数据  
  17. Integer count = (Integer) application.get("counter");  
  18. if (null == count) {  
  19.     count = 1;  
  20. else {  
  21.     count++;  
  22. }  
  23. application.put("counter", count);  

使用JSP内置的表达式语言来访问request、session和application范围的数据:

Jsp代码  收藏代码
  1. ${seesionScope.user.username},${requestScope.greeting}  
  2. ${applicationScope.counter}  

【工程5:sx_ch0305】:

利用请求对象来传递数据还有一种方式,直接使用 ActionContext 类的put()方法将数据保存到 ActionContext 中:

Jsp代码  收藏代码
  1. ActionContext.getContext().put("greeting""欢迎光临");  


然后在页面中,从请求对象中取出 greeting 属性:

Jsp代码  收藏代码
  1. ${requestScope.greeting}  

或者:

Jsp代码  收藏代码
  1. <%=request.getAttribute("greeting")%>  

【工程6:sx_ch0306】:

通过接口注入来获取request、session和application对象,

  • request:实现 RequestAware 接口,实现setRequset(Map request)方法
  • session:实现 SessionAware 接口,实现setSession(Map session)方法
  • application:实现 ApplicationAware 接口,实现setApplication(Map application)方法
Java代码  收藏代码
  1. public class LoginAction implements Action, RequestAware, SessionAware,  
  2.         ApplicationAware {  
  3.   
  4.     private User user = new User();  
  5.   
  6.     private Map request;  
  7.   
  8.     private Map session;  
  9.   
  10.     private Map application;  
  11.   
  12.     public void setRequest(Map request) {  
  13.         this.request = request;  
  14.     }  
  15.   
  16.     public void setSession(Map session) {  
  17.         this.session = session;  
  18.     }  
  19.   
  20.     public void setApplication(Map application) {  
  21.         this.application = application;  
  22.     }  
  23.   
  24.     @SuppressWarnings("unchecked")  
  25.     public String execute() throws Exception {  
  26.         if ("zhangsan".equals(user.getUsername())  
  27.                 && "1234".equals(user.getPassword())) {  
  28.   
  29.             // 在请求中放置欢迎信息  
  30.             request.put("greeting""欢迎光临");  
  31.   
  32.             // 在Session中保存 User 对象  
  33.             session.put("user", user);  
  34.   
  35.             // 统计用户访问量,在 application 中保存用户访问量数据  
  36.             Integer count = (Integer) application.get("counter");  
  37.             if (null == count) {  
  38.                 count = 1;  
  39.             } else {  
  40.                 count++;  
  41.             }  
  42.             application.put("counter", count);  
  43.   
  44.             return SUCCESS;  
  45.         } else {  
  46.             return ERROR;  
  47.         }  
  48.     }  
  49.   
  50.     public User getUser() {  
  51.         return user;  
  52.     }  
  53.   
  54.     public void setUser(User user) {  
  55.         this.user = user;  
  56.     }  
  57. }  

 

4.2 与 Servlet API 耦合的访问方式

【工程7:sx_ch0307】:

通过ServletActionContext 类来获取HttpServletRequest和ServletContext对象

  • HttpServletRequest:public static HttpServletRequest getRequest()
  • ServletContext:public static ServletContext getServletContext()

注:ServletActionContext 类并没有提供直接得到 HttpSession 对象的方法,此对象可通过 HttpServletRequest 对象的 getSession() 方法来得到。

Java代码  收藏代码
  1. import javax.servlet.ServletContext;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.http.HttpSession;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6.   
  7. import com.coderdream.model.User;  
  8. import com.opensymphony.xwork2.Action;  
  9.   
  10. public class LoginAction implements Action {  
  11.     private User user = new User();  
  12.   
  13.     @SuppressWarnings("unchecked")  
  14.     public String execute() throws Exception {  
  15.         if ("zhangsan".equals(user.getUsername())  
  16.                 && "1234".equals(user.getPassword())) {  
  17.   
  18.             HttpServletRequest request = ServletActionContext.getRequest();  
  19.             HttpSession session = request.getSession();  
  20.             ServletContext context = ServletActionContext.getServletContext();  
  21.   
  22.             // 在请求中放置欢迎信息  
  23.             request.setAttribute("greeting""欢迎光临");  
  24.   
  25.             // 在Session中保存 User 对象  
  26.             session.setAttribute("user", user);  
  27.   
  28.             // 统计用户访问量,在 application 中保存用户访问量数据  
  29.             Integer count = (Integer) context.getAttribute("counter");  
  30.             if (null == count) {  
  31.                 count = 1;  
  32.             } else {  
  33.                 count++;  
  34.             }  
  35.             context.setAttribute("counter", count);  
  36.   
  37.             return SUCCESS;  
  38.         } else {  
  39.             return ERROR;  
  40.         }  
  41.     }  
  42.   
  43.     public User getUser() {  
  44.         return user;  
  45.     }  
  46.   
  47.     public void setUser(User user) {  
  48.         this.user = user;  
  49.     }  
  50. }  

【工程8:sx_ch0308】:

还可以通过 ActionContext 类的 get() 方法,传递 ServletActionContext.HTTP_REQUEST 和 ServletActionContext.SERVLET_CONTEXT 键值来获取HttpServletRequest和ServletContext对象,同样,通过 ServletActionContext.HTTP_RESPONSE 键值来得到 HttpServletResponse 对象

 

Java代码  收藏代码
  1. import javax.servlet.ServletContext;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.http.HttpSession;  
  4.   
  5. import org.apache.struts2.ServletActionContext;  
  6.   
  7. import com.coderdream.model.User;  
  8. import com.opensymphony.xwork2.Action;  
  9. import com.opensymphony.xwork2.ActionContext;  
  10.   
  11. public class LoginAction implements Action {  
  12.     private User user = new User();  
  13.   
  14.     @SuppressWarnings("unchecked")  
  15.     public String execute() throws Exception {  
  16.         if ("zhangsan".equals(user.getUsername())  
  17.                 && "1234".equals(user.getPassword())) {  
  18.             ActionContext ctx = ActionContext.getContext();  
  19.                        // 通过键值获得对象  
  20.             HttpServletRequest request = (HttpServletRequest) ctx  
  21.                     .get(ServletActionContext.HTTP_REQUEST);  
  22.             HttpSession session = request.getSession();  
  23.             ServletContext context = (ServletContext) ctx  
  24.                     .get(ServletActionContext.SERVLET_CONTEXT);  
  25.   
  26.             // 在请求中放置欢迎信息  
  27.             request.setAttribute("greeting""欢迎光临");  
  28.   
  29.             // 在Session中保存 User 对象  
  30.             session.setAttribute("user", user);  
  31.   
  32.             // 统计用户访问量,在 application 中保存用户访问量数据  
  33.             Integer count = (Integer) context.getAttribute("counter");  
  34.             if (null == count) {  
  35.                 count = 1;  
  36.             } else {  
  37.                 count++;  
  38.             }  
  39.             context.setAttribute("counter", count);  
  40.   
  41.             return SUCCESS;  
  42.         } else {  
  43.             return ERROR;  
  44.         }  
  45.     }  
  46.   
  47.     public User getUser() {  
  48.         return user;  
  49.     }  
  50.   
  51.     public void setUser(User user) {  
  52.         this.user = user;  
  53.     }  
  54. }  

【工程9:sx_ch0309】:

最后,还可以通过 Action 类实现 ServletRequestAware 和 ServletContextAware 接口,由 Struts2 框架向 Action 实例注入 HttpServletRequest 和 ServletContext 对象:

 

Java代码  收藏代码
  1. import javax.servlet.ServletContext;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.http.HttpSession;  
  4.   
  5. import org.apache.struts2.interceptor.ServletRequestAware;  
  6. import org.apache.struts2.util.ServletContextAware;  
  7.   
  8. import com.coderdream.model.User;  
  9. import com.opensymphony.xwork2.Action;  
  10.   
  11. public class LoginAction implements Action, ServletRequestAware,  
  12.         ServletContextAware {  
  13.     private User user = new User();  
  14.   
  15.     private HttpServletRequest request;  
  16.   
  17.     private ServletContext context;  
  18.   
  19.     @SuppressWarnings("unchecked")  
  20.     public String execute() throws Exception {  
  21.         if ("zhangsan".equals(user.getUsername())  
  22.                 && "1234".equals(user.getPassword())) {  
  23.             HttpSession session = request.getSession();  
  24.   
  25.             // 在请求中放置欢迎信息  
  26.             request.setAttribute("greeting""欢迎光临");  
  27.   
  28.             // 在Session中保存 User 对象  
  29.             session.setAttribute("user", user);  
  30.   
  31.             // 统计用户访问量,在 application 中保存用户访问量数据  
  32.             Integer count = (Integer) context.getAttribute("counter");  
  33.             if (null == count) {  
  34.                 count = 1;  
  35.             } else {  
  36.                 count++;  
  37.             }  
  38.             context.setAttribute("counter", count);  
  39.   
  40.             return SUCCESS;  
  41.         } else {  
  42.             return ERROR;  
  43.         }  
  44.     }  
  45.   
  46.     public User getUser() {  
  47.         return user;  
  48.     }  
  49.   
  50.     public void setUser(User user) {  
  51.         this.user = user;  
  52.     }  
  53.   
  54.     public void setServletRequest(HttpServletRequest request) {  
  55.         this.request = request;  
  56.     }  
  57.   
  58.     public void setServletContext(ServletContext context) {  
  59.         this.context = context;  
  60.     }  
  61. }  

 

输出结果:


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值