Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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状态是成功的。