2.5.2 跟踪用户状态
前面的Action处理完用户登录后,仅仅执行了简单的页面转发,并未跟踪用户状态信息——通常,当一个用户登录成功后,需要将用户的用户名添加为HTTP Session的状态信息。
为了访问 HttpSession 实例,Struts 2 提供了一个 ActionContext 类,该类提供了一个getSession()方法,但该方法的返回值类型并不是HttpSession,而是Map。这又是怎么回事呢?实际上,这与Struts 2的设计哲学有关,Struts 2为了简化Action类的测试,将Action类与Servlet API完全分离,因此getSession()方法的返回值类型是Map,而不是HttpSession。
虽然ActionContext类的getSession()方法返回的不是HttpSession对象,而是Map对象,但Struts 2的系列拦截器会负责该Map对象和HttpSession对象之间的转换。
为了跟踪用户信息,我们修改 Action 类的 execute 方法,在 execute 方法中通过ActionContext访问Web应用的Session。修改后的execute方法代码如下。
程序清单:codes\02\struts2qs\WEB-INF\src\lee\LoginAction.java
// 处理用户请求的execute方法 public String execute() throws Exception { // 当用户请求参数的username等于crazyit,密码请求参数为leegang时 // 返回success字符串,否则返回error字符串 if (getUsername().equals("crazyit") && getPassword().equals("leegang")) { // 通过ActionContext对象访问Web应用的HTTP Session ActionContext.getContext().getSession() .put("user" , username); return SUCCESS; } else { return ERROR; } }
上面的代码仅提供了Action类的execute方法,该Action类的其他部分与前面的Action类代码完全一样。在上面的Action类中通过ActionContext设置了一个Session属性:user。为了检验所设置的Session属性是否成功,我们修改welcome.jsp页面,在welcome.jsp页面中使用JSP 2.0表达式语法输出HTTP Session中的user属性。下面是修改后的welcome.jsp页面代码。
程序清单:codes\02\struts2qs2\welcome.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>成功页面</title>
</head>
<body>
欢迎,${sessionScope.user},您已经登录。
</body>
</html>
上面的JSP页面与前面的JSP页面相比没有太大改变,除了使用了JSP 2.0表达式语法来输出Session中的user属性。关于JSP 2.0表达式的知识,请参看疯狂Java体系的《轻量级Java EE企业应用实战》第2章。
在图2.1所示页面的“用户名”输入框中输入crazyit,在“密码”输入框中输入 leegang,然后单击“登录”按钮,将看到如图2.4所示的页面。
图2.4 成功访问HTTP Session状态
在上面登录成功的页面中,已经输出登录所用的用户名:crazyit,可见在 Action 类中通过ActionContext访问HTTP Session状态是成功的。