Spring Portlet MVC:将请求参数转发到模型
我有两个视图:
- 显示有关实体的一些常见信息
- 显示有关此实体的更多详细信息
第二个视图具有返回第一个视图的链接。要创建链接,我需要一些信息,比如说两个 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:
- Displays some common information about an entity
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好吧,如果 @ModelAttribute 没有帮助,那么采用更复杂的方法怎么样:
创建一个实现 org.springframework.web.portlet HandlerInterceptor 的类。您需要重写一堆方法,但在其中一个 postHandleRender 中,对模型进行 id 设置。
确保每个返回布尔值的实现方法都返回 true。否则,您的 portlet 方法可能不会被调用(例如,如果 preHandleRender 返回 false)。
当然,必须将拦截器引入您的 portlet 才能使其工作。这可以通过将以下内容添加到 portlet 的上下文配置来完成:
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:
尝试使用 @ModelAttribute 标记您的 id:
注意,我注释掉了模型中 id 的显式设置。
我没有对此进行测试,因此如果有效,请在此处报告。
Try marking your id's with @ModelAttribute:
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..
您可以简单地编写如下所示的方法并添加生成地图。将其添加到模型图。
从 RenderMapping 方法调用此方法,将所有请求参数添加到 ModelMap。
You can simply write a method like below and add generate a Map. Add it to the Model Map.
Call this method from your RenderMapping method to add all your request parameters to the ModelMap.