3

有谁知道将请求参数绑定到 adobe CQ5 中的对象的任何方式(如在 Spring MVC 或其他此类框架中)?

或者,如果没有办法直接在 CQ5 中执行此操作,是否有人集成了 3rd 方框架来执行此操作?

4

1 回答 1

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 后缀时尽可能利用调度程序缓存。例如,给定 URL 为/content/myApp/en_US/myPage.html/key1=value1/key2=value2.html,我们将后缀解析为{"key1":"value1" 的 Map<String, String>, "key2":"value2"}。您可以通过扩展 ServletRequestDataBinder 并覆盖 #addBindValues(MutablePropertyValues mpvs, ServletRequest request) 方法来绑定这些值。例如:

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"}

于 2012-11-11T22:00:38.110 回答