您的位置:首页 > 编程语言 > Java开发

struts2响应参数——作用域传值:紧耦、解耦方式;接口注入方式

2017-09-19 11:01 399 查看

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。其他不变
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: