文章目录
SpringMVC使用web工程,推荐使用2.5版本,往后的版本需要在创建时手动勾选
Generate web.xml
,才能生成xml版本。
第一步:导包
- 首先一定要导核心依赖(IoC模块),因为所有模块的运行都依赖核心模块。
- SpringMVC是Spring的web模块,需要导入web模块。
第二步:编写配置
1.web.xml文件
- 配置前端控制器
<load-on-startup>标签
:服务器启动的时候创建对象,值越小优先级越高,越先创建对象。
<url-pattern>标签
:/*
和/
都是拦截所有请求,但/*
的范围更大,还能拦截jsp请求,一旦拦截jsp页面就不能显示了。所以前端控制器中使用/
。
当然,也可以使用后缀匹配拦截。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>1.SpringMVC_helloworld</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 前端控制器 -->
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</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>
<!-- servlet启动加载,load-on-startup:服务器启动的时候创建对象,值越小优先级越高,越先创建对象。 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.springmvc.xml
- 配置视图解析器(InternalResourceViewResolver)
视图解析器通过prefix和suffix可以实现拼接页面地址。
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.gql"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
第三步:处理器
处理器接收到请求后,在控制台打印"收到请求,处理中…"然后转发到/WEB-INF/pages/success.jsp
页面。
- @RequestMapping:
告诉SpringMVC这个方法用来处理什么请求。括号中的/
可以省略,但建议写上(迎合Rest风格)。
@Controller
public class MyFirstController {
/**
* 处理当前项目下的hello请求
*/
@RequestMapping("/hello")
public String myfirstRequest() {
System.out.println("收到请求,处理中...");
return "success";
}
}
第四步:前端页面
跳转后的success.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>成功!</h1>
</body>
</html>
分析helloworld运行流程☆
运行结果
运行流程☆:
①客户端点击链接,发送请求到tomcat服务器。http://localhost:8080/1.SpringMVC_helloworld/hello
②前端控制器(dispatcherServlet)接收到所有请求。
③dispatcherServlet将请求和@RequestMapping()
标注的值进行匹配,找到目标处理器,进而找到目标方法。
④dispatcherServlet找到了目标处理器和目标方法,直接利用反射执行目标方法。
⑤方法执行后会有一个返回值,SpringMVC认为该返回值就是要转发的地址。
⑥拿到返回值后,使用视图解析器(InternalResourceViewResolver)进行拼串得到完整的页面地址。
⑦拿到页面地址后,前端控制器帮我们转发到页面。
关于SpringMVC的其他细节问题
1.不指定配置文件位置
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
上面的前端控制器使用了<init-param>标签
指定的路径(classpath:springmvc.xml)加载springmvc.xml
文件。
如果不指定的话,SpringMVC会去WEB-INF目录下找一个名为"前端控制器名称-servlet.xml"
的文件。这时可以在WEB-INF下创建一个"前端控制器名称-servlet.xml"
文件,进行相应配置也是可以的。
2.SpringMVC无法访问静态资源问题
(1)DefaultServlet
DefaultServlet是Tomcat中处理静态资源的。
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
当我们在前端控制器的<url-pattern>
标签中也用/
,就类似子类重写了父类的方法。相当于前端控制器的/
禁用了tomcat服务器中的DefaultServlet。
静态资源(dispatcherServlet)看哪个方法 @RequestMapping()标注的值是xxx.html,由于无法匹配,所以不能处理。
(1)JSPServlet
为什么能够访问jsp页面呢?
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
因为并没有覆盖服务器中JSPServlet的配置。