Struts2学习(三)Web资源获取

主要介绍获取Web资源的四种方式

一、使用Struts2Aware拦截器

使用Struts2 Aware拦截器来获取web资源,首先必须是在Action中进行,然后还得实现ServletRequestAware,ServletResponseAware,ServletContextAware接口来获取对应的ServletRequestServletResponseServletContext对象。

package cn.lovepi.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by icarus on 2016/7/9.
 * 使用Struts2 aware拦截器获取web资源
 * 首先这是一个action
 * 然后得实现对应的接口来获取对应的web类
 */
public class FirstAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
    // 设置类中的对应的request和response对象和context对象
    private ServletRequest request;
    private ServletResponse response;
    private ServletContext context;
    /**
     * action执行方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {
        String username=request.getParameter("username");
        System.out.println("第一种拦截器获取资源:"+username);
        return "success";
    }

    /**
     * 设置传递到action中的ServletRequest
     * @param httpServletRequest
     */
    @Override
    public void setServletRequest(HttpServletRequest httpServletRequest) {
        request=httpServletRequest;
    }

    /**
     * 设置传递到action中的ServletResponse
     * @param httpServletResponse
     */
    @Override
    public void setServletResponse(HttpServletResponse httpServletResponse) {
        response=httpServletResponse;
    }

    /**
     * 设置传递到action中的ServletContext,即application
     * @param servletContext
     */
    @Override
    public void setServletContext(ServletContext servletContext) {
        context=servletContext;
    }
}


二、使用Struts2RequestAware拦截器

接下来使用RequestAware拦截器来获取web资源,只要实现RequestAware接口就可以了,然后实现其中的setRequest方法。不同的是,这里将ServletRequestServletResponseServletContext对象放置在了一个集合当中,需要使用Struts2当中的key值来获取对应的对象。


package cn.lovepi.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.interceptor.RequestAware;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.Map;

/**
 * Created by icarus on 2016/7/9.
 * 使用RequestAware拦截器获取web资源
 * 需要实现RequestAware接口
 */
public class SecondAction extends ActionSupport implements RequestAware{
    private ServletResponse response;
    private ServletRequest request;
    private ServletContext context;

    /**
     * 对应action方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {
        String username=request.getParameter("username");
        System.out.println("第二种方法获取web资源:"+username);
        return "success";
    }

    /**
     * 获取对应的web资源,使用map集合方式
     * 即键值对获取
     * @param map
     */
    @Override
    public void setRequest(Map<String, Object> map) {
        request= (ServletRequest) map.get(StrutsStatics.HTTP_REQUEST);
        response= (ServletResponse) map.get(StrutsStatics.HTTP_RESPONSE);
        context= (ServletContext) map.get(StrutsStatics.SERVLET_CONTEXT);
    }
}


三、使用Struts2内置静态对象ActionContext

这种方式来获取web资源并不需要实现任何的接口


package cn.lovepi.chapter03.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Created by icarus on 2016/7/9.
 * Struts2获取web资源对象第三种方法
 * 使用Struts2内置静态对象ActionContext
 * 使用这种方式不需要实现任何的接口
 * -----------------------------------
 * 注:HttpServlet只是Servlet的子类
 */
public class ThirdAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        ActionContext ac=ActionContext.getContext();
        ServletRequest request= (ServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
        ServletContext context= (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT);
        ServletResponse response= (ServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE);
        String username=request.getParameter("username");
        System.out.println("第三种方式:"+username);
        return "success";
    }
}

四、使用Struts2内置静态对象ServletActionContext

这是最简单最多使用的方法


package cn.lovepi.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by icarus on 2016/7/9.
 * Struts2获取web资源的第四种方式
 * 使用Struts2内置对象ServletActionContext
 * 这是四种方法中最好的方式
 * 不需要实现任何接口,也可以按照需求获取所需的对象
 */
public class FourthAction extends ActionSupport{
    @Override
    public String execute() throws Exception {
        ServletRequest request= ServletActionContext.getRequest();
        ServletResponse response=ServletActionContext.getResponse();
        ServletContext context=ServletActionContext.getServletContext();
        String username=request.getParameter("username");
        System.out.println("第四种方式:"+username);
        return "success";
    }
}

总结:

       通过四种方法都可以获取到对应的web资源,但是使用Aware拦截器需要实现对应的接口才可以获取到对应的资源,而使用RequestAware则只需实现一个接口便可以获取到所有的web资源对象。对于使用Struts2内置的静态对象来获取Web资源来说并不需要实现任何的接口,相比较与前两种使用拦截器的方式来说,使用内置静态对象的方式更值得推荐。而在后两种方式中:使用内置对象ActionContext返回的是一个map集合,得需要使用对应的key来获取所需的资源对象。而ServletActionContext则可以根据不同的方法直接获取对应的web资源对象。

       虽然使用内置对象ServletActionContext的方式来获取Web资源是最好的方式,值得推荐。但是,我们也得了解前三种获取web资源的方式,因为在某些项目中可能会遇到别人使用前三种方式来获取web资源。但在日常的开发中我们必须得熟练掌握第四种获取web资源的方式,即ServletActionContext方式。


补充说明:

        ServletContext,也就是Application,服务器对象,只要服务器不关闭,这个对象就永远存在。该信息是存储与服务器中的,一般数据我们是严禁存储到application对象中去的,因为这样很容易导致服务器内存溢出,程序崩溃。

       他的实际应用场景是:在驾校考试系统中,用户只需要注册就可以免费答题,用户量庞大。而在页面中每次只出现一道题,答完之后显示下一道。假如我们每次的数据处理如下图所示:


如上图所示,我们在这里使用到了Application对象来存储对应的题目信息,这样省去了我们每次都去数据库中获取下一道题目的步骤。在这种情况下,系统一启动就从数据库中获取全部的题目信息保存到Application对象中去,然后用户只需访问ServletContext就好,然后直接在界面中显示对应的Application中的数据就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值