经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Spring MVC 数据绑定 (四)
来源:cnblogs  作者:黄浩#  时间:2018/11/8 9:56:58  对本文有异议

完整的项目案例: springmvc.zip

目录

实例

项目结构路径:

一、配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6.  
  7. <!-- 配置请求总控器 -->
  8. <servlet>
  9. <servlet-name>dispatcher</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:dispatcher-servlet.xml</param-value>
  14. </init-param>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>dispatcher</servlet-name>
  18. <url-pattern>/</url-pattern>
  19. </servlet-mapping>
  20. </web-app>
View Code

二、配置dispatcher-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xmlns:mcv="http://www.springframework.org/schema/mvc"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/mvc
  12. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  13.  
  14. <!-- 启用注解并扫描 -->
  15. <context:component-scan base-package="edu.nf.ch04.controller"/>
  16.  
  17. <!-- 启用mvc注解驱动,这个注解同时还注册了Springmvc内置的多种HttpMessageConverter(消息转换器),
  18. 它主要用于将Http请求报文的字符串信息转换成用@ReqeustBody注解修饰的方法参数对象,
  19. 同时基于@ResponseBody修饰的返回值进行数据转换然后响应客户端。如果请求处理方法的参数和方法的返回值
  20. 没有使用@RequestBody和ResponseBody,那么spring将使用额外的Converter SPI来完成请求方法参数的类型转换-->
  21.  
  22. <!-- 可以指定conversion-service来自定义Converter转换器。
  23. 注意:自定义Converter和自定义HttpMessageConverter是两种不同的转换器,
  24. 自定义Converter是实现Converter接口,而自定义HttpMessageConverter是
  25. 实现HttpMessageConverter接口,如果需要自定义HttpMessageConverter可以在
  26. <mvc:annotation-driven>中加入配置<mvc:message-converters>-->
  27. <mvc:annotation-driven conversion-service="conversionService">
  28. <!-- 自定义一个消息转换器,register-defaults设置为true
  29. 则同时注册默认的HttpMessageConverter和自定义的HttpMessageConverter,
  30. 设置为false则只会注册自定义的HttpMessageConverter-->
  31. <!--<mvc:message-converters register-defaults="true">
  32. <ref bean="myMessageConverter"/>
  33. </mvc:message-converters>-->
  34. </mvc:annotation-driven>
  35.  
  36. <!-- 指定Converter转换器,
  37. 配置ConversionServiceFactoryBean来注册一个自定义Converter -->
  38. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  39. <property name="converters">
  40. <bean class="edu.nf.ch04.converter.MyConverter"/>
  41. </property>
  42. </bean>
  43.  
  44. <!-- 处理静态资源-->
  45. <mcv:default-servlet-handler/>
  46.  
  47. <!-- 配置视图解析器-->
  48. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  49. <property name="prefix" value="/WEB-INF/jsp/"/>
  50. <property name="suffix" value=".jsp"/>
  51. </bean>
  52. </beans>

三、数据绑定controller(DemoController)

  1. package edu.nf.ch04.controller;
  2. import edu.nf.ch04.entity.Address;
  3. import edu.nf.ch04.entity.Users;
  4. import org.springframework.beans.propertyeditors.CustomDateEditor;
  5. import org.springframework.format.datetime.DateFormatter;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.WebDataBinder;
  8. import org.springframework.web.bind.annotation.*;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpSession;
  12. import java.text.SimpleDateFormat;
  13. import java.util.Date;
  14. /**
  15. * @author wangl
  16. * @date 2018/10/29
  17. */
  18. @Controller
  19. public class DemoController {
  20. /**
  21. * 默认参数名对应<input name="名称"/>,
  22. * 如果名称不一致时,可以使用@RequestParam注解进行绑定
  23. * 而注解的value对应<input name="名称"/>
  24. * @param userName
  25. * @param age
  26. * @return
  27. */
  28. @PostMapping("/add")
  29. public ModelAndView add(@RequestParam("userName") String userName, @RequestParam("age") Integer age){
  30. System.out.println(userName);
  31. System.out.println(age);
  32. return new ModelAndView("index");
  33. }
  34. /**
  35. * 也可以映射成一个Bean对象,而对象的字段名对应<input name="名称"/>
  36. * ,也可以将要映射的集合对象定义在实体对象中,同样可以完成集合类型的映射
  37. * (注意:不能单独在controller的方法参数中声明List等集合类型,spring是不会自动映射的
  38. * @param user
  39. * @return
  40. */
  41. @PostMapping("/add2")
  42. public ModelAndView add2(Users user){
  43. System.out.println(user.getUserName());
  44. System.out.println(user.getAge());
  45. for (Address address : user.getAddress()) {
  46. System.out.println(address.getAddr());
  47. }
  48. return new ModelAndView("index");
  49. }
  50. /**
  51. * 通过请求url地址映射参数
  52. * 使用@PathVariable注解映射url地址中的变量名,
  53. * value属性值对应{userId}
  54. * @param uid
  55. * @return
  56. */
  57. @GetMapping("/user/{userId}")
  58. public ModelAndView getUser(@PathVariable("userId") Integer uid){
  59. ModelAndView mv = new ModelAndView("userinfo");
  60. if(uid == 1001){
  61. Users user = new Users();
  62. user.setUserName("user1");
  63. user.setAge(21);
  64. //类似于放入请求作用域
  65. mv.addObject("user", user);
  66. }
  67. return mv;
  68. }
  69. /**
  70. * 方式一:
  71. * 日期转换方法,@InitBinder标注的方法会在执行controller方法之前先执行
  72. * ,并且需要传入一个WebDataBinder参数,这个参数用于注册日期类型转换器
  73. * @param binder
  74. * @return
  75. */
  76. @InitBinder
  77. public void convert(WebDataBinder binder){
  78. binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
  79. }
  80. /**
  81. * 日期类型的转换处理,先会执行上面@InitBinder标注的方法注册一个日期转换器,
  82. * 再调用当前的controller方法将转换的值赋值到user实体中的birth字段
  83. * @param user
  84. * @return
  85. */
  86. @PostMapping("/add3")
  87. public ModelAndView convertDate(Users user){
  88. System.out.println(user.getBirth());
  89. return new ModelAndView("index");
  90. }
  91. /**
  92. * 传入ServletAPI的原生对象
  93. * @param request
  94. * @param session
  95. * @return
  96. */
  97. @GetMapping("/api")
  98. public ModelAndView servletApi(HttpServletRequest request, HttpSession session){
  99. System.out.println(request);
  100. System.out.println(session);
  101. return new ModelAndView("index");
  102. }
  103. }

