Struts2之访问ServletAPI

1. Action访问方式(一)

对于WEB应用的控制器而言,不访问ServletAPI几乎是不可能的,例如跟踪HTTPSession状态等。Struts2框架提供了一种更轻松的方式访问Servlet API。WEB应用中通常需要访问Servlet API就是HttpServletRequest、HttpSession、ServletContext,这三个接口分别代表JSP内置对象中的request、session、application。Struts2提供了ActionContext类来访问Servlet API的。下面列出几个常的方法。

(1).        Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(Stringname)方法。

(2).        Map getApplication():返回一个Map对象,该对象模拟了该 应用的ServletContext实例。

(3).        static Action getContext():静态方法,获取系统的ActionContext实例。

(4).        Map getParameters():获取所有方法的请求。类似于调用HttpServletRequest对象的getParameterMap()方法。

(5).        Map getSession():返回一个Map对象,该对象模拟了HttpSession实例

(6).        void setApplication(Mapapplication):直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名、属性值。

(7).        void setSession(Map session):直接传入一个Aap实例,将该Map实例里的key-value对转成session的属性名、属性值。

  下面笔者给出了具体的例子来说明。

               i.             定义Action的类

 public class LoginAction implements Action
{
	private String username;
	private String password;

	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}

	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		// 通过ActionContext访问application范围的属性值
		Integer counter = (Integer)ctx.getApplication()
			.get("counter");
		if (counter == null)
		{
			counter = 1;
		}
		else
		{
			counter = counter + 1;
		}
		// 通过ActionContext设置application范围的属性
		ctx.getApplication().put("counter" , counter);
		// 通过ActionContext设置session范围的属性
		ctx.getSession().put("user" , getUsername());
		if (getUsername().equals("owen")
			&& getPassword().equals("owen") )
		{
			// 通过ActionContext设置request范围的属性
			ctx.put("tip" , "服务器提示:您已经成功的登录");
			return SUCCESS;
		}
		// 通过ActionContext设置request范围的属性
		ctx.put("tip" , "服务器提示:登录失败");
		return ERROR;
	}
}

                ii.             配置struts.xml.(跟前面一样,此处省略)

             iii.             创建物理视图

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>成功页面</title>
</head>
<body>
	本站访问次数为:${applicationScope.counter}<br/>
	${sessionScope.user},您已经登录!<br/>
	${requestScope.tip}
</body>
</html>

2. Action访问方式(二)

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

(1).        ServletContextAware:实现接口的Action可能直接访问Web应用的ServletContext实例。

(2).        ServletRequestAware:实现接口的Action可以直接访问用户请求的HttpServletRequest实例。

(3).        ServletResponseAware:实现 该接口的Action可以直接访问服务器响应的HttpServletResponse实例。

下面笔者将通过HttpServletResponse为系统添加Cookie对象,本应用将继续使用前一个的JSP页面。下面给出Action类。

 public class LoginAction
	implements Action,ServletResponseAware
{
	private String username;
	private String password;
	private HttpServletResponse response;

	// 重写实现ServletResponseAware接口必须实现的方法
	public void setServletResponse(HttpServletResponse response)
	{
		this.response = response;
	}

	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}

	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		// 通过ActionContext访问application范围的属性值
		Integer counter = (Integer)ctx.getApplication()
			.get("counter");
		if (counter == null)
		{
			counter = 1;
		}
		else
		{
			counter = counter + 1;
		}
		// 通过ActionContext设置application范围的属性
		ctx.getApplication().put("counter" , counter);
		// 通过ActionContext设置session范围的属性
		ctx.getSession().put("user" , getUsername());
		if (getUsername().equals("owen")
			&& getPassword().equals("owen") )
		{
			// 通过response添加Cookie
			Cookie c = new Cookie("user" , getUsername());
			c.setMaxAge(60 * 60);
			response.addCookie(c);
			// 通过ActionContext设置request范围的属性
			ctx.put("tip" , "服务器提示:您已经成功的登录");
			return SUCCESS;
		}
		// 通过ActionContext设置request范围的属性
		ctx.put("tip" , "服务器提示:登录失败");
		return ERROR;
	}
}

  JSP页面添加如下的代码:

      Cookie值:${cookie.user.value}

3. ServletActionContext访问Servlet API

为了能直接访问Servlet API,Struts2还提供了一个ServletActionContext工具类,这个类包含了如下几个静态方法。

(1).        static PageContextgetPageContext():取得Web应用的PageContext对象。

(2).        static HttpServletRequestgetRequest():取得Web应用的HttpServletRequest对象

(3).        static HttpServletRequestgetResponse():取得Web应用的HttpServletResponse对象

(4).        static ServletContextgetServletContext():取得Web应用的ServletContext对象

   下面笔者给出了Action类

public class LoginAction
	implements Action
{
	private String username;
	private String password;

	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}

	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		// 通过ActionContext访问application范围的属性值
		Integer counter = (Integer)ctx.getApplication()
			.get("counter");
		if (counter == null)
		{
			counter = 1;
		}
		else
		{
			counter = counter + 1;
		}
		// 通过ActionContext设置application范围的属性
		ctx.getApplication().put("counter" , counter);
		// 通过ActionContext设置session范围的属性
		ctx.getSession().put("user" , getUsername());
		if (getUsername().equals("owen")
			&& getPassword().equals("owen") )
		{
			// 通过response添加Cookie
			Cookie c = new Cookie("user" , getUsername());
			c.setMaxAge(60 * 60);
			ServletActionContext.getResponse().addCookie(c);
			// 通过ActionContext设置request范围的属性
			ctx.put("tip" , "服务器提示:您已经成功的登录");
			return SUCCESS;
		}
		// 通过ActionContext设置request范围的属性
		ctx.put("tip" , "服务器提示:登录失败");
		return ERROR;
	}
}






你可能感兴趣的:(Struts2之访问ServletAPI)