假设我有一个列出表中对象的页面,我需要放置一个表单来过滤表.过滤器作为Ajax GET发送到如下URL:http://foo.com/system/controller/action?page = 1&prop1 = x&prop2 = y&prop3 = z
而不是在我的控制器上有很多参数,如:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
Run Code Online (Sandbox Code Playgroud)
假设我有MyObject:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
@RequestMapping(value = "/action") …Run Code Online (Sandbox Code Playgroud) 你能帮我写一下这个代码的spring mvc风格模拟吗?
session.setAttribute("name","value");
Run Code Online (Sandbox Code Playgroud)
以及如何将一个注释@ModelAttribute注释的元素添加到会话中,然后获取对它的访问权限?
在Spring 3中,我在jsp中的form标签中看到了两个不同的属性
<form:form method="post" modelAttribute="login">
Run Code Online (Sandbox Code Playgroud)
在此属性modelAttribute是表单对象的名称,其属性用于填充表单.我用它来发布一个表单,在控制器中,我习惯于@ModelAttribute捕获值,调用验证器,应用业务逻辑.这里一切都很好.现在
<form:form method="post" commandName="login">
Run Code Online (Sandbox Code Playgroud)
这个属性的期望是,它还是一个表单对象,我们将填充它们的属性?
如果我错了,请纠正我.两者都可用于数据绑定.
问题是何时使用@ModelAttribute?
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }
Run Code Online (Sandbox Code Playgroud)
另外,何时使用@RequestBody?
@RequestMapping(value = "/user/savecontact", method = RequestMethod.POST
public String saveContact(@RequestBody Contact contact){ }
Run Code Online (Sandbox Code Playgroud)
根据我的理解,两者都有类似的用途.
谢谢!!
假设我们有一个实体Person,一个控制器PersonController和一个edit.jsp页面(创建一个新的或编辑一个现有的人)
调节器
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editPerson(@RequestParam("fname") String fname, Model model) {
if(fname == null || fname.length() == 0){
model.addAttribute("personToEditOrCreate", new Person());
}
else{
Person p = personService.getPersonByFirstName(fname);
model.addAttribute("personToEditOrCreate", p);
}
return "persons/edit";
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String savePerson(Person person, BindingResult result) {
personService.savePerson(person);
return "redirect:/home";
}
Run Code Online (Sandbox Code Playgroud)
文件edit.jsp
<form:form method="post" modelAttribute="personToEditOrCreate" action="save">
<form:hidden path="id"/>
<table>
<tr>
<td><form:label path="firstName">First Name</form:label></td>
<td><form:input path="firstName" /></td>
</tr>
<tr>
<td><form:label path="lastName">Last Name</form:label></td>
<td><form:input path="lastName" /></td>
</tr>
<tr> …Run Code Online (Sandbox Code Playgroud) 在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数.我只是用@RequestParameter("name").但是我可以对请求属性执行相同的操作吗?目前,当我想访问请求属性时,我必须执行以下操作:
MyClass obj = (MyClass) request.getAttribute("attr_name");
Run Code Online (Sandbox Code Playgroud)
但我真的想用这样的东西代替:
@RequestAttribute("attr_name") MyClass obj
Run Code Online (Sandbox Code Playgroud)
不幸的是,它没有这种方式.我可以以某种方式扩展Spring功能并添加我自己的"绑定器"吗?
编辑 (我想要实现的目标):我将当前登录的用户存储在请求属性中.因此,每当我想访问当前登录的用户(这几乎都在每个方法中)时,我必须编写这个额外的行user = (User) request.getAttribute("user");.我想尽量缩短它,最好将它作为方法参数注入.或者,如果您知道如何通过拦截器和控制器传递某些东西,我会很高兴听到它.
我使用Spring 4.1.6.RELEASE和Spring Data Jpa 1.8.0.RELEASE.我有org.springframework.data.domain.Pageable bean创建的问题.它在我的控制器中使用:
@Controller
public class ItemsController {
@Autowired
ProductService itemsService;
@RequestMapping(value = "/openItemsPage")
public String openItemsPage() {
return "items";
}
@RequestMapping(value = "/getItems", method = RequestMethod.GET)
@ResponseBody
public Item[] getItems(Pageable pageable) {
return itemsService.getItems(pageable);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我在我的应用程序上下文中有下一个xml配置:
<context:component-scan base-package="com.mobox.controller" />
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean id="sortResolver"
class="org.springframework.data.web.SortHandlerMethodArgumentResolver" />
<beans:bean
class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
<beans:constructor-arg ref="sortResolver" />
</beans:bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)
最后,我做了客户的下一次重新计划:
$.ajax({
type: "GET",
url: "getProducts?page=0&size=100",
.....
Run Code Online (Sandbox Code Playgroud)
在tomcat日志中我看到下一个:
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/a2delivery-web] threw exception [Request processing …Run Code Online (Sandbox Code Playgroud) spring-mvc ×7
java ×3
spring ×3
annotations ×1
data-binding ×1
forms ×1
servlets ×1
session ×1