SpringMVC应用一
一、SpringMVC的概述
1、什么是SpringMVC
-
Spring MVC是一种基于java实现了Web MVC 设计模式的请求驱动类型的轻量级的Web框架。
-
SpringMVC主要解决Web应用的轻量级框架
-
作用于javaee分层架构,处理Web层的控制器组件
-
-
它也是Spring框架组件之一
-
它也是基于MVC思想设计
-
它基于请求驱动实现
-
2、SpringMVC的作用
-
解决web应用问题,简化web应用开发功能
- 提供以注解方式解决web功能
-
作用于三层架构,主要解决web层问题
二、SpringMVC的框架模型
1、SpringMVC框架图
- 描述Springmvc的框架模型
2、SpringMVC的核心组件
-
DispatcherServlet
- 前端控制器
- DispatcherServlet组件是整个SpringMVC的核心
- 它是负责用户请求,也就是SpringMVC所有的请求入口都是DispatcherServlet
- 负责委派及协调组件去处理请求并且作出相应的响应结果
- 前端控制器
-
HandlerMapping
- 处理器映射器
- 作用
- 根据用户请求,找到对应的hanlder组件
- 可以根据不同的规则,去找到对应的handler组件
- 可以根据bean name
- 可以根据直接映射uri地址
- 可以根据@RequestMapping("/xxx")
- 可以根据不同的规则,去找到对应的handler组件
- 根据用户请求,找到对应的hanlder组件
- 作用
- 处理器映射器
-
HandlerAdpater
- 处理器适配器
- 作用
- 判断handler目标组件是否适合运行
- 举例
- 看电影,门票买,位置已经坐下,还是有3D眼镜才能看此电影,类比适配器检验是否有带3D眼镜
- 作用
- 处理器适配器
-
Handler
- 目标组件
- 它其实就是客户端请求运行的组件对象
- 目标组件
-
ModelAndView
-
Model
-
指就是数据模型
- 将数据加载到Model,默认会将数据存储到request作用域
-
作用
- 将数据显示到视图组件
-
-
View
- 视图组件
-
-
ViewResolver
- 视图解释器
- 将逻辑视图通过解释器解释成物理视图组件
- 视图解释器
3、SpringMVC的工作流程
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链
HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给
DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器
HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封
装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到
DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至
视图中)。
11.DispatcherServlet响应用户。
三、实现Springmvc第一个程序
1、导入jar库
2、配置DispatchServlet
-
在web.xml文件配置
<?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"> <!--配置DispatchServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc.xml</param-value> </init-param> <!--当web应用启动,则初始化此Servlet组件--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--此应用所有的请求路径都交给DispatcherServlet处理--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3、配置spring-mvc.xml文件
-
主要配置springmvc的核心组件,配置成bean对象
- 配置处理器映射器
- 配置处理器适配器
- 配置视图解释器
<?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"> <!--主要配置springmvc的核心组件--> <!--配置handlerMapper组件 BeanNameUrlHandlerMapping:根据bean的name作为handler uri地址映射 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!--将handler配置成bean对象--> <bean name="/hello" class="com.gec.controller.HelloController" /> <!--主要配置一个HandlerAdapter 适配handler是否实现Controller接口,如果实现此接口,则允许运行此目标handler,否则运行不了 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!--视图解释器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--视图组件的后缀--> <property name="suffix"> <value>.jsp</value> </property> <!--配置前缀(视图组件在那个路径)--> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> </bean> </beans>
4、编写Handler
package com.gec.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 目标handler
* */
public class HelloController implements Controller {
/*
* 此handler目标对象的请求方法
* */
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
httpServletRequest.setAttribute("username","tom");
ModelAndView modelAndView=new ModelAndView();
//逻辑视图名(success)---->视图解释器 ----->(/WEB-INF/jsp/success.jsp)
modelAndView.setViewName("success");
return modelAndView;
}
}
四、分析处理器映射器和处理器适配器
1、处理器映射器
-
作用
- 根据一定的规则去找到目标handler
-
类型
-
BeanNameUrlHandlerMapping
- 根据handler的bean name作为访问handler的uri地址
-
SimpleUrlHandlerMapping
-
将handler bean对象与uri地址作直接映射
-
举例
- key:就是uri地址
- value:uri地址映射的bean id(bean就是handler的bean对象)
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name="mappings"> <props> <prop key="/hello">hellohandler</prop> <prop key="/hello2">hellohandler</prop> </props> </property> </bean>
-
-
ControllerClassNameHandlerMapping(Spring5不支持)
-
RequestMappingHandlerMapping
- 要使用此映射器,它与RequestMappingHandlerAdapter一对
- 实现@RequestMapping注解方式映射handler地址
-
2、处理器适配器
-
作用
-
1、判断handler是否适合运行,如果不适合运行,则直接抛出异常(The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler)
-
2、执行目标handler
- 消息转换器
- 数据转换
- 数据格式化
- 数据校验
- 运行handler
-
3、返回ModelAndView对象给DispatcherServlet
-
-
适配器类别
-
HttpRequestHandlerAdapter
-
必须要求handler实现HttpRequestHandler接口
-
用法
package com.gec.controller; import org.springframework.web.HttpRequestHandler; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /* * 目标handler * */ public class HelloController implements HttpRequestHandler { @Override public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletRequest.setAttribute("username","tom"); //转发给视图组件显示 httpServletRequest.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(httpServletRequest,httpServletResponse); } }
-
-
SimpleControllerHandlerAdapter
-
此handler必须实现org.springframework.web.servlet.mvc.Controller接口
-
用法
package com.gec.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 目标handler * */ public class HelloController implements Controller { /* * 此handler目标对象的请求方法 * **/ @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { httpServletRequest.setAttribute("username","tom"); ModelAndView modelAndView=new ModelAndView(); //逻辑视图名(success)---->视图解释器 ----->(/WEB-INF/jsp/success.jsp) modelAndView.setViewName("success"); return modelAndView; } }
-
-
RequestMappingHandlerAdapter
-
以注解的方式适配目标对象
-
与RequestMappingHandlerMapping是一对的
-
-
五、以注解的方式实现Springmvc程序
1、简介
-
使用注解方式实现handler目标请求方法
-
使用什么注解
@RequestMapping
- 此注解修饰方法
- 定义一个请求方法对应的uri地址
- 此注解修饰方法
-
如何配置注解方式实现请求
- 使用RequestMappingHandlerMapping处理器映射器
- 使用RequestMappingHandlerAdapter处理器适配器
2、具体实现
a、配置DispatcherServlet
- 编写web.xml文件
<?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">
<!--配置DispatchServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<!--当web应用启动,则初始化此Servlet组件-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--此应用所有的请求路径都交给DispatcherServlet处理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
b、编写spring-mvc.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.gec.controller" /> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> <!--视图解释器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--视图组件的后缀--> <property name="suffix"> <value>.jsp</value> </property> <!--配置前缀(视图组件在那个路径)--> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> </bean> </beans>
-
更加简化的写法
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.gec.controller" /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <!--视图解释器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--视图组件的后缀--> <property name="suffix"> <value>.jsp</value> </property> <!--配置前缀(视图组件在那个路径)--> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> </bean> </beans>
c、编写Handler类
- 此handler必须使用@Controller注解
package com.gec.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
/*
* 定义请求方法
* 一个请求方法映射一个uri地址
* */
@RequestMapping(value = "/hello1")
public ModelAndView dohello()
{
String username="tom";
ModelAndView modelAndView=new ModelAndView();
//将数据存储到request作用域
modelAndView.addObject("username",username);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* 如果此请求方法返回是字符串类型,则认为是逻辑视图名
* */
@RequestMapping(value = "/hello2")
public String dohello2(Model model)
{
//将数据存储到request作用域
model.addAttribute("username","gec");
return "success";
}
}