第三部分 细节知识点
1.REST
什么是REST:
资源状态转化,读者可自行百度了解,这里不再详述:
配置org.springframework.web.filter.HiddenHttpMethodFilter
<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter: 可以把POST请求转为DELETE或POST请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
用例:
index.jsp 添加以下代码
<a href="springmvc/testRest/1">Test Rest GET</a><br>
<form action="springmvc/testRest" method="post">
<input type="submit" value="TestRest POST">
</form>
<br>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="TestRest DELETE">
</form>
<br>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="TestRest PUT">
</form>
<br>
SpringMVCTest.java 添加以下代码
/*
* Rest风格的URL
* 以CRUD为例:
* 新增:/order POST
* 修改:/order/1 PUT
* 获取:/order/1 GET
* 删除:/order/1 DELETE
*
* 如何发送PUT请求与DELETE请求呢?
* 1.需要配置HiddenHttpMethodFilter
* 2.需要发送POST请求
* 3.需要在发送POST请求时携带一个name="_method"的隐藏域,值为PUT或DELETE
*
* 在SpringMVC的目标方法中如何得到id呢?
* 使用@PathVariable注解
* */
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.GET)
public String testRest(@PathVariable Integer id) {
System.out.println("testRest GET: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest",method = RequestMethod.POST)
public String testRest() {
System.out.println("testRest POST");
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable Integer id) {
System.out.println("testRest DELETE: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.PUT)
public String testRestPut(@PathVariable Integer id) {
System.out.println("testRest PUT: " + id);
return SUCCESS;
}
2.POJO对象绑定请求参数
- SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如dept.deptId、dept.address.tel等
测试:
- User.java(省略setter与getter、toString方法)
public class User {
private String username;
private String password;
private String email;
private int age;
private Address address;
}
- Address.java(省略setter与getter、toString方法)
public class Address {
private String province;
private String city;
}
- index.jsp添加
<form action="springmvc/testPojo" method="post">
username: <input type="text" name="username"/>
<br>
password: <input type="password" name="password"/>
<br>
email: <input type="text" name="email"/>
<br>
age: <input type="text" name="age"/>
<br>
province: <input type="text" name="address.province"/>
<br>
city: <input type="text" name="address.city"/>
<br>
<input type="submit" value="Submit"/>
</form>
- SpringMVCTest.java添加
/*
* SpringMVC 会按请求参数名和POJO属性名进行自动匹配
* 自动为该对象填充属性值。支持联机属性
* 如dept.deptId、dept.address.tel等
* */
@RequestMapping(value = "/testPojo",method = RequestMethod.POST)
public String testPojo(User user) {
System.out.println("testPojo: " + user);
return SUCCESS;
}
3.使用Servlet API作为参数
- 可以使用Servlet原生的API作为目标方法的参数 具体支持一下类型
用例:
/*
* 可以使用Servlet原生的API作为目标方法的参数 具体支持一下类型
* HttpServletRequest
* HttpServletResponse
* HttpSession
* java.security.Principal
* Local InputStream
* OutputStream
* Reader
* Writer
* */
@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest request,
HttpServletResponse response,
Writer out) throws IOException {
System.out.println("testServletAPI, " + request + ", " + response);
out.write("Hello Spring MVC");
// return SUCCESS;
}
4.处理模型数据
Spring MVC提供以下几种途径输出模型数据:
处理模型数据.png
- ModelAndView
ModelAndView.png- 示例:
SpringMVCTest.java添加:
/*
* 目标方法的返回值可以是 ModelAndView 类型。
* 其中可以包含视图和模型信息
* Spring MVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中
* */
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);
// 添加模型数据到 ModelAndView 中.
modelAndView.addObject("time",new Date());
return modelAndView;
}
index.jsp添加:
<a href="springmvc/testModelAndView">Test ModelAndView</a><br>
sussess.jsp添加:
time:${requestScope.time }
- 注意:这里有一种错误可能使页面无法跳转(导包问题):
正确: :import org.springframework.web.servlet.ModelAndView;
错误: :import org.springframework.web.portlet.ModelAndView;
- Map及Model
Map及Model.png- 示例:
SpringMVCTest.java添加:
/*
* 目标方法可以添加 Map 类型(实际上也可以是 Model 类型或ModelMap类型)
* */
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map) {
map.put("names", Arrays.asList("Tom","Jerry","Mike"));
return SUCCESS;
}
index.jsp添加:
<a href="springmvc/testMap">Test Map</a><br>
success.jsp添加:
names:${requestScope.names }
网友评论