初识SpringMVC
SpringMVC是SpringFramework的一部分,是基于Java实现MVC的轻量级的web框架
- MVC:
M:model模型
View:视图
Controller:控制器
降低视图与业务之间的双向耦合,是一种架构模式。
Spring MVC
1、轻量级,简单易学
2、高效,基于请求响应的MVC框架
3、与Spring兼容性好,无缝结合
4、约定优于配置
5、功能强大:RESTful、数据验证、格式化、本地化、主题
6、简洁灵活
配置版
Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器(不同的方法和类)。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明
以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet(继承自HttpServlet基类)
SpringMVC原理
实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现
- 1、DispatcherServlet表示前端控制器,是整个SpringMvc的控制中心,用户发出请求,DispatcherServlet接收请求并拦截请求。
- 我们假设请求的url为:http://localhost:8080/SpringMVC/hello如上url拆分成三部分:
- http://localhost:8080服务器域名
- SpringMVC部署在服务器上的web站点
- hello表示控制器
- 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
-
2. HandlerMapping为处理器映射。DispatcherServlet调用 HandlerMapping,HandlerMapping根据请求url查找Handler。
-
3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为: hello。
-
4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
-
5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
-
6.Handler让具体的Controller执行。
-
7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
-
8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
-
9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
-
10.视图解析器将解析的逻辑视图名传给DispatcherServlet。
实践
先创建一个视图
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
配置web.xml文件
在web中配置DispatcherServlet
<?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">
<!--配置DispatcherServlet:这个是SpringMVC的核心:请求分发器、前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要绑定Spring的配置文件-->
<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>
<!--在Springmvc中,
/ 只匹配所有的请求,不会去匹配jsp
/* 匹配所有的请求包括jsp页面-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
链接到spring的配置文件
在spring的配置文件中注入处理器映射器
在spring的配置文件中注入处理器适配器
在spring的配置文件中注入视图解析器
<?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.xsd">
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--因为上面的处理器映射器是使用的BeanName所以就需要利用bean的名字来找到控制器-->
<bean id="/hello" class="com.my.controller.HelloController"/>
</beans>
创建Controller
package com.my.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//业务代码
String result = "HelloSpringMvc";
mv.addObject("msg",result);
// 跳转视图
mv.setViewName("test");
return mv;
}
}
运行
总流程