在Struts中Action访问Servlet API

原创 2007年10月09日 17:48:00

 最近在读一本市面上刚有得卖的新书:李刚著的《Struts 2权威指南》,感觉写得非常好,于是就参考该书作了一个关于在Struts中Action访问Servlet API案例。如下:

Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,从而能更轻松的测试该Action。
但对于Web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。Struts2框架提供了一种更轻松的方式来访问Servlet API。Web应用中通常需要访问的Servlet API就是HttpServletRequest,HttpSession和ServletContext,这三个类分别代表JSP内置对象中的request,session和appliaction。
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的属性名、属性值。
下面的应用将在Action类中通过ActionContext访问Servlet API。以登陆页面为示例。
当单击登陆页面中的“登陆”按钮时,系统将提交到login.action,该Action对应的Action处理类为:

//处理用户请求的Action类
public class LoginAction implements Action
...{
    
//封装用户请求参数的username和password属性
        private String username;
        
private String password;
    
//username属性对应的setter和getter方法
        public String getUsername()
    
...{
            
return username;
        }

        
public void setUsername(String username)
    
...{
            
this.username = username;
        }

    
//password属性对应的setter和getter方法
        public String getPassword()
    
...{
            
return password;
        }

        
public void setPassword(String password)
    
...{
            
this.password = password;
       }

    
//下面是处理用户请求的execute方法
        public String execute() throws Exception
    
...{
        
//获取ActionContext实例,通过该实例访问Servlet API。
            ActionContext ctx = ActionContext.getContext();
        
//获取ServletContext里的counter属性
        Integer counter = (Integer)ctx.getApplication().get("counter");
        
//如果counter属性为null,设置该conter属性为1
        if (counter == null)
        
...{
            counter 
= 1;
        }

        
//否则,将counter加1

else
        
...{
            counter 
= counter + 1;
        }

        
//将增加1后的counter值设置成counter属性
        ctx.getApplication().put("counter" , counter);
        
//将登陆用的username属性设置成一个HttpSession属性
        ctx.getSession().put("user" , getUsername());
        
//如果用户名为scott,密码为tiger
            if (getUsername().equals("scott")
                 
&& getPassword().equals("tiger") )
        
...{
            
//直接设置HttpServletRequest属性,下面代码的作用类似于设置HttpServletRequest属性
            
//request.setAttribute("tip" , "服务器提示:您已经成功的登陆");
            ctx.put("tip" , "服务器提示:您已经成功的登陆");
                
return SUCCESS;
            }

        
else
        
...{
            
//直接设置HttpServletRequest属性
            ctx.put("tip" , "服务器提示:登陆失败");
                
return ERROR;
            }

    }

}

上面的Action访问了HttpServletRequest的属性,也访问了HttpSession属性,还访问了ServletContext属性。将该Action配置在struts.xml文件中,struts.xml文件的代码如下:

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
>
<!-- 配置文件的根元素 -->
<struts>
        
<package name="lee" extends="struts-default">
        
<!-- 定义名为login的Action,其实现类为lee.LoginAction -->
            
<action name="login" class="lee.LoginAction">
                
<result name="error">/error.jsp</result>
                
<result name="success">/welcome.jsp</result>
            
</action>
        
</package>
</struts>

如果浏览者在登陆页面中的“用户名”输入框中输入scott,“密码”输入框中输入tiger,将提交给LoginAction处理,该Action的execute方法分别设置了HttpServletRequest属性、HttpSession属性和ServletContext属性。为了验证是否成功设置了这三个属性,下面在welcome.jsp页面中访问这三个对象里的属性。下面是welcome.jsp页面的代码。

<%@ page language="java" contentType="text/html; charset=GBK"%>
<html>
        
<head>
        
<title>成功页面</title>
    
</head>
<body>
        
<!-- 通过表达式访问ServletContext对象的属性 -->
        本站访问次数为:$
...{applicationScope.counter}<br>
        
<!-- 通过表达式访问HttpSession对象的属性 -->
           $
...{sessionScope.user},您已经登录!<br>
        
<!-- 通过表达式访问HttpServletRequest对象的属性 -->
        $
...{requestScope.tip}
        
</body>
</html>
Action的execute方法返回success的字符串,系统将进入welcome.jsp页面。
显然,相比Struts1中直接访问Servlet API,Struts2通过ActionContext访问Servlet API更加优雅:让Action彻底从Servlet API中分离出来,从而可以允许该Action脱离Web容器运行。最大的好处就是:可以脱离Web容器测试Action。

Struts2中Action访问Servlet API的三种方法

在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到这两...
  • chq00788
  • chq00788
  • 2014-02-27 10:38:21
  • 4380

Struts2中访问ServletAPI的四种方式

一:  使用Struts2中ActionContext(Action的上下文)解耦和的方式  package cn.mldn.controller; import java.util.Ma...
  • pangqiandou
  • pangqiandou
  • 2017-06-06 20:35:48
  • 308

Struts2中访问Servlet API的几种方式

Struts2中访问Servlet API的几种方式
  • VipMao
  • VipMao
  • 2016-04-12 12:48:50
  • 1978

Struts2访问ServletAPI的三种方式,以及使用推荐对比

Action对ServletAPI的访问有两种方式,分别是间接访问和直接访问。 对于间接访问,一般推荐使用,但是只能获得request对象,而得不到response对象; 直接访问分为Ioc访问方...
  • qq_30179189
  • qq_30179189
  • 2016-07-12 16:34:02
  • 1494

Struts2访问Servlet的三种方式

Struts2访问Servlet的三种方式 基本介绍      在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet AP...
  • q547550831
  • q547550831
  • 2016-11-24 19:56:37
  • 3550

Struts2访问Servlet API的三种方式

Servlet API的方法和类 Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问ServletAPI。下面是ActionContext类中包含的...
  • fumier
  • fumier
  • 2015-04-19 20:04:11
  • 2544

struts2中Action访问servlet的两种方式

一、IoC方式                在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口:        a. ...
  • leimengyuanlian
  • leimengyuanlian
  • 2014-07-26 21:11:37
  • 9118

Action 中访问servletAPI的方式总结

在Struts2的框架中,Action与Servlet API相互分离,这是Struts2相对于Struts1的一个优化之处。相互分离 的好处就是便于测试action,但是这样的话,Action...
  • u012788601
  • u012788601
  • 2016-07-06 17:57:33
  • 625

Struts2获取servletAPI的几种方式

struts2有两种方式获取servletAPI:非IOC方式和IOC方式 一、非IOC方式 ·struts2提供了一个ActionContext类,struts2可以通过该类来访问servletA...
  • u011936251
  • u011936251
  • 2017-06-18 17:08:17
  • 1185

在Action中使用Servlet API

1.在action中以解耦合的方式来访问Servlet API——–使用ActionContext对象 在Struts2中Action API 已经与Servlet API解耦合了 Servlet...
  • znwnymys
  • znwnymys
  • 2016-09-13 12:40:41
  • 912
收藏助手
不良信息举报
您举报文章:在Struts中Action访问Servlet API
举报原因:
原因补充:

(最多只允许输入30个字)