1. 响应参数---作用域传值
1.1.紧耦方式
使用的是servlet的api,在struts2中使用ServletActionContext.getRequest()来获取Request,然后根据Request获取session和application。
Action:
public class LoginAction extends ActionSupport { // 通过对象方式取得到前台页面的数据 private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
/** * 登录方法 */ public String login() { // 紧藕方式:通过servletAPI HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("user", user); // session HttpSession session = request.getSession(); session.setAttribute("user", user);
// application ServletContext application = request.getServletContext(); application.setAttribute("user", user);
if ("admin".equals(user.getName())) { return SUCCESS; } else { return ERROR; } } } |
Struts.xml
<struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.bjsxt.action.LoginAction" method="login"> <!-- result name属性表示action中的返回值 type属性表示跳转方式 doLogin表示是一个Action。此时的Action:并不是指的某一个特定方法, 而是同<action> 标签创建出来的name为doLogin的<action> --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts> |
Login.jsp
<body> <center> <h1>登录</h1> <form action="login.action" method="post"> userName: <input type="text" name="user.name"/><br> password: <input type="password" name="user.pwd"><br> <!-- springMVC 和 struts2 一个道理!都是通过对象.调用 --> address: <input type="text" name="user.adr.name"><br> <input type="submit" value="login"/> </form> </center> </body> |
Success.jsp
<body> <center> <h1 style="color: red"> 登录成功@!</h1> <h2 style="color: blue;">request:${requestScope.user.name } </h2> <h2 style="color: blue;">session:${sessionScope.user.name } </h2> <h2 style="color: blue;">application:${applicationScope.user.name } </h2> </center> </body> |
1.2.解耦方式
是struts2的上下文对象,本质是一个容器也是一个map对象,ActionContext对象贯穿整个action的生命周期,每次接收请求后都会创建一个actioncontext对象,将servletAPI存入actionContext对象中,从而实现struts2与servlet解耦。使得测试可以不依赖于容器。而且ActionContext是线程安全的。由于每次访问都创建一个ActionContext对象,所以执行效率比servlet较低,它是一个基于类的请求。
Action:
public String login1() { // 取得request对象 Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get("request"); request.put("user", user); // 解耦方式取得到session 返回一个Map集合。session作用域中就包含request作用域中的值! Map<String, Object> session = ActionContext.getContext().getSession(); session.put("user", user); // 使用解耦方式取得application Map<String, Object> application = ActionContext.getContext().getApplication(); application.put("user", user); if ("admin".equals(user.getName())) { return SUCCESS; } else { return ERROR; } } |
Struts.xml
<action name="login1" class="com.bjsxt.action.LoginAction" method="login1"> <!-- result name属性表示action中的返回值 type属性表示跳转方式 doLogin表示是一个Action。此时的Action:并不是指的某一个特定方法, 而是同<action> 标签创建出来的name为doLogin的<action> --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> |
login.jsp success.jsp 同上!login.jsp中的action修改为login1.action
1.3.接口注入方式
其实是struts2提供的一系列接口,实现该接口后,可以获取Request、session、application
public class LoginAction extends ActionSupport implements ServletRequestAware{} |
Action:
public class DoLoginAction extends ActionSupport implements ServletRequestAware {
// 声明一个user对象 private User user; // 使用接口注入必须要创建一个HttpServletRequest对象 private HttpServletRequest request;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public HttpServletRequest getRequest() { return request; }
public void setRequest(HttpServletRequest request) { this.request = request; }
@Override public void setServletRequest(HttpServletRequest request) { this.request = request; }
public String login2() { if ("admin".equals(user.getName())) { return SUCCESS; } else { return ERROR; } } } |
Struts.xml
<!-- 配置接口注入 --> <action name="login2" class="com.bjsxt.action.DoLoginAction" method="login2"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> |
Login.jsp --- 需要修改action为login2.action。其他不变