在Action中访问Servlet API的四种方法

Struts2 框架中的Action 类没有与任何Servlet API 耦合,因此Action 类可以脱离Servlet 容器环境进行单元测试。当Action 类需要通过请求、会话或上下文存取属性时,可以通过以下四种方法实现:

一、ActionContext

修改Action类,通过ActionContext 获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:

public class UserAction extends ActionSupport {
	//……
    private Map request,session,application;
    public String login() {
    	//获取ActionContext 对象
    	ActionContext ctx= ActionContext.getContext();
    	//通过ActionContext 对象获取请求、会话和上下文对象相关联的Map 对象
    	request=(Map) ctx.get("request");
    	session=(Map) ctx.getSession();
    	application=(Map) ctx.getApplication();
    	//访问application 范围的属性值
    	Integer counter = (Integer)application.get("counter");
    	if(counter==null)
    		counter=1;
    	else
    		counter=counter+1;
    	//设置application 范围的属性
    	application.put("counter", counter);
    	UserService userServ = new UserService();
    	if (userServ.login(loginUser)) {
    		//设置session 范围的属性
    		session.put("user", loginUser.getAccount());
    	    //设置request 范围的属性
    		request.put("tip", "您已登录成功");
    		return "success";
    	} 
    	else 
    	{
    		return "fail";
    	}
    }
}

二、接口:RequestAware、SessionAware和ApplicationAware

修改Action类,通过实现Struts 提供的接口:RequestAware、SessionAware和ApplicationAware,获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:

public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
	//……
	private Map request,session,application;
	public void setRequest(Map<String, Object> request) {
		this.request=request;
	}
	public void setSession(Map<String, Object> session) {
		this.session=session;
	}
	public void setApplication(Map<String, Object> application) {
		this.application=application;
	}
	public String login() {
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

三、接口:ServletContextAware、ServletRequestAware和ServletResponseAware

修改Action类,通过接口:ServletContextAware、ServletRequestAware、
ServletResponseAware 直接访问Servlet API,代码片段如下:

public class UserAction extends ActionSupport implements ServletContextAware,ServletRequestAware,ServletResponseAware{
	//……
	private ServletContext application;         // Servlet上下文  
	private HttpServletRequest request;         // request对象  
	private HttpServletResponse response;       // response对象  
	public void setServletRequest(HttpServletRequest request) {

		this.request=request;
	}
	public void setServletResponse(HttpServletResponse response) {

		this.response=response;
	}
	public void setServletContext(ServletContext application) {
		this.application=application;
	}
	public String login() {
		HttpSession session=request.getSession();
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

四、ServletActionContext 工具类

通过ServletActionContext 工具类直接访问Servlet API,代码片段如下:

public class UserAction extends ActionSupport{
	//……
	public String login() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		ServletContext application = ServletActionContext.getServletContext();
		HttpSession session=request.getSession();
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

测试代码:

<body>
	本站访问次数为:
	<s:property value="#application.counter" />
	<br>
    <s:property value="#session.user" />,
    <s:property value="#request.tip" />
</body>

运行结果:
在这里插入图片描述

以上四种方法中,前两种可以保持Action 与Servlet API 的解耦,后两种Action 将与Servlet API 直接耦合。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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容器提供的APIAction可以通过访问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、付费专栏及课程。

余额充值