前端请求页面:(adduser.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post" action="add3">
  9. Username:<input type="text" name="userName"/><br/>
  10. Age:<input type="text" name="age"/><br/>
  11. Birth:<input type="text" name="birth"><br/>
  12. <!-- 映射集合类型(普通类型) -->
  13. <!--Addr1:<input type="text" name="address"/><br/>
  14. Addr2:<input type="text" name="address"/><br/>-->
  15. <!-- 映射集合(实体对象)-->
  16. Addr1:<input type="text" name="address[0].addr"/><br/>
  17. Addr2:<input type="text" name="address[1].addr"/><br/>
  18. <input type="submit" value="add"/>
  19. </form>
  20. </body>
  21. </html>
View Code

前端请求页面:(getuser.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <a href="user/1001">获取用户信息</a>
  9. </body>
  10. </html>
View Code

四、自定义类型转换 (ConverterController)

  1. package edu.nf.ch04.controller;
  2. import edu.nf.ch04.entity.People;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.servlet.ModelAndView;
  6. /**
  7. * @author wangl
  8. * @date 2018/10/31
  9. */
  10. @Controller
  11. public class ConverterController {
  12. /**
  13. * 自定义类型转换
  14. * @param people
  15. * @return
  16. */
  17. @PostMapping("/convert")
  18. public ModelAndView convert(People people){
  19. System.out.println(people.getName());
  20. System.out.println(people.getAge());
  21. return new ModelAndView("index");
  22. }
  23. }

自定义类型转换器:

  1. package edu.nf.ch04.converter;
  2. import edu.nf.ch04.entity.People;
  3. import org.springframework.core.convert.converter.Converter;
  4. /**
  5. * @author wangl
  6. * @date 2018/10/31
  7. * 自定义类型转换器,需要实现Converter接口,
  8. * 这个转换器将name-age格式的字符串转换成People对象
  9. */
  10. public class MyConverter implements Converter<String, People> {
  11. @Override
  12. public People convert(String s) {
  13. People p = new People();
  14. if(s != null && !"".equals(s)){
  15. String[] array = s.split("-");
  16. if(array.length == 2){
  17. p.setName(array[0]);
  18. p.setAge(Integer.valueOf(array[1]));
  19. }
  20. }
  21. return p;
  22. }
  23. }

前台页面(converter.html):

 

实体类:

Address:

  1. package edu.nf.ch04.entity;
  2. /**
  3. * @author wangl
  4. * @date 2018/10/29
  5. */
  6. public class Address {
  7. private String addr;
  8. public String getAddr() {
  9. return addr;
  10. }
  11. public void setAddr(String addr) {
  12. this.addr = addr;
  13. }
  14. }
View Code

People:

  1. package edu.nf.ch04.entity;
  2. /**
  3. * @author wangl
  4. * @date 2018/10/31
  5. */
  6. public class People {
  7. private String name;
  8. private Integer age;
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public Integer getAge() {
  16. return age;
  17. }
  18. public void setAge(Integer age) {
  19. this.age = age;
  20. }
  21. }
View Code

Users:

  1. package edu.nf.ch04.entity;
  2. import org.springframework.format.annotation.DateTimeFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. /**
  7. * @author wangl
  8. * @date 2018/10/29
  9. */
  10. public class Users {
  11. private String userName;
  12. private Integer age;
  13. /**
  14. * 方式二:
  15. * 在实体中使用@DateTimeFormat完成日期的类型转换
  16. */
  17. //@DateTimeFormat(pattern = "yyyy-MM-dd")
  18. private Date birth;
  19. /**
  20. * 映射集合(集合中是普通的类型,如String)
  21. */
  22. //private List<String> address = new ArrayList<>();
  23.  
  24. /**
  25. * 映射集合(集合中是实体对象类型)
  26. */
  27. private List<Address> address = new ArrayList<>();
  28. public String getUserName() {
  29. return userName;
  30. }
  31. public void setUserName(String userName) {
  32. this.userName = userName;
  33. }
  34. public Integer getAge() {
  35. return age;
  36. }
  37. public void setAge(Integer age) {
  38. this.age = age;
  39. }
  40. /*public List<String> getAddress() {
  41. return address;
  42. }
  43. public void setAddress(List<String> address) {
  44. this.address = address;
  45. }*/
  46.  
  47. public Date getBirth() {
  48. return birth;
  49. }
  50. public void setBirth(Date birth) {
  51. this.birth = birth;
  52. }
  53. public List<Address> getAddress() {
  54. return address;
  55. }
  56. public void setAddress(List<Address> address) {
  57. this.address = address;
  58. }
  59. }
View Code

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号