Web Servlet API访问毕竟不是直接获得Servlet API的实例

前言

Struts2框架的设计初衷就是各种解耦,所以,Struts2的Action没有与任何Servlet API耦合,这样带来的好处就是我们在测试Action时会更加的简单、方便;但是话又说回来了,对于Web应用的控制器而言(Action是控制器),不访问Servlet API几乎是不可能的,而Action并没有那么“轻易”让你去使用Servlet API。

在Action中如果想要使用Servlet API,基本上只有以下三种方法:

  • 通过ActionContext类访问
  • Action直接访问
  • 通过ServletActionContext访问

这篇文章就对这三种方法进行总结。

通过ActionContext类访问

Struts2提供了ActionContext类,Struts2的Action可以通过该类来访问Servlet API。下面是ActionContext类中几个常用的方法:

  • Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(String name)方法
  • Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例
  • static ActionContext getContext():静态方法,获取系统的ActionContext实例
  • Map getParameters():获取所有的请求参数;类似于调用HttpServletRequest对象的getParameterMap()方法
  • Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例
  • void setApplication(Map application):直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名、属性值
  • void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名、属性值

下面通过一个简单的实例来说明如何使用 ActionContext 。

public String execute() throws Exception
{
    if (getUserName() == null || getPassword() == null)
    {
        return INPUT;
    }

    // 获取ActionContext对象
    ActionContext ac = ActionContext.getContext();

    // 通过ActionContext访问application范围的属性值
    Integer counter = (Integer)ac.getApplication().get("counter");
    if (counter == null)
    {
        counter = 1;
    }
    else
    {
        counter += 1;
    }

    // 通过ActionContext设置application范围的属性
    ac.getApplication().put("counter", counter);

    if (getUserName().equals("jellythink")
            && getPassword().equals("123456"))
    {
        ActionContext.getContext().getSession().put("user", getUserName());
        ac.put("tip", "服务器提示:您已经成功登陆");
        return SUCCESS;
    }
    else
    {
        ac.put("tip", "服务器提示:登陆失败");
        return ERROR;
    }
}

通过前台JSP页面,我们可以访问这些属性值:

<body>
    本站访问次数为:${applicationScope.counter}<br/>
    ${sessionScope.user},您已登陆!<br/>
    ${requestScope.tip}
</body>

通过 ActionContext 这种方法访问的前提是必须先要获取 ActionContext 对象,它彻底的与Servlet API进行了分离,使用这种方法简单易用。

Action直接访问

虽然Struts2提供了 ActionContext 来访问Servlet API,但这种访问毕竟不是直接获得Servlet API的实例,为了可以在Action中直接访问Servlet API,Struts2还提供了以下几个接口:

接口名称 接口说明
ServletContextAware 实现该接口的Action可以直接访问Web应用的ServletContext实例
ServletRequestAware 实现该接口的Action可以直接访问Web应用的HttpServletRequest实例
ServletResponseAware 实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例

下面通过一段简单的代码来说说这几个接口的具体使用:

