SpringMVC的组件
前端控制器(DispatcherServlet)
本质上是一个Servlet,相当于一个中转站,所有的访问都会走到这个Servlet中,再根据配置进行中转到相应的Handler(Controller)中进行处理,获取到数据和视图后,在使用相应视图做出响应。
处理器映射器(HandlerMapping)
本质上就是一段映射关系,将访问路径和对应的Handler(Controller)存储为映射关系,在需要时供前端控制器查阅。
处理器适配器(HandlerAdapter)
本质上是一个适配器,可以根据要求找到对应的Handler(Controller)来运行。前端控制器通过处理器映射器找到对应的Handler信息之后,将请求响应和对应的Handler信息交由处理器适配器处理,处理器适配器找到真正handler执行后,将结果即model和view返回给前端控制器
视图解析器(ViewResolver)
本质上也是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后得到model和view,将view信息传给视图解析器得到真正的view。
图解
SpringMVC入门案例
创建web项目,并导入SpringMVC相关开发包
配置前段控制器
本质上是一个servlet,在当前web项目中配置该servlet
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
生成SpringMVC的核心配置文件
SpringMVC会自动去寻找 [前端控制前ServletName]-servlet.xml 作为当前SpringMVC的核心配置文件。
创建这个文件,这个文件本身其实就是Spring的配置文件,所以导入Spring相关的约束信息,包括 beans、context、mvc
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> </beans>
修改SpringMVC核心配置文件的位置
SpringMVC默认在和web.xml相同的位置即WEB-INF目录下寻找核心配置文件
缺点是:
配置文件放置在WEB-INF目录下,不便于管理
配置文件的名称自动生成,无法手动指定
可以通过配置,手动指定核心配置文件的位置,和文件的名称:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
创建控制器,编写代码
想要开发一个控制器,写一个类实现Controller接口,在其中的handlerRequest中编写代码处理请求,并将处理好的数据和目标视图封装到ModelAndView中返回
package cn.tedu.springmvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class Hello implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 1.创建 modelandview 对象 ModelAndView mav = new ModelAndView(); // 2.封装数据 mav.addObject("msg1","hello,world"); mav.addObject("msg2", "hello,springmvc"); // 3.封装视图 mav.setViewName("hello"); //4.返回ModelAndVeiw return mav; } }
配置处理器映射器中的路径和处理器的映射关系
<!-- 配置处理器映射器的路径和控制器的映射关系 --> <bean name="/hello.action" class="cn.tedu.springmvc.controller.Hello"></bean>
配置视图解析器
通过在视图名称中加入前缀(prefix)和后缀(suffix),得到真正的视图地址。
<!-- 配置视图解析器中 视图名称 和 真正视图页面的映射关系 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF"></property> <property name="suffix" value=".jsp"></property> </bean>
开发视图
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> </head> <body> welcome! <hr> <p>${msg1}</p> <p>${msg2}</p> <%=new Date() %> </body> </html>
发布应用,通过浏览器访问
源码
源码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.tedu.springmvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class Hello implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 1.创建 modelandview 对象 ModelAndView mav = new ModelAndView(); // 2.封装数据 mav.addObject("msg1","hello,world"); mav.addObject("msg2", "hello,springmvc"); // 3.封装视图 mav.setViewName("hello"); //4.返回ModelAndVeiw return mav; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!-- 配置处理器映射器的路径和控制器的映射关系 --> <bean name="/hello.action" class="cn.tedu.springmvc.controller.Hello"></bean> <!-- 配置视图解析器中 视图名称 和 真正视图页面的映射关系 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> </head> <body> welcome! <hr> <p>${msg1}</p> <p>${msg2}</p> <%=new Date() %> </body> </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>