使用Struts2-tags的include,所带参数无法通过ongl直接获取的问题

6 篇文章 0 订阅
4 篇文章 0 订阅

今天遇到这样一个问题:通过struts2-tags的include标识 include 了一个jsp,同时附带一些参数,比如下列语句(struts-tag的前缀设为s)

<s:include value="branch.jsp"> 
  <s:param name="v1" value="1"/> 
</s:include> 


然后在branch.jsp中,我发现通过ongl无法获取s:include附带的参数值,但能通过EL语句,比如${param.v1}获取其值。觉得很不解,于是搜索了一下,其中发现Stack Overflow里有一个提问正好提到这个问题,然而,回复里说目前尚未有一个比较好的解决方案,都是说通过EL或JSTL语句辅助编写,而不能直接用ongl获取其参数。

经过一段时间的讨论和思考,我觉得ongl无法获取,那表示ActionContext里并没有相应的值。但EL能获取,表示这个值的确是存在在parametersMap里的。那为什么EL能获取?后面想了想,也许EL能访问的这个域并没在ActionContext里,虽说ActionContext也有request.parameter,但通过 s:include 带的参数并没存储在ActionContext内。于是自己试验了一下,直接在jsp里用java代码获取jsp页的request对象中parameters,发现s:include带的参数是记录在内,即通过以下代码能获取v1参数的值

<% request.getParameters("v1") %>


而EL${param.v1}获取的正是这个对象的值。而ongl的#parameters.v1访问的是ActionContext.request.parameters,和当前JSP页的request对象不是一个对象,所以ongl无法获取其值。 (原来我还以为应该通过page域去获取,比如ongl的 #page.v1 去获取其值,但发现不行。而#pageScope没试,不知道是不是这个,在此说明一下)

由于之前写了测试的代码,都是用ongl去获取值的,为了尽可能不改写视图的逻辑,即能通过ongl能获取传导的参数,我用了一种比较笨的方法解决这个问题,即通过在jsp的<% %>中用java代码把参数加入ActionContext中,于是之后就能用ongl获取参数。

 

其实之前尝试用

<s:set name="vv1">#{param.v1}</s:set>


但我发现这样创建的值都当字符串了,导致后续的ongl操作中的+运算都默认成字符串连接,而我找不到一个配置参数去限定set的这个值是一个整型而非字符串。然而,而且java代码,把一个整型对象放入ActionContext,再通过ongl获取则会默认为整型,后续的+运算和/运算也全都正确了。

为什么上述s:set语句创建的值为字符串呢?我想,应该是因为${param.v1}便是输出字符串,所以赋进vv1的类型便是一个字符串。在此也能了解,ongl的运算过程会去考虑运算对象原本的类型,而不是自己去识别"1"是一个字符串还是一个整型数据。

 

更多思考:s:include的功能是不是就和jsp:include一样。 这个标签很疑惑人啊,它应该实现把所带的参数都存进ActionContext才合理啊,要不和jsp:include有什么区别嘛!?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值