Spring Portlet MVC:将请求参数转发到模型

发布于 2024-10-01 08:55:55 字数 1434 浏览 5 评论 0原文

我有两个视图:

  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 自动为你剂量”。但我无法证实这一点。

感谢您的帮助...

I got two views:

  1. Displays some common information about an entity
  2. Displays more details about this entity

The second view has a link back to the first one. To create the link I need some informations, lets say two ids ("id1" and "id2"). Theses ids are passed to the controller of the second view by request parameters.

To create the back link in the second view, I have to forward the request parameters to the model manualy. This is not very convenient.

Is there any approach to do this forwarding automatically?

Here an example:

Link to details in the first view:

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

Render method in the second controller:

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

Back link in the second view:

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

I searched the internet for houres to find something like a trick I missed. But the only thing I found was: "Spring dose it automatically for you". But I can't confirme this.

Thanks for your help...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

别闹i 2024-10-08 08:55:55

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

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

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

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

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

Ok, if @ModelAttribute does not help how about a bit more complex approach:

Make a class that implements org.springframework.web.portlet HandlerInterceptor. You need to override a bunch of methods, but in one of them postHandleRender, do the setting of your id's to the model.

Make sure that every implementing method that returns a boolean, returns true. Otherwise your portlets methods might not get called (if, for example, preHandleRender returns false).

The interceptor must be introduced to your portlet in order for it to work, ofcourse. This can be done by adding the following to the portlet's context-config:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="some.package.to.my.interceptors.MyInterceptor"/>
    </property>         
</bean>
〃安静 2024-10-08 08:55:55

尝试使用 @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 的显式设置。
我没有对此进行测试,因此如果有效,请在此处报告。

Try marking your id's with @ModelAttribute:

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

Notice, that i commented out the explicit setting of id's to the model.
I did not test this, so please do report back here if it works..

雪花飘飘的天空 2024-10-08 08:55:55

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

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

You can simply write a method like below and add generate a Map. Add it to the Model 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;

    }

Call this method from your RenderMapping method to add all your request parameters to the ModelMap.

modelMap.addAllAttributes(getParamterMap(request));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文