0. SpringMVC的工作流程图
其工作流程为:
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(二者组成HandlerExecutionChain),并将其一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet对用户进行响应
1. 使用IDE创建一个Maven web工程(如何创建略去。。)
2. 添加maven依赖
<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>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
3. 在web.xml文件中配置SpringMVC的DispatcherServlet
<servlet>
<!-- Servlet名字 -->
<servlet-name>springmvc</servlet-name>
<!--
Servlet对应的类:核心控制器
核心功能是分发请求,请求会被分发给对应的处理的Java类,SpringMVC中称为handler
-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
配置Serlvet初始化参数
DispatcherServlet 加载时会需要一个Sping MVC的配置文件,默认情况下,应用会去应用程序文件夹的
/WEB-INF/下查找对应的[servelt-name]-servlet.xml文件,例如本例的[servelt-name]是springmvc,
默认查找的就是/WEB-INF/springmvc-config.xml
也可以把Spring MVC的配置文件放到应用程序文件夹中的任何地方,用init-param的子元素param-value描述
DispatcherServlet 加载到springmvc-config.xml配置文件,解析该文件内容并根据文件配置信息创建一个
WebApplicationContext容器对象,也称之为上下文环境。有了该容器,就可以使用IOC,AOP等功能了。
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<!-- 在web应用启动时立即加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 请求对应的servlet的名字 -->
<servlet-name>springmvc</servlet-name>
<!-- 监听对请求域的所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
4. 创建springmvc-config.xml,配置Controller
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!--
配置Handle,映射"/hello"请求
-->
<bean name="/hello" class="com.ghq.controller.HelloController"/>
<!--
处理映射器将Bean的name作为url进行查找,需要在配置Handler时指定name(即url)
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--
SimpleControllerHandlerAdapter 是一个处理器适配器,
所有处理适配器都要实现SimpleControllerHandlerAdapter接口
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--
视图解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
5. Controller的实现
package com.ghq.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* HelloController是一个控制器,可以处理一个单一的请求动作
* @author snow
*/
public class HelloController implements Controller{
private static final Log logger = LogFactory.getLog(HelloController.class);
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("Handler被调用");
ModelAndView mv = new ModelAndView();
mv.addObject("msg","Helloworld");
mv.setViewName("/index.jsp");
return mv;
}
}
6. index.jsp
<html>
<body>
<h2>Hello World!</h2>
${requestScope.msg}
</body>
</html>
7. 部署应用,并访问
http://localhost:9090/hello
页面显示结果如下:
8. 基于注解开发
修改Controller类,代码如下:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* HelloController是一个控制器,可以处理一个单一的请求动作
* @author snow
*/
@Controller
public class HelloController {
private static final Log logger = LogFactory.getLog(HelloController.class);
/**
* RequestMapping注解用来映射请求的URL和请求方法等,这里映射/hello
* @return
*/
@RequestMapping(value = "/hello")
public ModelAndView hello() {
logger.info("Handler被调用");
ModelAndView mv = new ModelAndView();
mv.addObject("msg","Hello canglaoshi");
mv.setViewName("/index.jsp");
return mv;
}
}
修改springmvc-config.xml文件,代码如下:
<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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--
spring可以自动去扫描base-package下面的包或者子包下面的Java文件
如果扫描到有Spring的相关注解类,则把这些类注册为Spring的bean
-->
<context:component-scan base-package="com.ghq"/>
<!-- 配置annotation类型的处理映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerMapping"/>
<!-- 配置annotation类型的处处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
重新部署项目,再次请求,访问结果略去。。