Action获取servletapi

在Struts2的Action类中,有时需要操作 request对象(HttpServletRequest),session对象(HttpSession),aplication对象(ServletContext),也就是操作ServletApi。本文主要介绍三种操作ServletApi的方式。

一:通过 ActionContext 操作ServletApi

在Struts2的Action类中可以直接获取ActionContext,通过ActionContext间接操作ServletApi
先介绍下ActionContext的主要方法:
	static ActionContext getContext():静态方法,获取系统的ActionContext实例;
	    
    	void put(String key,Object value)  //设置HttpServletRequest中key的值为value;
	public Object get(Object key)      //取得HttpServletRequest中key的值;
	
   	 void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换为session的属性名和属性值;
   	 public Map getSession():获取封装了HttpSession的Map对象;

	void setApplication(Map application):设置ServletContext实例;
	public Map getApplication():获取封装了ServletContext的Map对象;
	
	Map getParameters():类似于HttpServletRequest中的getParametersMap方法;
具体测试代码如下:
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单页面</title>
</head>
<body>
	<form action="./User_check.do">
		用户名:<input type="text" name="useName"><span>${useNameError}</span><br />
		密码:<input type="password" name="password"><span>${passWordError}</span><br />
		<input type="submit" value="提交">
	</form>
</body>
</html>
struts.xml
<struts>
	<package name="user" namespace="/" extends="struts-default">
		<!-- 解决struts2.5 通配符调用无效的问题 -->
		<global-allowed-methods>regex:.*</global-allowed-methods>

		<action name="*_*" class="com.lhb.StrutsText.{1}" method="{2}">
			<result name="success">/success.jsp</result>
			<result name="input">/user_login.jsp</result>
		</action>

	</package>
</struts>
action
package com.lhb.StrutsText;

import org.apache.log4j.Logger;

import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class User extends ActionSupport implements ModelDriven<UserBean> {
	private static Logger log = Logger.getLogger(User.class);
	private UserBean user = new UserBean();// 手动实例化
	private ActionContext actionContext = null;

	@Override
	public UserBean getModel() {
		// TODO Auto-generated method stub
		return user;
	}

	public String check() {
		// 获取ActionContext实例
		actionContext = ActionContext.getContext();
		if (!"admin".equals(user.getUseName())) {
			actionContext.put("useNameError", "用户名错误!");

			return INPUT;
		} else if (!"123".equals(user.getPassword())) {
			actionContext.put("passWordError", "密码错误!");
			return INPUT;
		}
		return SUCCESS;
	}

}
注意:获取ActionContext实例必须在本Action类的构造方法运行之后执行。因为ActionContext包含本Action类对象。具体解释请参照博文Ognl详解。

访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据

运行结果:

测试成功!

二:实现 RequestAware,SessionAware,ApplicationAware 接口操作ServletApi

上述事例,虽然能操作ServletApi,但因为代码稍微复杂,所以并不常用。
测试代码如下:
action代码改为:
package com.lhb.StrutsText;

import java.util.Map;

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

import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class User extends ActionSupport implements ModelDriven<UserBean>, RequestAware, SessionAware, ApplicationAware {
	private static Logger log = Logger.getLogger(User.class);
	private UserBean user = new UserBean();// 手动实例化
	private Map<String, Object> requestMap;
	private Map<String, Object> sessionMap;
	private Map<String, Object> applictionMap;

	@Override
	public UserBean getModel() {
		return user;
	}

	@Override
	public void setApplication(Map<String, Object> appliction) {
		applictionMap = appliction;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		sessionMap = session;
	}

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

	public String check() {
		if (!"admin".equals(user.getUseName())) {
			requestMap.put("useNameError", "用户名错误!");
			return INPUT;
		} else if (!"123".equals(user.getPassword())) {
			requestMap.put("passWordError", "密码错误!");
			return INPUT;
		}
		return SUCCESS;
	}

}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据

运行结果:

测试成功!
因为,这个操作 ServletApi的方式是通过Map间接操作,能够很好降低Struts2和页面的耦合,所以使用较为频繁。

三:通过ServletActionContext直接获取ServletApi

除了上述两种方式可以间接操作ServletApi之外,也可以直接操作ServletApi
action代码改为:
package com.lhb.StrutsText;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class User extends ActionSupport implements ModelDriven<UserBean> {
	private static Logger log = Logger.getLogger(User.class);
	private UserBean user = new UserBean();// 手动实例化
	private HttpServletRequest request = ServletActionContext.getRequest();
	private HttpSession session = request.getSession();
	private ServletContext appliction = request.getServletContext();

	@Override
	public UserBean getModel() {
		return user;
	}

	public String check() {
		if (!"admin".equals(user.getUseName())) {
			request.setAttribute("useNameError", "用户名错误!");
			return INPUT;
		} else if (!"123".equals(user.getPassword())) {
			request.setAttribute("passWordError", "密码错误!");
			return INPUT;
		}
		return SUCCESS;
	}

}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据

运行结果:

测试成功!
直接操作优点在于便于理解和操作,缺点是耦合度较高。
当然,为了代码分层,便于管理,可以将 通过ServletActionContext获取ServletApi放进一个Action基类中。
Action基类
package com.lhb.StrutsText;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class BasicAction extends ActionSupport{
	public 	HttpServletRequest request;
	public HttpServletResponse response; 
	public HttpSession session;
	public ServletContext application;
	public BasicAction() {
		// TODO Auto-generated constructor stub
		request = ServletActionContext.getRequest();
		response=ServletActionContext.getResponse(); 
		session =request.getSession();
		application=request.getServletContext();
		//.........	
	}

}
实际运用的 Action类可以继承该基类
Action修改为
package com.lhb.StrutsText;

import org.apache.log4j.Logger;
import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ModelDriven;

public class User extends BasicAction implements ModelDriven<UserBean> {
	private static Logger log = Logger.getLogger(User.class);
	private UserBean user = new UserBean();// 手动实例化

	@Override
	public UserBean getModel() {
		return user;
	}

	public String check() {
		if (!"admin".equals(user.getUseName())) {
			request.setAttribute("useNameError", "用户名错误!");
			return INPUT;
		} else if (!"123".equals(user.getPassword())) {
			request.setAttribute("passWordError", "密码错误!");
			return INPUT;
		}
		return SUCCESS;
	}

}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据

运行结果:

测试成功!








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值