2.学习SpringMVC注解入门篇
一.SpringMVC执行流程
、
二.创建项目学习SpringMVC注解
按照我之前的SpringMVC创建项目,首先创建一个项目springmvc01,配置好pom.xml,web.xml,springmvc.xml文件之后创建一个HelloController。
1.RequestMapping注解
1 //控制器类 2 @Controller 3 @RequestMapping("/user") 4 public class HelloController { 5 6 @RequestMapping(path = "/hello") 7 public String sayHello() { 8 9 System.out.println("hello SpringMvc"); 10 return "success"; 11 } 12 }
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Title</title> 5 </head> 6 <body> 7 <h3>入门程序</h3> 8 <a href="/user/hello">入门程序</a> 9 10 </body> 11 </html>
补:RequestMapping的method属性用来配置请求方式:
RequestMapping的params属性:用来限制请求参数的条件
2.补充内容为请求参数的绑定
- 绑定机制:
- 支持的类型:
- 使用要求:
实现代码:
- 基本类型:只需要编写jsp页面代码和Controller代码
1 <a href="/param/testParam?username=wzh&password=123">入门程序</a>
1 /** 2 * 请求数据绑定入门 3 * @param username 4 * @param password 5 * @return 6 */ 7 @RequestMapping("/testParam") 8 public String testParam(String username,String password){ 9 10 System.out.println("执行了..."); 11 System.out.println("用户名:"+ username + ",密码:"+ password); 12 return "success"; 13 }
- POJO类型:(参数名和属性名要保持一致)
创建实体类:
创建Account实体类
1 public class Account implements Serializable { 2 3 private String username; 4 private String password; 5 private Double money; 6 7 private List<User> list; 8 private Map<String ,User> map; 9 10 public List<User> getList() { 11 return list; 12 } 13 14 public void setList(List<User> list) { 15 this.list = list; 16 } 17 18 public Map<String, User> getMap() { 19 return map; 20 } 21 22 public void setMap(Map<String, User> map) { 23 this.map = map; 24 } 25 26 // private User user; 27 28 // public User getUser() { 29 // return user; 30 // } 31 // 32 // public void setUser(User user) { 33 // this.user = user; 34 // } 35 36 public String getUsername() { 37 return username; 38 } 39 40 public void setUsername(String username) { 41 this.username = username; 42 } 43 44 public String getPassword() { 45 return password; 46 } 47 48 public void setPassword(String password) { 49 this.password = password; 50 } 51 52 public Double getMoney() { 53 return money; 54 } 55 56 public void setMoney(Double money) { 57 this.money = money; 58 } 59 60 @Override 61 public String toString() { 62 return "Account{" + 63 "username='" + username + '\'' + 64 ", password='" + password + '\'' + 65 ", money=" + money + 66 ", list=" + list + 67 ", map=" + map + 68 '}'; 69 } 70 }
创建User实体类
1 public class User implements Serializable { 2 3 private String uname; 4 private Integer age; 5 6 private Date date; 7 8 public Date getDate() { 9 return date; 10 } 11 12 public void setDate(Date date) { 13 this.date = date; 14 } 15 16 17 public String getUname() { 18 return uname; 19 } 20 21 public void setUname(String uname) { 22 this.uname = uname; 23 } 24 25 public Integer getAge() { 26 return age; 27 } 28 29 public void setAge(Integer age) { 30 this.age = age; 31 } 32 33 @Override 34 public String toString() { 35 return "User{" + 36 "uname='" + uname + '\'' + 37 ", age=" + age + 38 ", date=" + date + 39 '}'; 40 } 41 }
编写jsp代码:
如果类中还有对象则使用对象名.属性传值
1 <%--把数据封装到Account中--%> 2 <form action="/param/saveAccount" method="post"> 3 姓名:<input type="text" name="username"><br> 4 密码:<input type="text" name="password"><br> 5 金额:<input type="text" name="money"><br> 6 用户的姓名:<input type="text" name="user.uname"><br> 7 用户年龄:<input type="text" name="user.age"><br> 8 <input type="submit" value="提交"> 9 </form>
编写Controller类方法
1 /** 2 * 请求数据绑定把数据封装到JavaBean的类中 3 * @return 4 */ 5 @RequestMapping("/saveAccount") 6 public String saveAccount(Account account){ 7 8 System.out.println("执行了..."); 9 System.out.println(account); 10 11 return "success"; 12 }
- 使用集合类型List和Map:
Account类修改:
编写jsp代码:
1 <%--把数据封装到Account中,类中存在list和map的集合--%> 2 <form action="/param/saveAccount" method="post"> 3 姓名:<input type="text" name="username"><br> 4 密码:<input type="text" name="password"><br> 5 金额:<input type="text" name="money"><br> 6 7 用户的姓名:<input type="text" name="list[0].uname"><br> 8 用户年龄:<input type="text" name="list[0].age"><br> 9 10 用户的姓名:<input type="text" name="map['one'].uname"><br> 11 用户年龄:<input type="text" name="map['one'].age"><br> 12 <input type="submit" value="提交"> 13 </form>
控制器方法不变,当前端输入提交之后控制器将获得list和map中的值。
补:解决中文乱码问题:在web.xml中添加过滤器
1 <!-- 配置过滤器,解决中文乱码的问题 (注意顺序写filter和servlet这样web-app不会有红色下划线)--> 2 <filter> 3 <filter-name>characterEncodingFilter</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 5 6 <!-- 指定字符集 --> 7 <init-param> 8 <param-name>encoding</param-name> 9 <param-value>UTF-8</param-value> 10 </init-param> 11 </filter> 12 13 <filter-mapping> 14 <filter-name>characterEncodingFilter</filter-name> 15 <url-pattern>/*</url-pattern> 16 </filter-mapping>
补:自定义类型转换器(当输入Date类型不是yyyy/MM/dd而是yyyy-MM-dd时就需要类型转换器了)
添加日期类型转换类:StringToDateConverter
1 /** 2 * 字符串转日期 3 * @author USTC_WZH 4 * @create 2019-11-22 15:51 5 */ 6 public class StringToDateConverter implements Converter<String, Date> { 7 8 /** 9 * @param s 传入的字符串 10 * @return 11 */ 12 @Override 13 public Date convert(String s) { 14 15 //判断 16 if (s == null){ 17 throw new RuntimeException("请您传入数据"); 18 } 19 20 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 21 22 try { 23 //把字符串转换为日期 24 return df.parse(s); 25 } catch (Exception e) { 26 throw new RuntimeException("数据类型转换出现错误"); 27 } 28 29 } 30 }
修改springmvc.xml:
1 <!-- 注册自定义类型转换器 --> 2 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 3 <property name="converters"> 4 <set> 5 <bean class="edu.ustc.utils.StringToDateConverter"/> 6 </set> 7 </property> 8 </bean> 9 10 <!-- 配置spring开启注解mvc的支持,并配置自定义类型转换器 --> 11 <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
编写jsp代码:
1 <%--把数据封装进User中,但是User中Date格式不是yyyy/MM/dd改为了yyyy-MM-dd需要自定义类型转换器--%> 2 <form action="/param/saveUser" method="post"> 3 用户的姓名:<input type="text" name="uname"><br> 4 用户年龄:<input type="text" name="age"><br> 5 用户生日:<input type="text" name="date"><br> 6 <input type="submit" value="提交"> 7 </form>
编写控制器类的方法:
1 /** 2 * 请求数据绑定把数据封装到JavaBean的类中 3 * @return 4 */ 5 @RequestMapping("/saveUser") 6 public String saveUser(User user){ 7 8 System.out.println("执行了..."); 9 System.out.println(user); 10 11 return "success"; 12 }
补:想要在SpringMVC框架中获得Servlet原生API
编写jsp代码:
1 <%--测试原生的Servlet的API--%> 2 <a href="/param/testServlet">Servlet原生API</a>
编写控制器类的方法:
1 /** 2 * 测试原生的Servlet的API 3 * @return 4 */ 5 @RequestMapping("/testServlet") 6 public String testServlet(HttpServletRequest request, HttpServletResponse response){ 7 8 System.out.println("执行了..."); 9 10 System.out.println(request); 11 12 HttpSession session = request.getSession(); 13 System.out.println(session); 14 15 ServletContext servletContext = session.getServletContext(); 16 System.out.println(servletContext); 17 18 System.out.println(response); 19 20 return "success"; 21 }