Struts2 项目中,Session 对象存放在 ValueStack 的 context 对象中,context 是 Map 对象,那么要从 context 对象中获取到 Session 对象,就要指定 key 值。我们查看 ValueStack 的内容:
从 ValueStack 显示的内容可以知道,Session 存储在 context 对象中,对应的 key 值是 session。并且我们还知道 Session 也是 Map 类型的,所以 Session 对象其实也是一个 Map 对象,是按键值对存储数据的。
那么通过 ognl 表达式访问 context 中的 Session 对象,获取 Session 对象中 User 对象的 userName 属性值,ognl 表达式可以这样写:
<s:property value="#session.user.userName"/>
我们也可以通过 EL 表达式来获取 Session 对象中的 User 对象的 userName 属性值,EL 表达式的写法如下:
${sessionScope.user.userName}
如果你不指定查询的范围,那么 EL 表达式会从 ValueStack 的 root 对象中获取 user 属性的值,因为在 roo 对象中存在 Action 对象(Struts2 控制器自动将 Action 对象压入 root 的栈顶),而 Action 对象存在 user 属性。
上述讲解中用到的 Action 组件是 LoginAction,代码如下:
package priv.lwx.struts2.action;import com.opensymphony.xwork2.ActionContext;
import org.apache.struts2.dispatcher.ApplicationMap;
import priv.lwx.struts2.action.dao.UserDAO;
import priv.lwx.struts2.action.entity.User;import java.util.Map;/*** description** @author liaowenxiong* @date 2022/2/14 11:54*/public class LoginAction {private User user;private UserDAO userDAO = new UserDAO();public String login() {System.out.println(user.getUserName());System.out.println(user.getPassword());User user = userDAO.login(this.user.getUserName(), this.user.getPassword());if (user != null) {// 登录成功ActionContext act = ActionContext.getContext();Map<String, Object> session = act.getSession();String name = session.getClass().getName();// 将User对象存储在Session对象中session.put("user", user);return "success";}// 登录失败return "fail";}public String form() {return "success";}public User getUser() {return user;}public void setUser(User user) {this.user = user;}
}
JSP 的代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>您好!
</h1>
<h1>
<%-- <s:property value="#session.user.userName"/>--%><hr/>${sessionScope.user.userName}
</h1>
<s:debug/></body>
</html>
struts.xml 的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 所有匹配*.action的请求都由struts2处理 --><constant name="struts.action.extension" value="action"/><!-- 是否启用开发模式 --><constant name="struts.devMode" value="true"/><!-- struts配置文件改动后,是否重新加载 --><constant name="struts.configuration.xml.reload" value="true"/><!-- 设置浏览器是否缓存静态内容 --><constant name="struts.serve.static.browserCache" value="false"/><!-- 请求参数的编码方式 --><constant name="struts.i18n.encoding" value="utf-8"/><!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 --><constant name="struts.i18n.reload" value="true"/><!-- 文件上传最大值 --><constant name="struts.multipart.maxSize" value="104857600"/><!-- 让struts2支持动态方法调用 --><constant name="struts.enable.DynamicMethodInvocation" value="true"/><!-- Action名称中是否还是用斜线 --><constant name="struts.enable.SlashesInActionNames" value="false"/><!-- 允许标签中使用表达式语法 --><constant name="struts.tag.altSyntax" value="true"/><!-- 对于WebLogic,Orion,OC4J此属性应该设置成true --><constant name="struts.dispatcher.parametersWorkaround" value="false"/><package name="hellstruts" extends="struts-default" namespace="/demo01"><action name="login" class="priv.lwx.struts2.action.LoginAction" method="login"><result name="success">/WEB-INF/jsp/main.jsp</result><result name="fail">/login.jsp</result></action><action name="form" class="priv.lwx.struts2.action.LoginAction" method="form"><result name="success">/login.jsp</result></action></package></struts>