【问题标题】:Spring Portlet MVC: Forward Request parameters to modelSpring Portlet MVC:将请求参数转发到模型
【发布时间】:2010-11-11 10:16:48
【问题描述】:

我有两种观点:

  1. 显示有关实体的一些常见信息
  2. 显示有关此实体的更多详细信息

第二个视图有一个指向第一个视图的链接。要创建链接,我需要一些信息,比如说两个 id(“id1”和“id2”)。这些 id 通过请求参数传递给第二个视图的控制器。

要在第二个视图中创建反向链接,我必须手动将请求参数转发给模型。这不是很方便。

有什么方法可以自动转发吗?

这里是一个例子:

第一个视图中的详细信息链接:

<portlet:renderURL var="detailsUrl">
    <portlet:param name="action" value="showDetails" />
    <portlet:param name="id1" value="${entity.id1}" />
    <portlet:param name="id2" value="${entity.id2}"/>
</portlet:renderURL>
<a href="${detailsUrl}">Details</a>

第二个控制器中的渲染方法:

@RenderMapping(params = "action=showDetails")
public String showDetails (
        @RequestParam("id1") int id1,
        @RequestParam("id2") int id2,
        Model model) {
    // The current unconvenient approach
    model.addAttribute("id1", id1);
    model.addAttribute("id2", id2);

    return "showDetails";
}

第二个视图中的返回链接:

<portlet:renderURL var="entityUrl">
    <portlet:param name="action" value="showEntity" />
    <portlet:param name="id1" value="${id1}" />
    <portlet:param name="id2" value="${id2}"/>
</portlet:renderURL>
<a href="${entityUrl}">Back</a>

我在互联网上搜索了几个小时,以找到一个我错过的技巧。但我发现的唯一一件事是:“春天会自动为你服用”。但我无法确认。

感谢您的帮助...

【问题讨论】:

  • 如果答案是不可能的话,对我来说没问题。

标签: spring spring-mvc portlet spring-portlet-mvc


【解决方案1】:

好的,如果 @ModelAttribute 没有帮助,那么更复杂的方法怎么样:

创建一个实现org.springframework.web.portlet HandlerInterceptor的类。您需要重写一堆方法,但在其中一个 postHandleRender 中,将您的 id 设置为模型。

确保每个返回布尔值的实现方法都返回 true。 否则您的 portlet 方法可能不会被调用(例如,如果 preHandleRender 返回 false)。

当然,必须将拦截器引入您的 portlet 才能使其工作。这可以通过将以下内容添加到 portlet 的 context-config 来完成:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="some.package.to.my.interceptors.MyInterceptor"/>
    </property>         
</bean>

【讨论】:

    【解决方案2】:

    尝试使用 @ModelAttribute 标记您的 id:

    @RenderMapping(params = "action=showDetails")
    public String showDetails (
            @ModelAttribute @RequestParam("id1") int id1,
            @ModelAttribute @RequestParam("id2") int id2,
            Model model) {
        // The current unconvenient approach
        //model.addAttribute("id1", id1);
        //model.addAttribute("id2", id2);
    
        return "showDetails";
    }
    

    请注意,我已将 id 的显式设置注释掉到模型中。 我没有对此进行测试,所以如果它有效,请在这里报告..

    【讨论】:

    • 嗨,我已经试过了。我可以告诉你这行不通。对不起。
    【解决方案3】:

    您可以简单地编写如下方法并添加生成地图。将其添加到模型地图中。

    private Map<String, String> getParamterMap(PortletRequest request){
            Map<String, String> parameters = new HashMap<String, String>();
    
            Set<String> keySet = request.getParameterMap().keySet();
            for(String key : keySet){
                parameters.put(key, request.getParameter(key));
            }
    
            return parameters;
    
        }
    

    从您的 RenderMapping 方法中调用此方法,将您的所有请求参数添加到 ModelMap。

    modelMap.addAllAttributes(getParamterMap(request));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多