论坛首页 Java企业应用论坛

JSTL/EL如何方便高效的访问Constants和CodeTable(存储于DB的应用系统变量)

浏览 6829 次
精华帖 (1) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-18  
itstarting 写道

极不情愿的下载了struts2,看了StrutsRequestWrapper的源码,两点感觉:
1.自己再维护一个ValueStack,不愿意也不会这么干;
2.看到了这个类的Comment,不爽:
All Struts requests are wrapped with this class, which provides simple JSTL accessibility. This is because JSTL works with request attributes, so this class delegates to the value stack except for a few cases where required to prevent infinite loops.
你们自己看看这个because

如果为了这个JSTL还要自己扩展request wrapper,感觉太委屈了自己——没必要这么找罪受吧我想


抱歉downpour,咱的境界也许没到你那个层次,咱只会干些投机取巧的事情(好像有这种感觉),总是觉得简单明了的解决方案就是最好的


极不情愿地最后一次回你的贴。

看问题要看清问题的本质。你能说出“自己再维护一个ValueStack”这种话来,只能证明你对StrutsRequestWrapper的工作原理根本还不理解,也不知道Struts2为什么要这么做。

其实你的这个问题早在2004年就在Javaeye中讨论过,不过当时侧重点转向了Tag实现,直到Webwork2.2的发布,大家才发现RequestWrapper是最简单有效的方案。时代在进步,7年过去了,难道讨论还始终停留在7年前的水平么?
0 请登录后投票
   发表时间:2011-04-18   最后修改:2011-04-18
itstarting 写道
标签?不行吧,有了custom的标签,如何用EL?

自己封装fn,我也觉得不好,或者说你在这方面有啥更具体的建议?


custom的标签完全可以和EL并存啊,甚至EL表达式可以放到自定义标签中作为一个参数。

个人认为为了扩展Jstl去wrapper request 的确有些傻
0 请登录后投票
   发表时间:2011-04-18  
downpour 写道

极不情愿地最后一次回你的贴。

看问题要看清问题的本质。你能说出“自己再维护一个ValueStack”这种话来,只能证明你对StrutsRequestWrapper的工作原理根本还不理解,也不知道Struts2为什么要这么做。

其实你的这个问题早在2004年就在Javaeye中讨论过,不过当时侧重点转向了Tag实现,直到Webwork2.2的发布,大家才发现RequestWrapper是最简单有效的方案。时代在进步,7年过去了,难道讨论还始终停留在7年前的水平么?



哈哈,终于把高手惹毛了。

我感觉我是理解RequestWrapper的用意的,既然在servlet API标准中就考虑到了这种设计,自然鼓励servlet容器或者大型的基础框架中适度采用装饰模式加以扩展,自然是不错的实践。

按照我的理解,采用RequestWrapper无非两点:
1、可以扩展自己的数据交换堆栈,即ValueStack或类似实现,这样自然可以有自己的存放、转换等更自由的扩展、实现;
2、根据某种约定来获取和交换数据


但是……对于我这种场景,各位大牛们确定我的实现是04年的水平而严重out了之举?

这样吧,如果还有大牛愿意浪费笔墨来点评,请:
1.直接了当说明我这种实现最烂最out的地方,以便一棍子打到04年乃至更早去;
2.也直接了当说明RequestWrapper的实现能确保跟上范冰冰2011年的春装,即便我不喜欢她。

另外说一下,我不用Struts2,我用Spring MVC 3

0 请登录后投票
   发表时间:2011-04-28  
楼主  看下你的代码bulidCodeTables()中map为空啊  并没有放值啊..
0 请登录后投票
   发表时间:2011-04-28  
itstarting 写道
之前只是简单的使用JSTL/EL进行输出,一般的思路很简单:retrieve data -> put to Request -> JSTL/EL


一直没太注意两个问题:

1、JSTL/EL官方上无法方便、直接的访问静态变量。


比如,我们定义了一个Constants类:
public class Constants implements Serializable {
	public static final String CONSTANT_A= "ABC";	
	...
}

我们并不能直接这样使用:
<c:out value="${Constants.CONSTANT_A}"/>


原因很简单:
1)这个Constants必须出现在某个scope,比如requestScope;
2)这个CONSTANT_A必须有一个getter方法,EL支持bean和map的规范

怎么办?


2、JSTL/EL如何才能简单的使用CodeTable(存储于DB的应用系统变量)?
应用系统变量几乎是无可避免的,好处大家都懂的。
一般人的思维肯定是:
1)提供一个service,拥有若干方法,比如getCodesByType(String codeType);
2)用的时候get出来,然后put到request上面,最后在JSP中用JSTL/EL来取出

最后的用法,以Spring MVC的tag为例,一般是:
<form:select path="gender">
  <form:option value="-" label="--Please Select"/>
  <form:options items="${CodeTable.Gender}" itemValue="codeValue" itemLabel="codeName"/>
</form:select>

此时表示要获取Gender的CodeTable,并以codeValue为值,codeName为Label

是否存在更简单有效的方法?


我目前正在整合一些信息并加以模式化,试图提供一个简洁有效的办法来达成目标,也希望大家参与讨论,提供“一站式”的解决方案


我们几年前是通过自定义tag,还有freemarker宏实现这种鸟功能。每个人只要放一个key进去,就能取出各种值:单值,列表,map之类的。
0 请登录后投票
   发表时间:2011-04-28  
haitaohehe 写道
楼主  看下你的代码bulidCodeTables()中map为空啊  并没有放值啊..



你说的对,这就是我认为比较有意思的设计之一:这里存放的只是KEY及其引用,以确保值是refreshable的。

这样的话,是否缓存及其缓存策略,都交给原来的service/dao来做(比如我所涉及的项目就是用了简单的iBatis LRU缓存,24小时自动flush),这里既然是轻量级的做法,就不要管这些了。

当然了,你如果愿意,也可以在这里考虑缓存,但此时需要考虑缓存的生命周期管理了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics