Spring MVC 初始化

本文最后更新于:2024年9月8日 晚上

Spring MVC 初始化

pom.xml

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency

Tomcat 配置

  • 配置web.xml ,注册DispatcherServlet
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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个Spring MVC的配置文件:[servlet-name]-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>

<!--/ 匹配所有的请求(不包括.jsp)-->
<!--/* 匹配所有的请求(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
  • / 和 /* 的区别:< url-pattern > / </ url-pattern > 不会匹配到.jsp,只针对我们编写的请求;即:.jsp 不会进入Spring的 DispatcherServlet类,< url-pattern > /* </ url-pattern> 会匹配 *.jsp,会出现返回 jsp视图时再次进入Spring的DispatcherServlet 类,导致找不到对应的controller而所以报404错。

配置文件

  • 编写Spring MVC 的配置文件。
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
53
54
55
56
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!-- 自动扫描包,让指定包下的注解生效,由IoC容器统一管理 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 让Spring MVC不处理静态资源,访问静态资源的时候就转交给默认的Servlet来响应静态文件,否则报404 找不到静态资源错误 -->
<mvc:default-servlet-handler />

<!-- 逻辑资源路径到物理资源路径的对应 -->
<mvc:resources>
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
</mvc:resources>

<!--处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>


<!--
支持mvc注解驱动。
在Spring中一般采用@RequestMapping注解来完成映射关系。
要想使@RequestMapping注解生效。
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例。
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例的注入。
-->
<mvc:annotation-driven />

<!-- 收到相应请求后直接选择相应的视图-->
<mvc:view-controller path="/hello" view-name="test"/>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>

<!-- 注册Controller -->
<bean name="/test" class="com.example.controller.TestController"/>
</beans>
  • 注意:在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。

创建Controller

实现Controller接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
public class TestController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView 模型和视图。
ModelAndView mv = new ModelAndView();
// 封装对象,放在ModelAndView中,Model
mv.addObject("msg","HelloSpring MVC!");
// 封装要跳转的视图,放在ModelAndView中。
mv.setViewName("test"); //: /WEB-INF/jsp/hello.jsp
return mv;
}

}

通过注解创建

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
@RequestMapping("/HelloController")
public class HelloController {

// 真实访问地址:项目名/HelloController/hello
@RequestMapping("/hello")
public String sayHello(Model model){
// 向模型中添加属性msg与值,可以在JSP页面中取出并渲染。
model.addAttribute("msg","hello,Spring MVC");
//web-inf/jsp/hello.jsp
return "hello";
}
}

注意

  • 方法中声明Model类型的参数是为了把Action中的数据带到视图中。
  • 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!