Structs中Action访问ServletAPI的几种方式

本文介绍了在Struts2框架中通过四种不同的方法访问Servlet API的方式,包括利用ActionContext、实现特定接口、使用ServletActionContext及实现ServletRequestAware接口。文章通过具体示例展示了如何在Action类中设置和获取request、session及application的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


夏夜


http://newleague.iteye.com/blog/1139100这里讲了四种方法
我把他的一部分转过来

Action访问ServletAPI的四种方式

  1. 通过ActionContext来访问request,session,application对象
  2. 通过实现RequestAware,SessionAware,ApplicationAware接口来访问request,session,application对象
  3. 通过ServletActionContext来访问request,session,application对象
  4. 通过实现ServletRequestAware接口来访问request,session,application对象

ServletRequestAware接口是RequestAware,SessionAware,ApplicationAware的子接口

方式一

    /** 
     * 通过ActionContext来访问request,session,application对象 
     * @author 健 
     */  
    public class UserAction1 extends ActionSupport{  
        /** 
         * 序列化 
         */  
        private static final long serialVersionUID = 1L;  
        /** 
         * request 
         */  
        private Map <String,Object>request;  
        /** 
         * session
         */  
        private Map <String,Object>session;  
        /** 
         * application 
         */  
        private Map <String,Object>application;  
        /** 
         * 添加用户  
         * @return 用户是否添加成功 
         */  
        @SuppressWarnings("unchecked")  
        @Override  
        public String execute(){  
            System.out.println("通过ActionContext来访问request,session,application对象");  
            // 初始化  
            request = (Map<String,Object>)ActionContext.getContext().get("request");  
            session = ActionContext.getContext().getSession();  
            application = ActionContext.getContext().getApplication();  
            // 赋值  
            request.put("requestKey", "requestValue");  
            session.put("sessionKey", "sessionValue");  
            application.put("applicationKey", "applicationValue");  
            return "success";  
        }  
    }  
ActionContext context = ActionContext.getContext(); 
context.put(key,value);//request可以快速的赋值

方式二

    /** 
     * 通过实现RequestAware、SessionAware、ApplicationAware接口来访问request,session,application对象 
     * @author 健 
     */  
    public class UserAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{  
        /** 
         * 序列化 
         */  
        private static final long serialVersionUID = 1L;  
        /** 
         * request 
         */  
        private Map <String,Object>request;  
        /** 
         * response 
         */  
        private Map <String,Object>session;  
        /** 
         * application 
         */  
        private Map <String,Object>application;  
        /** 
         * 控制器 
         */  
        @SuppressWarnings("unchecked")  
        @Override  
        public String execute(){  
            System.out.println("通过实现RequestAware、SessionAware、ApplicationAware接口来访问request,session,application对象");  
            // 赋值  
            request.put("requestKey", "requestValue");  
            session.put("sessionKey", "sessionValue");  
            application.put("applicationKey", "applicationValue");  
            return "success";  
        }  
        /*  
         * 实现RequestAware中的方法 
         */  
        @Override  
        public void setRequest(Map<String, Object> request) {  
            this.request = request;  
        }  
        /*  
         * 实现ApplicationAware中的方法 
         */  
        @Override  
        public void setApplication(Map<String, Object> application) {  
            this.application = application;  
        }  
        /*  
         * 实现SessionAware中的方法 
         */  
        @Override  
        public void setSession(Map<String, Object> session) {  
            this.session = session;  
        }  
    }  

方式三

/** 
 * 通过ServletActionContext来访问request,session,application对象 
 * @author 健 
 */  
public class UserAction3 extends ActionSupport{  
    /** 
     * 序列化 
     */  
    private static final long serialVersionUID = 1L;  
    /** 
     * request 
     */  
    private HttpServletRequest request;  
    /** 
     * response 
     */  
    private HttpSession session;  
    /** 
     * application 
     */  
    private ServletContext application;  
    /** 
     * 控制器 
     */  
    @SuppressWarnings("unchecked")  
    @Override  
    public String execute(){  
        System.out.println("通过ServletActionContext来访问request,session,application对象");  
        // 初始化  
        request = ServletActionContext.getRequest();  
        session = request.getSession();  
        application = session.getServletContext();  
        // 赋值  
        request.setAttribute("requestKey", "requestValue");  
        session.setAttribute("sessionKey", "sessionValue");  
        application.setAttribute("applicationKey", "applicationValue");  
        return "success";  
    }  
}  

方式四

    /** 
     * 通过实现ServletRequestAware接口来访问request,session,application对象 
     * @author 健 
     */  
    public class UserAction4 extends ActionSupport implements ServletRequestAware{  
        /** 
         * 序列化 
         */  
        private static final long serialVersionUID = 1L;  
        /** 
         * request 
         */  
        private HttpServletRequest request;  
        /** 
         * response 
         */  
        private HttpSession session;  
        /** 
         * application 
         */  
        private ServletContext application;  
        /** 
         * 控制器 
         */  
        @SuppressWarnings("unchecked")  
        @Override  
        public String execute(){  
            System.out.println("通过实现ServletRequestAware接口来访问request,session,application对象");  
            // 赋值  
            request.setAttribute("requestKey", "requestValue");  
            session.setAttribute("sessionKey", "sessionValue");  
            application.setAttribute("applicationKey", "applicationValue");  
            return "success";  
        }  
        /*  
         * 实现ServletRequestAware接口中的方法 
         */  
        @Override  
        public void setServletRequest(HttpServletRequest request) {  
            this.request = request;  
            this.session = request.getSession();  
            this.application = session.getServletContext();  
        }  
    }  

