Spring Portlet MVC:将Request Request参数转发给model

时间:2010-11-11 10:16:49

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

我有两个观点:

  1. 显示有关实体的一些常见信息
  2. 显示有关此实体的更多详细信息
  3. 第二个视图有一个回到第一个视图的链接。要创建链接,我需要一些信息,让我们说两个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>
    

    我在互联网上搜索了一些我错过的技巧。但我发现的唯一一件事就是:“春天自动为你服用”。但我无法证实这一点。

    感谢您的帮助......

3 个答案:

答案 0 :(得分:2)

好的,如果@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>

答案 1 :(得分:0)

尝试用@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对模型的显式设置。 我没有对此进行测试,所以请在此处报告是否有效。

答案 2 :(得分:0)

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

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));