一.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     }
02-10 15:57