论坛首页 Java企业应用论坛

tapetry能通过超连接传参数吗?

浏览 5607 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-06-07  
类似jsp传参的方式 XXX.jsp?id=123
我试了下面的通不过
http://localhost:8080/jycrm/app?service=page/UserAdmin?id=123
   发表时间:2006-06-07  
http://localhost:8080/jycrm/app?service=page/UserAdmin&id=123
改成这样试试
0 请登录后投票
   发表时间:2006-06-08  
试了取不到值:(
0 请登录后投票
   发表时间:2006-06-08  

HttpRequest.getParameter("id")  这样拿不到吗
0 请登录后投票
   发表时间:2006-06-09  
Tapestry中有专门做这个事情的,用IExternalPage。

UserAdmin 实现IExternalPage。
0 请登录后投票
   发表时间: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规范(有好有坏)。
0 请登录后投票
   发表时间:2006-06-13  
非常感谢各位关注,想不到传个参数还挺麻烦的
0 请登录后投票
   发表时间:2006-06-22  
真是麻烦呀。
0 请登录后投票
   发表时间:2006-06-25  
看看ExternalLink的例子, 不用那么麻烦的。
0 请登录后投票
论坛首页 Java企业应用版

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