java SpringMVC

web程序基本架构:

web程序基本架构

入门程序

需求:点击超链接,发送请求,转发到成功JSP页面

搭建开发环境

加快 maven 项目构建速度键值对属性:

archetypeCatalog internal

  1. 在 pom.xml 中配置项目依赖:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>

    <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    ```

    2. 在 web.xml 中配置前端控制器

    配置servlel

    ```xml
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>

部署 tomcat,然后在 resources 资源文件夹下新建 springmvc 的配置文件,文件名随意,这里为”springmvc”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启注解扫描 -->
<context:component-scan base-package="com.test.controller"></context:component-scan>
</beans>

新建java类:com.test.controller.HelloController.class,并加上注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 控制器类
@Controller
public class HelloController {

@RequestMapping(path="hello")
public String sayHello () {
System.out.println("Hello SpringMVC");
return "success";
}
}

现在还没加载 springmvc.xml 配置文件,所以需要在 web.xml 中配置:init-param 和 load-on-startup:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
```

在 WEB-INF 下新建 pages 文件夹,新建 success.jsp, 文件名与 sayHello 方法返回字符串相同:内容为:`<h3>入门成功</h3>`

最后在 springmvc 配置文件中配置视图解析器

```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启注解扫描 -->
<context:component-scan base-package="com.test"></context:component-scan>

<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 跳转目录 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 跳转文件后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>

<!-- 开启springMVC框架注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>

常用注解

一. RequestParam

作用:把请求中指定名称的参数给控制器中的形参赋值

属性:value:请求参数中的名称,required:请求参数中是否必须提供此参数。默认值:true,表示必须提供,如果不提供将报错。

1
2
3
4
5
6
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
System.out.println("执行了...");
System.out.println(username);
return "success";
}

二. RequestBody

作用:用于获取请求体内容。直接使用得到的是 key=value&key=value…结构的数据,get请求方式不适用

属性:required: 是否必须有请求体,默认值是true。当取值为true时,get 请求方式会报错。如果取值为false,get请求得到的是null。

1
2
3
4
5
6
@RequestMapping("/testRequestBody")
public String testRequestParam(@RequestBody String body){ // 获取请求体的内容
System.out.println("执行了...");
System.out.println(body);
return "success";
}

三. PathVarbale

作用:用于绑定url中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 url 的一个重要标志。

属性:value: 用于指定 url 中占位符名称。required: 是否必须提供占位符。

1
2
3
4
5
6
@RequestMapping("/testPathVarbale/{sid}")
public String testRequestParam(@PathVarbale(name="sid") String id){
System.out.println("执行了...");
System.out.println(id);
return "success";
}

四. RequestHeader

作用:用于获取请求消息头

属性:value:提供消息投名称,required: 是否必须有此消息头

注:在实际开发中一般不怎么使用。

1
2
3
4
5
6
@RequestMapping("/testRequestHeader")
public String testRequestParam(@RequestHeader(value="Accept") String header){
System.out.println("执行了...");
System.out.println(header);
return "success";
}

五. CookieValue

作用:用于把指定 cookie 名称的值传入控制器方法参数

属性:value:指定 cookie 的名称,required: 是否必须有此cookie

1
2
3
4
5
6
@RequestMapping("/testCookieValue")
public String testRequestParam(@CookieValue(value="JESSIONID") String cookieValue){
System.out.println("执行了...");
System.out.println(cookieValue);
return "success";
}

六. ModelAttribute

作用:该注解是 springMVC4.3 版本后新加入的。它可以用于修饰方法和参数。

  • 出现在方法上,表示当前方法会在控制器的方法执行前执行。可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
  • 出现在参数上,获取指定的数据给参数赋值。

属性: value:用于获取数据的 key。 key 可以是POJO的属性名称,也可以是map结构的key

应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据字段使用数据库对象原来的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute执行了...");
System.out.println(cookieValue);
return "success";
}
// 该方法会先执行
@ModelAttribute
public String showUser(String uname){
System.out.println("showUser执行了...");
// 通过用户进行查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20)
user.setDate(new Date());
return user;
}

七. SessionAttribute

作用:用于多次执行控制器方法间的参数共享

属性: value:用于指定存入的属性名称,type:用于指定存入的数据类型