Struts2 访问request session application对象 。

Struts2提供了了多种方式来访问上述的三种现象,归结起来,可以划分为两大类:与Servlet API 解耦的访问方式和与Servlet API耦合的访问方式。


一. 与Servlet API 解耦的访问方式

    为了避免与Servlet API 耦合在一起,方便Action类做单元测试,Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest,HttpSession和ServletContext对应的Map对象来保存和读取数据。

    要获取这三个对象,可以使用com.opensymphont.xwork2.ActionContext类。

     ActionContext是action执行的上下文,在ActionCOntext中保存了action执行所需的一组对象,包括parameters,request,session,application和locale等。ActionContext类定义了如下方法,用于获取HttpServletRequest,HttpSession和ServletContext对应的Map对象。

    01.public Object get(Object key)

      ActionContext类没有提供类似getRequest()这样的方法来过去封装了HttpServletRequest的Map对象。要得到请求Map对象,你需要为get()方法传递参数“request”。

    02.public Map getSession()

     获取封装了HttpSession的Map对象。

    03.public Map getApplication()

    获取封装了ServletCOntext的Map对象。



案例:登录进入成功页面,显示用户名。


package cn.action;

import cn.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.ServletActionContext;

import java.util.Map;

/**
 * Created by micro on 2017/10/21.
 */
public class LoginAction implements Action,ModelDriven{

    private User user=new User();


    public String execute() throws Exception {
        if ("admin".equals(user.getName())&&"123".equals(user.getPassword())){

            //解耦方式
            ActionContext context = ActionContext.getContext();
            //request
            Map request= (Map)context.get("request");
             //application
            Map<String, Object> application = context.getApplication();
           //session
Map<String, Object> map = context.getSession();
      map.put("uname",user.getName());        
    //值栈 页面直接用  ${uname} 获取值         
   //方式一:   
         /*ValueStack valueStack = context.getValueStack();     
       valueStack.push(map);*/       
     //方式二:     
       HttpServletRequest request = ServletActionContext.getRequest();    
        ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack"); 
           vs.push(map);     
                return "success";  
      }        return "input";   
 }   
 public User getUser() {    
    return user;   
 }   
 public void setUser(User user) {   
     this.user = user;  
  }   
 public Object getModel() {   
     return user;   
 } 
 }


struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.devMode" value="true"/>

    <package name="default" namespace="/" extends="struts-default">    

        <action name="loginAction" class="cn.action.LoginAction">
            <result name="success">/success.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
    </package>

</struts>








login.jsp

<%@page language="java" contentType="text/html; utf-8" %>
<%@taglib uri="/struts-tags" prefix="s"%>
<title>登录</title>
<html>
<body>
<s:form name="form1" namespace="/" method="POST" action="loginAction">
    用户名:<s:textfield name="name"></s:textfield>
    密码:  <s:textfield name="password"></s:textfield>
    <s:submit value="登录"></s:submit>
</s:form>
</body>
</html>






success.jsp




<%@page language="java" contentType="text/html; utf-8" isELIgnored="false" %>
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<body>

<!--方式一:-->
<s:property value="#session.uname"/>

<!--方式二: 值栈-->
${uname}


</body>
</html>



除了利用ActionContext‘来获取request,session和application对象这种方式,Action类可以实现某些特定的接口,让Struts2框架在运行是向Action实例注入request,session和application对象。与之对应的三个接口和它们的方法如下:



二.与Servlet API 耦合的方式



public class LoginAction implements Action,ModelDriven{

    private User user=new User();

    
    public String execute() throws Exception {
        if ("admin".equals(user.getName())&&"123".equals(user.getPassword())){

      

            //耦合方式一:
          
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("uname",user.getName());

            ServletContext servletContext = ServletActionContext.getServletContext();
            servletContext.setAttribute("unames",user.getName());
return "success";
    }    
   return "input";  
  }  
  public User getUser() {     
   return user;  
  }  
  public void setUser(User user) {     
   this.user = user;  
  }   
 public Object getModel() {   
     return user;  
  }





package cn.action;

import cn.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


/**
 * Created by micro on 2017/10/21.
 */
public class LoginAction implements Action,ModelDriven,ServletRequestAware,ServletContextAware {

    private User user=new User();

    HttpServletRequest request;
    ServletContext context;

    public String execute() throws Exception {
        if ("admin".equals(user.getName())&&"123".equals(user.getPassword())){         

            //耦合方式二:实现ServletRequestAware接口  给request对象赋值 ServletContextAware接口给contest对象注入
            HttpSession session = request.getSession();
            session.setAttribute("uname",user.getName());


            return "success";
        }
        return "input";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Object getModel() {
        return user;
    }

    public void setServletRequest(HttpServletRequest httpServletRequest) {

        this.request=httpServletRequest;
    }

    public void setServletContext(ServletContext servletContext) {
        this.context=servletContext;
    }
}

总结:

直接用action对象接收用户输入的数据,分别是Servlet API 解耦方式和Servlet API 耦合方式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值