我的测试

01 ActionContext
02实现requestAware sessionAware applicationAware
03 ServletActionContext

1.使用ActionContext在Action中传递数据

Action中发送数据到jsp页面

public class ActionandServletAPITest extends ActionSupport {

    @Override
    public String execute() throws Exception {
        ActionContext context = ActionContext.getContext(); 
        context.getApplication().put("application", "这是application的值");
        context.getSession().put("sesion1", "这是session1的值");//application.setAttribute()
        context.put("message", "耳机的线");//session.setAttribute()

        /*context.put("message","message");//request.setAttribute()     
        Map<String, Object> session = context.getSession();
        session.put("sesion1", "这是session1的值");//session.setAttribute()*/
        return SUCCESS;
    }   
}
<action name="servlet" class="com.struts2.action.ActionandServletAPITest">
            <result>/servlet.jsp</result>
</action>

servlet.jsp

<%
    request.setCharacterEncoding("UTF-8");
    String msg= request.getAttribute("message").toString();
%>
...
    message的值为:<%=msg %>
    message的值为:${message}
    session1的值:${sesion1 }

执行结果:

message的值为:耳机的线 message的值为:耳机的线 session1的值:这是session1的值 

Action中接收 jsp页面传递过来的数据,接收session的值,request的属性的值,测试为null,因为请求都会重新产生一个request对象,会丢失参数,即action里的request和jsp中request对象不相同

还有测试接收jsp页面的请求参数,就是form表单的<form action="LoginAction.action?userid=失恋哲理" method="post">的userid值

jsp页面

<%
    request.setAttribute("loginmsg1", "这是login发送给的消息1");
     session.setAttribute("loginmsg2", "这是login发送给的消息2");
%>
..
<form action="LoginAction.action?userid=失恋哲理" method="post">    
        <input type="submit" value="提交"/>
</form>

接收数据的Action,用到了多种方式,主要测试多种方式能不能得到request的属性值,因为request的对象不同,都是获取不到的

LoginAction.java

//package com.struts2.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    public String login(){

        ActionContext context = ActionContext.getContext();
        //获取jsp页面的request属性值 01
        Object msg1 = context.get("loginmsg1");//null

        //获取jsp页面设置的session的值
        Map<String, Object> session  = context.getSession();
        Object msg2 = session.get("loginmsg2");
        System.out.println("msg1的值"+msg1+"\n"+"msg2的值"+msg2);

        //获取jsp页面from表单的请求参数userid 01
        Map params = context.getParameters();
        String[]  usermsg =  (String[]) params.get("userid");   
        System.out.println("userid值:"+usermsg[0]);

        HttpServletRequest request =(HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);

        //获取jsp页面from表单的请求参数userid 02
        String useridmsg = request.getParameter("userid");
        System.out.println("useridmsg值:"+useridmsg);

        //获取jsp页面的request属性值 02
        String loginmsg1 = (String) request.getAttribute("loginmsg1");
        System.out.println("loginmsg1的值"+loginmsg1);//null

        //获取jsp页面的request属性值 03 这是ServletActionContext方式
        HttpServletRequest request1 = ServletActionContext.getRequest();
        String loginmsg11 = (String) request1.getAttribute("loginmsg1");

        return SUCCESS;
    }
}

执行结果:

十一月 13, 2016 5:54:53 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1637 ms
msg1的值null
msg2的值这是login发送给的消息2
userid值:失恋哲理
useridmsg值:失恋哲理
loginmsg1的值null
loginmsg1的值null

2通过实现RequestAware,SessionAware,ApplicationAware接口

//package com.struts2.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class TestAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {

    private Map<String, Object> request;
    private Map<String, Object> application;
    private Map<String, Object> session;

    @Override
    public String execute() throws Exception {
        //赋值
        request.put("requestmsg", "RequestAware的运用");
        session.put("sessionmsg", "SessionAware的运用");
        application.put("applicationmsg", "application的运用");
        return SUCCESS;
    }

    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;     
    }

    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;     
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this. session = session;        
    }   
}
<action name="testaction" class="com.struts2.action.TestAction">
            <result>/servlet.jsp</result>
</action>

servlet.jsp页面获取值

requestmsg的值:${requestmsg}
sessionmsg的值:${sessionmsg}
applicationmsg的值:${applicationmsg}

结果:

requestmsg的值:RequestAware的运用 sessionmsg的值:SessionAware的运用 applicationmsg的值:application的运用 

3 使用ServletActionContext

//方式一
HttpServletRequest request2 = ServletActionContext.getRequest();
String loginmsg11 = (String) request2.getAttribute("loginmsg1");

HttpSession session2 = request2.getSession();
session2.getAttribute("..")

//方式二
ActionContext context = ActionContext.getContext();
HttpServletRequest request =(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);
//HTTP_RESPONSE 也可以是response
String useridmsg = request.getParameter("userid");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值