如何通过action来给valueList的查询条件赋值
如何通过action来给valueList的查询条件赋值
以前使用valueList来做查询条件时,总是从页面的form中进行post或者get值给valueList,比如在valueList里会有这样一段代码:
/~con1: AND fields1=[con1]~/
但是这次项目遇到的是根据不同的登录角色来进行条件不一样的查询,这个如果通过表单提交的方法就很麻烦而且从客户端浏览器的行为也容易被篡改,咱们可以这样。
在valueList对应的Action中,增加相应的doPrepare()方法,比如下面代码这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void doPrepare() { // 账户 addParam("customerId", his.getLoginedCustomer().getId()); removeParam("receiverOrPayer"); // 支付方式 String channel = request.getParameter("channel"); if(!StringUtils.isBlank(channel)){ String[] channels = channel.split("_"); addParam("channel", channels[0]); for(int i=1; i<channels.length; i++){ addParam("channel"+i, channels[i]); } } } |
里面主要的方法就是addParam,removeParam,这样可以在把数据交给valueList前,先进行一层处理、包装,addParam可以把值传给valueList,以供使用。
为什么doPrepare会被执行呢?
这个Class声明是这样的:
1 | public class ListOrderHis extends BaseValueListAction {......} |
那么就来看看BaseValueListAction里面的内容吧,在这个Action中,有如下的一个方法:
1 2 3 4 | public void prepare() { ...... doPrepare(); } |
明白了吧,是这里来的prepare()方法调用的doPrepare()方法,咱们在子类中把doPrepare()方法给覆盖了,所以就会被执行了,那又是什么机制调用的prepare()方法呢?
那就一级一级来看吧,
这个BaseValueListAction声明如下:
1 | public class BaseValueListAction extends CRMActionSupport implements Preparable {......} |
有没有发现实现的接口里也包含了Preparable类似的词组?
那就来找Preparable看看,在前面有这样一行import代码如下:
import com.opensymphony.xwork.Preparable;
在 Preparable中的代码是如何的呢?
1 2 3 4 5 6 7 8 9 | public interface Preparable { /** * This method is called to allow the action to prepare itself. * * @throws Exception thrown if a system level exception occurs. */ void prepare() throws Exception; } |
看来只要实现这个接口的prepare方法,就可以在咱们的action执行之前来写一些代码了。
这么看来,是xwork和webwork在起作用了,在网上搜罗了相关的一些资料,发现是webwork的拦截器机制在起作用,拦截器,究其根本原因,在网上找到了如下一篇文档可以很好的说明这个问题了。
第五课: 截取器(Interceptors)
svn.opensymphony.com/svn/webwork/trunk/docs/chinese/wikidocs/TutorialLesson05.html
朋友们有空儿可以来看看。
随便自己跑出来的文章就随便看看吧...
黑莓8310,NOKIA N72,OUTLOOK间同步遇到的问题
Leave a Message
No Messages
RSS feed for comments on this post. TrackBack URI
我的简介: 谁说tmd巨蟹座傻来的?我就是tmd巨蟹里边儿最聪明的!!!