Struts2项目中的JSP如何访问Session对象

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pom.xml中pom全称_摆脱pom XML…几乎

pom.xml中pom全称介绍 POM文件是XML格式的文件&#xff0c;声明性地描述了要使用Maven构建的Java项目的构建结构。 维护大型Java项目的POM XML文件通常很麻烦。 XML是冗长的&#xff0c;POM的结构也需要维护冗余信息。 多次对工件进行命名是多余的&#xff0c;在groupId和artif…

IntelliJ IDEA for Mac中Maven菜单用法详解

Reload project 你如果修改了 pom.xml 文件&#xff0c;可以点击这个按钮重载 Maven 项目&#xff0c;重载过程会引入新的依赖&#xff0c;会删除不需要的依赖。 Generate Sources and Update Folders 这个按钮是将 src/main/resources 和 src/test/resources 的资源文件编译…

sql 注射_只能在测试中注射吗?

sql 注射本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家公司工作&#xff09;受雇并学习。 本文中的所有内容都是很好…

IntelliJ IDEA查看方法在哪里被调用(Method Usage Search/Method Call Hierarchy)

文章目录Usage SearchCall Hierarchy区别Usage Search 搜索使用的地方&#xff0c;快捷键如下&#xff1a; 你可以把光标移到方法名称处&#xff0c;然后点击右键&#xff0c;找到 Find Usages 菜单项&#xff0c;意思是“找到使用它的地方”。 例如我要查看哪些地方调用 f…

java编程学习方法_在线学习Java编程的最佳方法

java编程学习方法1.简介 Java是使用最广泛的编程语言之一。 根据Github的最新报告 &#xff0c;Java被列为仅次于JavaScript的第二大最常用的编程语言。 掌握Java的人有很多话题。 好消息是&#xff0c;您可以在线找到很多内容。 在这篇文章中&#xff0c;我们将对所有这些主题…

hibernate 标识符_Hibernate中的标识符

hibernate 标识符Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样&#xff0c;它可以是简单的也可以是复合的。 我们可以通过几种方式定义一个Hibernate标识符。 在本教程中&#xff0c;我们将学习如何做。 …

java中延迟_Java中的延迟分配

java中延迟程序员本质上是懒惰的&#xff0c;而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗&#xff1f; 还是懒惰的单身人士&#xff1f; &#xff08;不过&#xff0c;我个人更喜欢单一麦芽版本。&#xff09;如果使用Scala或Kotlin&#xff08;这也是一…

camel apache_短款Apache Camel K

camel apache您可能已经看到我们在Camel K周围的Apache Camel社区中所做的工作。 Nicola于半年前在他的博客中介绍了Camel K &#xff0c; 就在几个月前&#xff0c;我们正在讨论一个新项目&#xff0c;该项目可以作为Apache Camel的一部分启动。 一个有可能改变人们处理集成方…

java 栈 队列 接口_Java队列接口

java 栈 队列 接口介绍&#xff1a; 队列是FIFO&#xff08;先进先出&#xff09;抽象数据类型&#xff08;ADT&#xff09;。 换句话说&#xff0c;按插入顺序将元素删除。 java.util.Queue是Java 中的接口&#xff0c;并且从java.util.Collection扩展。 一些常用的Queue实现…

jakarta ee_Jakarta EE 8状态

jakarta ee遵循Jakarta EE的人们可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输已经完成&#xff0c;并且我们能够产生这些流程&#xff0c;规范&#xff0c;测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#x…

IntelliJ IDEA如何查看接口的实现类以及如何查看被实现的接口

在接口的左边有个向下的小箭头&#xff0c;点击小箭头就能看到接口的实现类和方法的实现&#xff1a; 在实现类的左边有个向上的小箭头&#xff0c;可以查看被实现的接口和被覆盖重写的方法&#xff1a;

c#自定义控件资源释放问题_定义资源

c#自定义控件资源释放问题在Fielding的论文中 &#xff0c;资源描述为&#xff1a; “可以命名的任何信息”……“文档或图像&#xff0c;临时服务&#xff08;例如&#xff0c;“洛杉矶今天的天气”&#xff09;&#xff0c;其他资源的集合&#xff0c;非虚拟对象&#xff08…

MySQL数据库存入日期(java.sql.Date)数据,天数会少一天的问题

网络上给的解决办法&#xff1a; 这是数据库服务器时区的问题&#xff0c;即连接参数 serverTimezone 的问题&#xff0c;默认情况下 serverTimezoneUTC&#xff0c;改成 HongKong 或者 Asia/Shanghai 就可以了。如下所示&#xff1a; jdbc:mysql://localhost:3306/test?useU…

spring的bean范围_Spring Bean范围

spring的bean范围介绍&#xff1a; Spring核心容器实例化bean并管理其生命周期。 在定义bean时&#xff0c;我们可以提供其范围。 除非明确提供&#xff0c;否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中&#xff0c;我们将探讨它们…

java.util.Date转换成java.sql.Date

// 获取当前的系统时间&#xff0c;以java.util.Date对象返回 Date dateUtil new Date(); // 获取当前的系统时间&#xff0c;以时间戳返回 long l System.currentTimeMillis();时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现…

省编码市编码区县编码_无浪费编码

省编码市编码区县编码本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。 Java通常被视为无法在低内存环境中有效运行的内存猪。 目的是证明许多人认为不可能的事情&#xff0c;有意义的java程序几乎可以在没有内存的情况下运行。 示例流程 在Java的单…

Java日期时间字符串和毫秒相互转换的方法

参考链接&#xff1a; 1.https://www.jb51.net/article/130195.htm 2.https://blog.csdn.net/yhj19920417/article/details/73799842?locationNum10&fps1

谷歌本地不支持websocket_django开发-websocket的实现

今天介绍下如何在django中使用channels实现websocket。其实还可以使用dwebsocket实现websocket&#xff0c;这里不做介绍。首先介绍一个概念ASGI。ASGI异步网关协议接口&#xff0c;一个介于网络协议服务和Python应用之间的标准接口&#xff0c;能够处理多种通用的协议类型&…

我要正式开始《一个项目征服Java中高级体系》

在互联网上经常看到很多人说35岁危机的问题、大厂裁员、互联网寒冬这些问题。我感觉比较幸运的是&#xff0c;在之前大环境还不是很坏时候就被裁了一次&#xff0c;所以我很早就开始做持续的准备&#xff0c;现在不好说一定能怎么样&#xff0c; 至少自己在持续的探索适合自己的…

cuba 平台_CUBA 7的新功能

cuba 平台三年前&#xff0c;我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子&#xff0c;我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长&#xff0c;因此我们了解了开发人员如何…