在Struts2中,如何使用JSTL来读取Action中的变量?
这是一个历史悠久的问题。因为事实上,很多朋友(包括我在内)是不使用Struts2自身的标签库,而是使用JSTL的,可能因为JSTL标签库比较少,简单易用的原因吧。
我们知道,JSTL默认是从page,request,session,application这四个Scope逐次查找相应的EL表达式所对应 的对象的值。那么如果要使用JSTL来读取Action中的变量,就需要把Action中的变量,放到request域中才行。所以,早在 Webwork2.1.X的年代,我们会编写一个拦截器来做这个事情的。大致的原理是:在Action执行完返回之前,依次读取Action中的所有的变 量,并依次调用request.setAttribute()来进行设置。具体的整合方式,请参考以下这篇文档:http://wiki.opensymphony.com/display/WW/Using+WebWork+and+XWork+with+JSP+2.0+and+JSTL+1.1
不过随着时代的发展,上面的这种方式,已经不再被推荐使用了。(虽然如此,我们依然可以学习它的一个解决问题的思路)目前来说,自从 Webwork2.2以后,包括Struts2,都使用另外一种整合方式:对HttpServletRequest进行装饰。让我们来看一下源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
/**
* The constructor
* @param req The request
*/
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
/**
* Gets the object, looking in the value stack if not found
*
* @param s The attribute key
*/
public Object getAttribute(String s) {
if (s != null && s.startsWith("javax.servlet")) {
// don't bother with the standard javax.servlet attributes, we can short-circuit this
// see WW-953 and the forums post linked in that issue for more info
return super.getAttribute(s);
}
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
boolean alreadyIn = false;
Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
if (b != null) {
alreadyIn = b.booleanValue();
}
// note: we don't let # come through or else a request for
// #attr.foo or #request.foo could cause an endless loop
if (!alreadyIn && attribute == null && s.indexOf("#") == -1) {
try {
// If not found, then try the ValueStack
ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
ValueStack stack = ctx.getValueStack();
if (stack != null) {
attribute = stack.findValue(s);
}
} finally {
ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
}
}
return attribute;
}
}
|
看到了嘛?这个类会在Struts2初始化的时候,替换HttpServletRequest,运行于整个Struts2的运行过程中,当我们试 图调用request.getAttribute()的时候,就会执行上面的这个方法。(这是一个典型的装饰器模式)在执行上面的方法时,会首先调用 HttpServletRequest中原本的request.getAttribute(),如果没有找到,它会继续到ValueStack中去查找, 而action在ValueStack中,所以action中的变量通过OGNL表达式,就能找到对应的值了。
在这里,在el表达式广泛使用的今天,JSTL1.1以后,也支持直接使用el表达式。注意与直接使用struts2的tag的区别,这里需要使用el的表示符号:${}
例如:${user.name}, <c:out value=”${department.name}” />
分享到:
相关推荐
在Struts配置文件(struts-config.xml)中,你需要定义一个Action来处理文件上传请求。这个Action需要继承自Struts的`org.apache.struts.action.Action`类,并重写`execute`方法。在`execute`方法内,你可以通过`...
- 当客户端请求到达Web服务器,Struts的`strutspreparedandexecutefilter`开始运行,读取`struts.xml`配置文件,将Action配置信息存入`actionMapping`,然后放入`actionMapper`容器。`actionInvocation`对象代表...
7. FormBean:FormBean是Struts中用于封装表单数据的数据Bean,可以在Action中接收并处理。它们可以进行客户端验证,每次表单提交会产生新的实例,动态FormBean也可以进行验证。 8. Servlet调试:可以通过打印语句...
【Java笔试面试题及答案解析】 1. 问题:哪些情况可以终止当前...以上是对Java面试题中涉及的知识点的详细解析,涵盖了线程、构造函数、异常处理、接口、多态、Struts框架、Servlet调试、MVC模式以及JSTL等核心概念。
在使用压缩包文件时,开发者需要将"lib2"目录下的所有JAR文件添加到项目的类路径中,以确保所有依赖得到满足。同时,可能还需要根据项目需求调整SSH框架的相关配置,例如数据库连接参数、Spring的bean定义、Struts的...
6. **Struts视图组件**:Struts的视图通常由JSP(A)、Action(D)和代表业务逻辑的JavaBean(E)等组成,可以使用自定义标签(F)。Servlet(B)和ActionServlet(C)是控制层的组件,EJB(G)通常在业务逻辑层使用。 7. **...
- 在JSP页面中使用`<%@ taglib %>`指令引入标签库。 #### 用过哪些开源技术如分布式缓存。任务调度等 - **分布式缓存**:Redis、Memcached - **任务调度**:Quartz、Spring Task #### Hibernate缓存技术 - **一...
【Java笔试面试题及答案解析】 ...以上是针对Java笔试面试题的相关知识点详解,涵盖了线程、构造函数、异常处理、接口、方法重写/重载、Struts框架、Servlet调试、Session使用、JSP标签和MVC模式等多个方面。
- **文本截断**:在JSP中使用自定义函数或JSTL函数来实现对过长文本的截断,通常显示为“...”的形式。 - **获取客户端IP地址**:使用`request.getRemoteAddr()`方法来获取客户端的IP地址。 - **JSTL时间格式化**:...
在进行JavaWeb开发时,假定一个变量保存在session中,要获得这个变量的值,可以使用以下哪个语句? **答案:c) session.getAttribute(“name”)** - **解析:** - `application.getAttribute(“name”)` 获取应用...
- `char`型变量可以存储一个中文汉字,因为Java使用Unicode字符集,一个`char`类型占用2个字节。 **8. 下面说法错误的是:** - **知识点解析:** - `Vector`是线程安全的容器。 - `float`类型的变量不能直接...
可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: ${my.mail} ${my.mail} l 输出结果: jsmith@...
在JSP中使用JavaBeans - **使用标签**:创建或引用JavaBean实例。 - **使用标签**:设置JavaBean属性。 - **使用标签**:获取JavaBean属性值。 #### 8. JSP标记库 - **JSTL (JavaServer Pages Standard Tag ...
5. Struts是MVC框架,工作流程涉及Action、Form、ActionForward等。 6. EJB的生命周期管理,Session Bean用于业务逻辑,Entity Bean持久化数据。 7. 事务管理确保数据一致性。 8. synchronized关键字用于同步,Lock...
在Java Web开发中,我们通常会利用一些框架来提高开发效率,例如Spring MVC、Struts、JSF等。这些框架可以帮助我们更好地组织代码,实现MVC(Model-View-Controller)设计模式,使得业务逻辑、数据处理和用户界面...
学习Struts需要理解Action、Form Bean、ActionServlet、配置文件struts-config.xml以及Interceptor(拦截器)的工作原理。 【Spring】 Spring框架是一个全面的企业级应用开发框架,包含了依赖注入、AOP(面向切面...
Java语言是软件开发领域广泛使用的编程语言,尤其在企业级应用中占据着核心地位。以下是一些Java面试中常见且重要的知识点详解: 1. 访问修饰符:`public`、`protected`、`private`和`final` - `public`:任何类都...
3. request对象读取客户端请求,通过request.getParameter()获取CGI变量,getRealPath()获取JSP真实路径。 4. Cookie用于持久化用户信息,Session用于跟踪用户会话。Cookie存储在客户端,Session存储在服务器端。 ...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...