1、Spring Web MVC是什么
SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助简化日常Web开发的。
SpringMVC是为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一,Spring3.0后已经全面超越Struts2,成为最优秀的MVC框架
Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口。
SpringMVC方便的支持了RESTful风格的URL请求
SpringMVC由于Spring的特性而采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。
2、Spring3 MVC的优点
Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多
Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序
Spring3MVC>Struts2(不使用OGNL和值栈)>>struts2(标签库、OGNL和值栈)
Spring3 MVC的灵活是无法想像的,Spring框架的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制
3、hello SpringMVC:SpringMVC应用一般开发步骤
0、添加依赖spring-webmvc
1、配置web.xml,指定业务层对应的Spring配置文件,定义DispatcherServlet
配置监听器 ---整合web和Spring
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:app*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<servlet> <servlet-name>yan</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>yan</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
|
一般来说由监听器负责加载和创建的IoC容器叫做父容器,由DispatcherServlet负责创建和加载的容器叫做子容器
父容器不能访问子容器中的受管bean,但是子容器可以直接访问父容器中的受管bean
子容器中配置和web应用相关的组件,而父容器中配置和web应用没有直接关系的组件
子容器的默认配置文件名称为<servlet-name>-servlet.xml,例如yan-servlet.xml,位置和web.xml位置一致。遵循惯例则不需要进行配置
2、编写处理请求的控制器。处理器
@Controller public class HelloController { @RequestMapping(value = "hello", method = RequestMethod.GET)针对方法进行映射,value对应的是请求路径hello.do public String sayHello(String username用于接收客户端提交的同名参数?username=yanjun, Model model用于向页面传递数据,可以理解为request的attribute) throws Exception { if (username == null || username.trim().length() < 1) username = "SpringMVC"; String message = "Hello " + username + "!"; model.addAttribute("msg", message); return "show";逻辑地址名 }
} |
3、编写视图/WEB-INF/content/show.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ${msg} |
4、配置Spring 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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
<!-- 用于打开注解支持 -->
<mvc:annotation-driven /> <!-- 使用解析器,用于将逻辑地址名转换为物理地址 --
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/content/" p:suffix=".jsp" />
<context:component-scan base-package="com.yan.action"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> </beans> |
4、SpringMVC框架的原理
1:整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(web.xml下指定),Web容器将该请求转交给DispatcherServlet处理。
2:DispatcherServlet接收到请求后,将根据请求信息(包括URL,HTTP方法等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看成是路由器,将Handler看成是目标主机。值得注意的是:Spring mvc中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求的处理器。
3:当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter的Handler进行封装,再以
统一的适配器接口调用Handler。HandlerAdapter是Spring mvc的框架级接口,顾名思义HandlerAdapter是一个适配器,它用统一的接口
对各种Handler方法进行调用。
4:处理器完成业务逻辑的处理后将返回一个ModelAndView给DsipatcherServlet,ModelAndView包含了试图逻辑名和模型数据信息。
5:ModelAndView中包含的是“逻辑试图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑试图名到真是试图
对象的解析工作。
6:当得到真实的视图对象view后DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行试图渲染。
7:最终客户端得到的相应消息,可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式
5、定义控制器
Controller接口是Spring2.5-定义方法,目前不需要实现任何接口,不继承任何类
@Controller控制器定义
@Controller用于标识是处理器类。和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此
,我们将控制器设计成无状态类。在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为
controller的bean,需要在spring-context配置文件中增加如下定义:
<context:component-scan base-package="com.yan.action"/>
注:实际上,使用@component,也可以起到@Controller同样的作用。
使用注解进行MVC相关配置,需要配置
<mvc:annotation-driven/>
@RequestMapping --新注解@GetMapping等
在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定。
String name() default "";类似于配置文件中<bean>的id
String[] value() default {};用于定义对应的路径名称
String[] path() default {};等价于value,一般不使用path
RequestMethod[] method() default {};执行这个方法时所对应的http请求方法,例如GET,post等
String[] params() default {};用于设置执行这个方法时参数对应的条件,例如有某个参数才对应这个方法
String[] headers() default {}; 请求头
针对JSON的参数配置
String[] consumes() default {};
String[] produces() default {};
@Controller @RequestMapping("/") public class UserController { @RequestMapping(value = "login", method = RequestMethod.GET) public ModelAndView login() throws Exception { ModelAndView mv=new ModelAndView(); mv.setViewName("user/login"); mv.addObject("msg","带到页面的参数"); return mv; } } |
返回给前端控制器的是逻辑地址名,需要通过视图解析器,将逻辑地址名解析为对应的View对象
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/content/" p:suffix=".jsp"
p:viewClass="org.springframework.web.servlet.view.JstlView" />
这个视图解析器会将Controller返回的视图名user/login转换为物理地址/WEB-INF/content/user/login.jsp