2012-07-12 58 views
3

有谁知道绑定请求参数给adobe CQ5中的对象的任何方式(如在spring MVC或其他类似的框架中)?Adob​​e CQ5请求参数绑定

或者如果在CQ5中没有办法直接做到这一点,有没有人有过整合第三方框架来做到这一点?

回答

1

我还没有发现任何在CQ5内部结合的东西。您可以在CQ5中使用Spring DataBinder类,这正是我所做的。只需直接使用org.springframework.web.bind.ServletRequestDataBinder类组件中,像这样:

ServletRequestDataBinder dataBinder = new ServletRequestDataBinder(myModel, "myModel"); 
dataBinder.bind(slingRequest); 

你可以通过#getBindingResult()方法,如果您可以通过DataBinder的实例org.springframework.validation.BindingResult你要。另外,您可以配置org.springframework.core.convert.ConversionService以通过ServletRequestDataBinder#setConversionService(ConversionService)方法使用。

我做的一件事情还是绑定​​Sling后缀。我在URL后缀中遵循$ {key} = $ {value}模式,以便在使用Sling后缀时尽可能利用调度程序缓存。例如,给定网址/content/myApp/en_US/myPage.html/key1=value1/key2=value2.html,我们将后缀解析为地图<字符串,字符串>的{“key1”:“ value1“,”key2“:”value2“}。您可以通过扩展ServletRequestDataBinder并重写#addBindValues(MutablePropertyValues mpvs,ServletRequest请求)方法来绑定这些值。例如:

public class SlingServletRequestDataBinder extends ServletRequestDataBinder { 
    public SlingServletRequestDataBinder(Object target, String objectName) { 
    super(target, objectName); 
    } 

    @Override 
    protected void addBindValues(MutablePropertyValues mpvs, 
     ServletRequest request) { 
    SlingHttpServletRequest slingHttpServletRequest = unwrap(request); 

    if (null == slingHttpServletRequest) { 
     return; 
    } 

    String suffix = slingHttpServletRequest.getRequestPathInfo().getSuffix(); 
    Map<String, String> suffixParameters = // parse suffix into Map here... 
    mpvs.addPropertyValues(suffixParameters); 

    super.addBindValues(mpvs, request); 
    } 

    public static SlingHttpServletRequest unwrap(ServletRequest servletRequest) { 
    // immediate termination if we found one 
    if (servletRequest instanceof SlingHttpServletRequest) { 
     return (SlingHttpServletRequest) servletRequest; 
    } 

    while (servletRequest instanceof ServletRequestWrapper) { 
     servletRequest = ((ServletRequestWrapper) servletRequest).getRequest(); 

     // immediate termination if we found one 
     if (servletRequest instanceof SlingHttpServletRequest) { 
     return (SlingHttpServletRequest) servletRequest; 
     } 
    } 

    return null; 
    } 
} 

上面应该结合使用Sling后缀和URL参数。例如,假设这种模式:

public class MyModel { 
    private String key1; 
    private String key2; 
    private String key3; 
    // getters and setters go here... 
} 

/content/myApp/en_US/myPage.html/key1=value1/key2=value2.html?key3=value3的URL,你的模型将结束作为{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”}