`
fjswqlp
  • 浏览: 4057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于Struts2里使用EL或JSTL(转)

    博客分类:
  • java
 
阅读更多

最近在公司里做一些Java Web开发的培训,同时对已经做的一些工程做一些ReView,现在的工程里,工程师直接使用JSTL取得Action里的属性,这个用法我以前到真的没有用过,因为在我印象中,Struts2的这些Action属性,应该是在ValueStack中,而在某些情况下,从ValueStack取值是件挺麻烦的事情,在做天乙社区8时,我就参考Struts2的标记库,自己扩展标记库,从而取得ValueStack里的值,而JSTL应该是从Page、Request、Session和Application里顺序取值,莫非Struts2将ValueStack里的值也放入了Request?同时我们直接用EL标签也直接取出了Action的属性值,莫非真的放入了Request?但是打开Struts2的Debug,发现Request里并没有值。

带着这个疑问,我Google了一下,很快找到答案:

提问:在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 {   publicStrutsRequestWrapper(HttpServletRequest req) { super(req); }   public ObjectgetAttribute(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 ValueStackctx.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 jstl el表达式示例代码

    struts jstl el表达式示例代码 struts jstl el 表达式 源码

    JSP+Struts+JSTL+EL学习实例

    开发者可以通过阅读源码,了解如何配置Struts的配置文件(struts-config.xml),定义Action类处理用户请求,以及如何在JSP页面中使用JSTL标签和EL表达式显示数据。 具体到实例的实现,可能涉及到以下几个关键知识点...

    JSP+Struts+JSTL+EL新闻发布系统jsp

    5、本系统采用到的技术:JSP+Struts+JSTL+EL,我本人喜欢JSTL+EL的组合方式,他不景向页面美观! 6、mysql.sql这个文件是mysql的脚本文件,您可以用它来创建数据库! &lt;!DOCTYPE ...

    混用JSTL及EL和Struts.txt

    在IT领域的Web开发中,JavaServer Pages (JSP)、Java Standard Tag Library (JSTL)、Expression Language (EL)以及Struts框架是常见的技术组件,它们各自扮演着不同的角色,但又可以协同工作,为开发者提供强大的...

    Struts标签 和jstl标签

    Struts标签和JSTL(JavaServer Pages Standard Tag Library)标签是Java Web开发中的两种重要组件,...深入研究“Struts标签参考.CHM”和“jstl-1_1-mr2-spec.pdf”这两个文档,将有助于你更好地理解和运用这些技术。

    JSTL、EL、ONGL、Struts标签的区别

    ### JSTL、EL、ONGNL、Struts标签的区别与使用 #### 一、JSTL (JavaServer Pages Standard Tag Library) **定义**: JSTL 是一个由一系列标准标签组成的集合,这些标签可以帮助开发者简化 JavaServer Pages (JSP) ...

    EL及jstl.rar

    "EL及jstl.rar" 这个压缩包文件的标题和描述非常简洁,直接指出了文件的主要内容是关于“EL”(Expression Language)和“JSTL”(JavaServer Pages Standard Tag Library)。EL是Java EE平台中的一个组件,用于在...

    Struts标签库jstl.jar standard.jar

    在实际应用中,`jstl.jar`和`standard.jar`通常与Struts框架一起使用,共同构建高效、可扩展的Web应用程序。它们的结合使用,可以使JSP页面更加简洁,减少Java代码的使用,提高代码的可读性和可维护性,同时也降低了...

    从JSTL和STRUTS的TLD文件到自定义EL函数

    除了使用JSTL和Struts自带的函数外,开发者还可以根据自己的需求创建自定义的EL函数。自定义函数需要实现特定的接口或者继承特定的类,并在TLD文件中进行声明。例如,若要创建一个名为`myFunction`的自定义函数,...

    struts1和struts2的区别

    - **Struts1**: 支持JSTL标签库以及EL表达式。但是,相比于Struts2,其功能较为有限。 - **Struts2**: 支持JSTL的同时,引入了更强大的表达式语言——OGNL(Object Graph Navigation Language)。OGNL提供了一种简洁...

    struts2配置详解

    从 Struts1 升级到 Struts2: 1、Struts1 里使用 ActionServlet 作为控制器; Struts2 使用了一个过滤器作为控制器 2、Struts1 中每个 ...5、Struts2 在页面里使用 OGNL 来显示各种对象模型, 可以不再使用 EL 和 JSTL

    jstl和struts标签

    ### JSTL与Struts标签库详解 ...通过使用JSTL和Struts标签,开发者不仅能够提高代码的可读性和可维护性,还能大大减少页面上的脚本代码量,使页面更加整洁和专业。这对于构建高质量的企业级Web应用来说是非常重要的。

    struts1和struts2区别

    - **Struts1**:整合JSTL EL,但对集合和索引属性支持有限。 - **Struts2**:支持OGNL,这是一种更强大和灵活的表达式语言,提供了更全面的对象图遍历功能。 7. **值绑定到页面**: - **Struts1**:使用JSP标准...

    留言板留言板struts2留言板struts2

    5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action和视图之间传递数据。通过OGNL,可以在JSP页面中直接访问Action中的属性,或者在Action中动态设置模型数据。 6. ...

    转:struts1与struts2的区别

    - **Struts1**: Struts1集成了JSTL,使用JSTL的表达式语言(EL),支持基本的对象图遍历,但对于集合和索引属性的支持较弱。 - **Struts2**: Struts2不仅支持JSTL,还可以使用更强大、更灵活的表达式语言OGNL...

    Struts2和Struts1的区别,详细点,主要说说Struts2

    - **Struts2**虽然不再强制要求使用ActionForm模式,但仍然支持类似的功能,例如通过ModelDriven模式或使用Struts2的类型转换机制来处理用户输入。 #### 视图技术的支持 - **Struts1**支持使用JSTL标签库和EL表达式...

    struts2 与 struts1的区别

    - **Struts1** 整合了JSTL,使用JSTL表达式语言(EL)来处理页面展示逻辑。然而,JSTL EL对于复杂对象的访问能力较弱。 - **Struts2** 支持更加强大和灵活的表达式语言——OGNL(Object Graph Navigation Language)。...

    struts——jstl 扎包

    这些jar文件可能包括struts的核心库、JSTL库以及EL(Expression Language)库,如`struts.jar`, `jstl.jar`, `standard.jar`等。 **整合步骤** 1. **添加库依赖**:将解压后的jar文件添加到Web应用的WEB-INF/lib...

Global site tag (gtag.js) - Google Analytics