浏览 5606 次
锁定老帖子 主题:tapetry能通过超连接传参数吗?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-06-07
我试了下面的通不过 http://localhost:8080/jycrm/app?service=page/UserAdmin?id=123 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-06-07
http://localhost:8080/jycrm/app?service=page/UserAdmin&id=123
改成这样试试 |
|
返回顶楼 | |
发表时间:2006-06-08
试了取不到值:(
|
|
返回顶楼 | |
发表时间:2006-06-08
通
HttpRequest.getParameter("id") 这样拿不到吗 |
|
返回顶楼 | |
发表时间:2006-06-09
Tapestry中有专门做这个事情的,用IExternalPage。
UserAdmin 实现IExternalPage。 |
|
返回顶楼 | |
发表时间:2006-06-09
实际上Tapestry对这个需求的解决方案是很不完善的,相关类有:
ExternalService //专门处理带自定义参数URL的引擎服务 IExternalPage //接收引擎服务传递的参数之页面所必须实现的接口 ExternalLink //构建带参URL的组件 无论是ExternalLink构建的,还是硬编码的URL,必须是这种格式: url?sp=Sstring&sp=ddouble&sp=llong&sp... 同时,page中也只能这样来处理: /** * 默认实现org.apache.tapestry.IExternalPage接口,实现外部参数传递给page * invoked by ExternalService * externalService.service(IRequestCycle cycle);{ * ... * cycle.setListenerParameters(parameters);; * cycle.activate(page);; * page.activateExternalPage(parameters, cycle);; * ... * } * @param params Object[] * @param cycle IRequestCycle */ public void activateExternalPage(Object[] params, IRequestCycle cycle); { int paramCount = Util.size(params);; if(paramCount>0);{ setStringProperty((String);params[0]);; } if(paramCount>1);{ setDoubleProperty((Double);params[1]);; } ... } 让我们来改造一下。 目标: 1、URL中的参数名不再是简单的sp 2、自动根据参数名,绑定参数值到页面相关的属性 实现结果: 1、页面规范 Test.page <page-specification> <property name="testProperty1"/> <property name="testProperty2"/> <property name="testProperty3"/> <property name="testProperty4"/> <component id="parameterBinder" type="ParameterBinder"> <binding name="p1" value="ognl:testProperty1"/> <binding name="p2" value="ognl:testProperty2"/> <binding name="p3" value="ognl:testProperty3"/> <binding name="p4" value="ognl:testProperty4"/> </component> </page-specification> 2、页面模板 Test.html <span jwcid="@Insert" value="ognl:testProperty1">testProperty1</span><br> <span jwcid="@Insert" value="ognl:testProperty2">testProperty2</span><br> <span jwcid="@Insert" value="ognl:testProperty3">testProperty3</span><br> <span jwcid="@Insert" value="ognl:testProperty4">testProperty4</span><br> <a href="#" jwcid="@ParameterizedLink" page="Test" parameterBinder="component:parameterBinder">本页面</a> 3、URL http://host/Test.external?p1=Sstring&p2=d123.0&p3=123&p4=f123.0 实现: 1、定义一个ParameterBinder组件,直接继承AbstractComponent,不需要更多内容。组件规范允许绑定非正规参数。 public abstract class ParameterBinder extends AbstractComponent { protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle); { } } <component-specification class="tapestry.jwc.ParameterBinder" allow-body="no" allow-informal-parameters="yes"> </component-specification> 2、参照ExternalLink定义一个ParameterizedLink组件。 public abstract class ParameterizedLink extends AbstractLinkComponent { public abstract IEngineService getParameterizedService();; public ILink getLink(IRequestCycle cycle); { Map parameters = null; ParameterBinder binder = getParameterBinder();; if (binder != null); { Map bindingMap = binder.getBindings();; parameters = new HashMap(bindingMap.size(););; for (Iterator i = bindingMap.entrySet();.iterator();; i.hasNext();; ); { Map.Entry entry = (Map.Entry); i.next();; String bindingName = (String); entry.getKey();; IBinding binding = (IBinding); entry.getValue();; parameters.put(bindingName, binding.getObject(););; } } else { parameters = Collections.EMPTY_MAP; } ParameterizedServiceParameter psp = new ParameterizedServiceParameter( getTargetPage();, parameters);; return getParameterizedService();.getLink(false, psp);; } public abstract String getTargetPage();; public abstract ParameterBinder getParameterBinder();; } <component-specification class="tapestry.jwc.ParameterizedLink"> <description>Creates link using the parameterized service, which can pass service parameters to the targeted page and autobind those.</description> <parameter name="page" required="yes" property="targetPage"/> <parameter name="parameterBinder"/> .... </component-specification> 3、参照ExternalService定义新的服务ParameterizedService private String _parameterBinderId = "parameterBinder";//可使用hivemind注入其他名称 public void service(IRequestCycle cycle); throws IOException { String pageName = cycle.getParameter(ServiceConstants.PAGE);; IPage rawPage = cycle.getPage(pageName);; cycle.activate(rawPage);; autoBindParameters(cycle, rawPage);; _responseRenderer.renderResponse(cycle);; } private void autoBindParameters(IRequestCycle cycle, IPage page); { ParameterBinder binder = (ParameterBinder); page .getComponents();.get(_parameterBinderId);; if (binder == null); { return; } if (LOG.isDebugEnabled();); { LOG.debug("Begin binding parameters by component " + binder.getId(););; } Map bindingMap = binder.getBindings();; for (Iterator i = bindingMap.entrySet();.iterator();; i.hasNext();; ); { Map.Entry entry = (Map.Entry); i.next();; String bindingName = (String); entry.getKey();; IBinding binding = (IBinding); entry.getValue();; String rawValue = cycle.getParameter(bindingName);; if (rawValue != null); { Object value = _dataSqueezer.unsqueeze(rawValue);; binding.setObject(value);; if (LOG.isDebugEnabled();); { LOG.debug("bindingName:" + bindingName);; LOG.debug("binding:" + binding);; LOG.debug("parameter value:" + value);; } } } } 实现限制: 1.每个需要有自动绑定参数功能的Page,必须定义一个指定ID的ParameterBinder组件 2.ParameterBinder组件不可传递保留的参数名,如page/id之类的,因此导致url参数名中不可有这些保留名称。 3.参数值仍然遵守tapestry的DataSqueezer规范(有好有坏)。 |
|
返回顶楼 | |
发表时间:2006-06-13
非常感谢各位关注,想不到传个参数还挺麻烦的
|
|
返回顶楼 | |
发表时间:2006-06-22
真是麻烦呀。
|
|
返回顶楼 | |
发表时间:2006-06-25
看看ExternalLink的例子, 不用那么麻烦的。
|
|
返回顶楼 | |