public class LoginAction extends ActionSupport 
                        implements ServletResponseAware, ServletRequestAware, ServletContextAware
{
    private String userName;
    private String password;
    private HttpServletResponse response;
    private HttpServletRequest request;
    private ServletContext sc;

// 实现ServletResponseAware接口的方法,设置response属性值
public void setServletResponse(HttpServletResponse response)
{
    this.response = response;
}

// 实现ServletRequestAware接口的方法,设置request属性值
public void setServletRequest(HttpServletRequest request)
{
    this.request = request;
}

// 实现ServletContextAware接口的方法,设置sc属性值
public void setServletContext(ServletContext sc)
{
    this.sc = sc;
}

// ......

public String execute() throws Exception
{
    // ......   
    Integer counter = (Integer)sc.getAttribute("counter");
    if (counter == null)
    {
        counter = 1;
    }
    else
    {
        counter += 1;
    }

    sc.setAttribute("counter", counter);

    if (getUserName().equals("jellythink")
            && getPassword().equals("123456"))
    {
        HttpSession session = request.getSession();
        session.setAttribute("user", getUserName());
        request.setAttribute("tip", "服务器提示:您已经成功登陆");
        return SUCCESS;
    }
    else
    {
        request.setAttribute("tip", "服务器提示:登陆失败");
        return ERROR;
    }
}

这种方法使用起来也比较方便,但是必须要实现对应的三个接口。

通过ServletActionContext访问

上面的两种方法要么不是直接访问Servlet API,要么就是需要继承其它的接口。为了能直接访问Servlet API,Struts2还提供了一个ServletActionContext工具类,该工具类提供了以下几个静态方法:

声明 说明
static PageContext getPageContext() 取得Web应用的PageContext对象
static HttpServletRequest getRequest() 取得Web应用的HttpServletRequest对象
static HttpServletResponse getResponse() 取得Web应用的HttpServletResponse对象
static ServletContext getServletContext() 取得Web应用的ServletContext对象

通过 ServletActionContext 工具类,我们就无需实现接口,就可以直接访问Servlet API,但是这样会加强了Action和Servlet API的耦合,不利于Action的再利用。

总结

上面介绍的这三种方法各有各的有点,具体如下:

方法 优点 缺点
通过ActionContext类访问 Action和Servlet API完全解耦 并不能调用原生的Servlet API
Action直接访问 可以调用原生的Servlet API 需要实现对应的接口
通过ServletActionContext访问 可以调用原生的Servlet API 增加了耦合

基于此,在实际开发过程中,就看你喜欢用哪种了。反正我喜欢用 Action直接访问 这种方式,虽然需要实现对应的接口,但是还是比较方便的。

果冻想-一个原创技术文章分享网站。

2016年01月23日 于呼和浩特。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java Web应用程序中,我们访问Servlet API有以下几种方法: 1. 在Servlet中使用内置对象request和response来访问Servlet API。 2. 在Servlet中使用getServletContext()方法来获取ServletContext对象,然后使用该对象来访问Servlet API。 3. 在JSP页面中使用内置对象request和response来访问Servlet API。 4. 在JSP页面中使用内置对象application来获取ServletContext对象,然后使用该对象来访问Servlet API。 5. 在过滤器中使用内置对象request和response来访问Servlet API。 6. 在监听器中使用内置对象servletContextEvent来获取ServletContext对象,然后使用该对象来访问Servlet API。 这些方法可以帮助我们在Java Web应用程序中访问Servlet API。 ### 回答2: 在Java中,访问Servlet API的方式有以下几种方法: 1. 继承HttpServlet类:创建一个继承自HttpServlet的类,并重写其中的doGet、doPost等方法来处理不同的HTTP请求。然后在web.xml配置文件中将该Servlet映射到相应的URL地址,当请求到达该URL时,容器会调用对应的Servlet类来处理请求。 2. 实现Servlet接口:创建一个实现Servlet接口的类,并实现其中的方法。然后通过web.xml配置文件中的servlet元素和servlet-mapping元素来将该类映射到URL地址,从而使得请求到达时,容器会调用该类来处理请求。 3. 注解方式:可以使用@WebServlet注解来定义一个Servlet类,并通过urlPatterns属性指定该Servlet要处理的URL地址。这种方式不需要在web.xml中显式配置,容器会根据注解自动进行映射。 上述三种方式都可以实现对Servlet API访问,具体选择哪种方式取决于个人偏好和项目需求。 ### 回答3: Action访问Servlet API有以下几种方法: 1. 通过继承HttpServlet类:Action可以继承HttpServlet类,从而获得访问Servlet API的能力。使用这种方式,需要重写doGet()、doPost()等方法来处理请求,并可以通过request和response对象获取请求参数和发送响应。 2. 通过实现Servlet接口:Action可以实现Servlet接口,在该接口的service()方法中处理请求,并通过ServletRequest和ServletResponse对象访问Servlet API。与继承HttpServlet类相比,这种方式需要自己处理请求的分发和HTTP请求方法的判断。 3. 通过注入Servlet API对象:Action可以通过依赖注入的方式,在构造函数或者通过属性注入ServletRequest和ServletResponse对象,从而获取访问Servlet API的能力。这种方式适合于使用框架来管理Action实例的情况,可以方便地使用Servlet API的各种方法。 4. 通过Servlet容器提供的API:Action可以通过访问ServletContext对象来获取其他Servlet的信息,包括路径、初始化参数等。此外,也可以通过访问HttpSession对象来获取或设置会话信息。 总之,Action访问Servlet API的方式主要有继承HttpServlet类、实现Servlet接口、注入Servlet API对象和通过Servlet容器提供的API。根据具体的需求和项目情况,可以选择合适的方式来访问Servlet API

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值