`
Copperfield
  • 浏览: 260323 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25137
社区版块
存档分类

struts2中使用JSTL读取action中的变量

    博客分类:
  • J2EE
阅读更多

在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配置文件(struts-config.xml)中,你需要定义一个Action来处理文件上传请求。这个Action需要继承自Struts的`org.apache.struts.action.Action`类,并重写`execute`方法。在`execute`方法内,你可以通过`...

    struts相关资料

    - 当客户端请求到达Web服务器,Struts的`strutspreparedandexecutefilter`开始运行,读取`struts.xml`配置文件,将Action配置信息存入`actionMapping`,然后放入`actionMapper`容器。`actionInvocation`对象代表...

    XXjava笔试面试题及参考答案.docx

    7. FormBean:FormBean是Struts中用于封装表单数据的数据Bean,可以在Action中接收并处理。它们可以进行客户端验证,每次表单提交会产生新的实例,动态FormBean也可以进行验证。 8. Servlet调试:可以通过打印语句...

    java笔试面试题及答案.doc

    【Java笔试面试题及答案解析】 1. 问题:哪些情况可以终止当前...以上是对Java面试题中涉及的知识点的详细解析,涵盖了线程、构造函数、异常处理、接口、多态、Struts框架、Servlet调试、MVC模式以及JSTL等核心概念。

    上传一个ssh整个的工程,方便搭建基于spring的web应用

    在使用压缩包文件时,开发者需要将"lib2"目录下的所有JAR文件添加到项目的类路径中,以确保所有依赖得到满足。同时,可能还需要根据项目需求调整SSH框架的相关配置,例如数据库连接参数、Spring的bean定义、Struts的...

    java笔试面试题及答案.docx

    6. **Struts视图组件**:Struts的视图通常由JSP(A)、Action(D)和代表业务逻辑的JavaBean(E)等组成,可以使用自定义标签(F)。Servlet(B)和ActionServlet(C)是控制层的组件,EJB(G)通常在业务逻辑层使用。 7. **...

    海辉面试题

    - 在JSP页面中使用`&lt;%@ taglib %&gt;`指令引入标签库。 #### 用过哪些开源技术如分布式缓存。任务调度等 - **分布式缓存**:Redis、Memcached - **任务调度**:Quartz、Spring Task #### Hibernate缓存技术 - **一...

    java笔试面试题及答案.pdf

    【Java笔试面试题及答案解析】 ...以上是针对Java笔试面试题的相关知识点详解,涵盖了线程、构造函数、异常处理、接口、方法重写/重载、Struts框架、Servlet调试、Session使用、JSP标签和MVC模式等多个方面。

    JavaEE学习实战笔记心得

    - **文本截断**:在JSP中使用自定义函数或JSTL函数来实现对过长文本的截断,通常显示为“...”的形式。 - **获取客户端IP地址**:使用`request.getRemoteAddr()`方法来获取客户端的IP地址。 - **JSTL时间格式化**:...

    JavaWeb开发人员面试题及答案

    在进行JavaWeb开发时,假定一个变量保存在session中,要获得这个变量的值,可以使用以下哪个语句? **答案:c) session.getAttribute(“name”)** - **解析:** - `application.getAttribute(“name”)` 获取应用...

    javaweb开发人员面试题及答案.pdf

    - `char`型变量可以存储一个中文汉字,因为Java使用Unicode字符集,一个`char`类型占用2个字节。 **8. 下面说法错误的是:** - **知识点解析:** - `Vector`是线程安全的容器。 - `float`类型的变量不能直接...

    freemarker总结

    可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 l 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: ${my.mail} ${my.mail} l 输出结果: jsmith@...

    最新Java面试大全

    在JSP中使用JavaBeans - **使用标签**:创建或引用JavaBean实例。 - **使用标签**:设置JavaBean属性。 - **使用标签**:获取JavaBean属性值。 #### 8. JSP标记库 - **JSTL (JavaServer Pages Standard Tag ...

    java面试题大全.pdf

    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)设计模式,使得业务逻辑、数据处理和用户界面...

    java从零基础到精通的整个详细笔记(2012版)

    学习Struts需要理解Action、Form Bean、ActionServlet、配置文件struts-config.xml以及Interceptor(拦截器)的工作原理。 【Spring】 Spring框架是一个全面的企业级应用开发框架,包含了依赖注入、AOP(面向切面...

    出现几率最高和覆盖范围最广的一套经典Java面试题.docx

    Java语言是软件开发领域广泛使用的编程语言,尤其在企业级应用中占据着核心地位。以下是一些Java面试中常见且重要的知识点详解: 1. 访问修饰符:`public`、`protected`、`private`和`final` - `public`:任何类都...

    JAVA面试题集锦.pdf

    3. request对象读取客户端请求,通过request.getParameter()获取CGI变量,getRealPath()获取JSP真实路径。 4. Cookie用于持久化用户信息,Session用于跟踪用户会话。Cookie存储在客户端,Session存储在服务器端。 ...

    Java学习笔记-个人整理的

    \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}{...

Global site tag (gtag.js) - Google Analytics