概念
SpringMVC是Spring框架的一个模块,是一个基于MVC的web框架。
原理
1.用户发起请求到前端控制器(DispatcherServlet)
2.前端控制器(DispatcherServlet)请求处理器映射器(HandlerMapping)查找处理器(Handler),可以根据xml配置或者注解方式进行查找
3.处理器映射器(HandlerMapping)向前端控制器(DispatcherServlet)返回一个封装Handler的执行链,执行链中还包含一个或者多个拦截器(HandlerInterceptor)
4.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行Handler
5.处理器适配器(HandlerAdapter)执行Handler
6.Handler执行完成向处理器适配器(HandlerAdapter)返回一个ModelAndView
7.处理器适配器(HandlerAdapter)向前端控制器(DispatcherServlet)返回该ModelAndView
8.前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)进行视图解析,视图解析器(ViewResolver)根据逻辑视图名解析成真正的视图(jsp)
9.视图解析器(ViewResolver)向前端控制器(DispatcherServlet)返回View
10.前端控制器(DispatcherServlet)进行视图渲染,将视图渲染模型数据(在ModelAndView对象中)填充到request域
11.前端控制器(DispatcherServlet)向用户响应结果
相关组件
1.前端控制器(DispatcherServlet)
作用:用于接收用户请求,响应结果,相当于转发器,有了DispatcherServlet减少其他组件之前的耦合度
2.处理器映射器(HandlerMapping)
作用:根据请求的url查找Handler
3.处理器(Handler)
4.处理器适配器(HandlerAdapter)
作用:按照特定规则(HandlerAdapter要求的规则)执行Handler,Handler需按照HandlerAdapter的要求编写,HandlerAdapter才能正确执行
5.视图解析器(ViewResolver)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(View)
6.视图(View)
View是一个接口,它的实现类支持不同的View类型(jsp、freemarker、pdf...)
入门程序(非注解方式)
先上项目结构图
1.配置前端控制器(在web.xml中)
<?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" version="2.5"> <!-- SpringMVC的前端控制器配置 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--contextConfigLocation配置springmvc加载的配置文件(配置文件中配置映射器适配器等)--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:Config/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--url-pattern的两种配置, 一、*.action,以.action结尾都由DispatchaerServlet进行解析 二、 /,所有访问地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,此种方法可以实现restful的url--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>2.在springmvc.xml中配置处理器映射器、处理器适配器和视图解析器
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置处理器映射器 将Bean的name作为url进行查找,需要在配置Handler时指定Benaname(就是url)--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--配置Handler--> <bean name="/lala" class="Controller.HelloController"/> <!--配置处理器适配器 适配器要求所执行的Handler实现Controller接口--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> </beans>
3.编写Controller
package 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{ @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","Hello SpringMVC!!!!!!!!"); modelAndView.setViewName("WEB-INF/page/lala.jsp"); /*这里写加载的Jsp文件路径*/ return modelAndView; } } /*编写好的Handler需要在Spring容器中通过Bean进行加载*/
4.编写jsp页面
<html> <head> <title>$Title$</title> </head> <body> $END$ ${message} </body> </html>
5.访问 localhost:8080/lala
以上为非注解方式实现入门程序,下面再介绍几个非注解的适配器和映射器配置
1.简单的处理器映射器配置
<!--简单的处理器映射器配置--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/lulu">controller1</prop> <!--key为url地址,内容写Controller的Bean id--> </props> </property> </bean> <!--配置Handler--> <bean id="controller1" name="/lala" class="Controller.HelloController"/>
2.另外一种处理器适配器配置
<!--另外一种处理器适配器,要求Handler实现HttpRequestHandler接口--> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
该适配器要求Handler实现HttpRequestHandler接口
package Controller; import org.springframework.web.HttpRequestHandler; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Controller1 implements HttpRequestHandler { @Override public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletRequest.setAttribute("message","lalalalalaal"); httpServletRequest.getRequestDispatcher("WEB-INF/page/lala.jsp").forward(httpServletRequest,httpServletResponse); } }
注解方式配置
1.在web.xml文件中配置前端控制器DispatcherServlet
2.在SpringMVC.xml配置文件中配置注解处理器适配器和处理器映射器
<!--需要在Spring容器中加载Handller,这里采用扫描包的方式进行--> <context:component-scan base-package="Controller"/> <!--注解的处理器适配器配置--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!--注解的处理器映射器配置--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--配置MVC的注解驱动,代替上面两个配置 该注解驱动还默认加载了很多参数绑定的方法,比如json转换解析器就默认加载了,实际开发中使用--> <mvc:annotation-driven/> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--通过Property标签,可以设置前缀和后缀省略--> <property name="prefix" value="WEB-INF/page/"/> <property name="suffix" value=".jsp"/> </bean>
2.编写Handler
package Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller /*这里的Controller表示用注解方式声明这是一个Controller*/ public class Controller2 { @RequestMapping("/Controller2") /*这个注解可以用来设置Url*/ public ModelAndView lala()throws Exception{ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","这是注解开发的Handller"); modelAndView.setViewName("lala"); return modelAndView; } }
3.在Spring容器中加载Handller,用扫描包的方式
<!--需要在Spring容器中加载Handller,这里采用扫描包的方式进行--> <context:component-scan base-package="Controller"/>
4.运行
完结。