Spring MVC @RequestParam 和@SessionAttribute
Spring MVC @RequestParam and @SessionAttribute
我是 Spring 和 Portlet 开发的新手。
我正在使用 spring-webmvc-portlet,但我认为工作流程与 servlet 几乎相同。
我的用例很常见,但要让一切都按照我想要的方式工作仍然有点困难。
我有这样一个控制器:
@Controller
@RequestMapping(value = "VIEW")
@SessionAttributes(value = "persons")
public class MyController
// Display a list of person in personList.jsp
@RenderMapping(params = "actionPerson=query")
public String showList() {
return "personList";
}
@ActionMapping(params = "actionPerson=query"){
// Here is a trick I use to avoid the MissingPortletRequestParameterException
// to be raised
response.setRenderParameter("query","")
response.setRenderParameter("actionPerson","query");
}
// Return a list of person and store it in the model
@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query") String query) {
List<Person> personList = personService.SearchByName(query);
return personList;
}
到目前为止,我了解到在任何渲染过程之前,每次都会调用用@ModelAttribute 注释的方法来生成模型。
我不想每次都调用这个方法。我尝试使用注解 @SessionAttributes 将我的人员列表存储在处理程序的会话状态中。
我的问题是注解@RequestParam 提出了以下期望:
org.springframework.web.portlet.bind.MissingPortletRequestParameterException: Required String parameter 'query' is not present
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter$PortletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:559)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:514)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:155)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:369)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.doHandle(AnnotationMethodHandlerAdapter.java:356)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.handleRender(AnnotationMethodHandlerAdapter.java:296)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:764)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:537)
at org.springframework.web.portlet.FrameworkPortlet.doDispatch(FrameworkPortlet.java:483)
at javax.portlet.GenericPortlet.render(GenericPortlet.java:248)
我的猜测是即使没有调用方法 getPersons。 @RequestParam(value="query) 仍在评估中。
当我显示我的人员列表时,用户可以select一个人来获取详细信息。我希望他们在不提交新查询的情况下返回到结果列表。
我该如何正确处理这个案例?有没有办法跳过要评估的@RequestParam?
谢谢!
你可以@RequestParam
as not required
。这将使您的请求成功,但 query
将为空。
@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query" , required=false) String query) {
List<Person> personList = personService.SearchByName(query);
return personList;
}
有关 RequestParam
的更多详细信息
我是 Spring 和 Portlet 开发的新手。
我正在使用 spring-webmvc-portlet,但我认为工作流程与 servlet 几乎相同。
我的用例很常见,但要让一切都按照我想要的方式工作仍然有点困难。
我有这样一个控制器:
@Controller
@RequestMapping(value = "VIEW")
@SessionAttributes(value = "persons")
public class MyController
// Display a list of person in personList.jsp
@RenderMapping(params = "actionPerson=query")
public String showList() {
return "personList";
}
@ActionMapping(params = "actionPerson=query"){
// Here is a trick I use to avoid the MissingPortletRequestParameterException
// to be raised
response.setRenderParameter("query","")
response.setRenderParameter("actionPerson","query");
}
// Return a list of person and store it in the model
@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query") String query) {
List<Person> personList = personService.SearchByName(query);
return personList;
}
到目前为止,我了解到在任何渲染过程之前,每次都会调用用@ModelAttribute 注释的方法来生成模型。
我不想每次都调用这个方法。我尝试使用注解 @SessionAttributes 将我的人员列表存储在处理程序的会话状态中。
我的问题是注解@RequestParam 提出了以下期望:
org.springframework.web.portlet.bind.MissingPortletRequestParameterException: Required String parameter 'query' is not present
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter$PortletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:559)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:514)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:353)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:155)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:369)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.doHandle(AnnotationMethodHandlerAdapter.java:356)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.handleRender(AnnotationMethodHandlerAdapter.java:296)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:764)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:537)
at org.springframework.web.portlet.FrameworkPortlet.doDispatch(FrameworkPortlet.java:483)
at javax.portlet.GenericPortlet.render(GenericPortlet.java:248)
我的猜测是即使没有调用方法 getPersons。 @RequestParam(value="query) 仍在评估中。
当我显示我的人员列表时,用户可以select一个人来获取详细信息。我希望他们在不提交新查询的情况下返回到结果列表。
我该如何正确处理这个案例?有没有办法跳过要评估的@RequestParam?
谢谢!
你可以@RequestParam
as not required
。这将使您的请求成功,但 query
将为空。
@ModelAttribute("persons")
public List<Person> getPersons(@RequestParam(value="query" , required=false) String query) {
List<Person> personList = personService.SearchByName(query);
return personList;
}
有关 RequestParam
的更多详细信息