Spring MVC框架入门学习步骤
- 1、了解Spring MVC基本慨念, 是什么?,能干什么?
- 2、Spring MVC核心组件、底层实现原理
- 3、Spring MVC实际开发, 基于XML方式、基于注解的方式
什么是MVC设计模式?
可以将一个Web应用程序分成三层:Controller层、View层 和 Model层。
- Controller:负责接收客户端请求, 然后对请求做出相应的业务处理, 最终将处理结果返回给客户端
- Model:负责处理具体的业务逻辑, 产生不同的模型数据。一般是指dao 和 service
- View:视图层负责将模型数据展示给用户, 是程序与用户进行交互的窗口
- 1、用户提交请求后, 被controller控制层接收。
- 2、控制层根据不同的请求, 去调用model模型层相应的业务方法。
- 3、不同的业务方法会对数据库进行增删改查的持久化操作, 并产生相应的模型数据。
- 4、模型数据传递给view视图层, view视图层拿到数据之后进行渲染, 最终把结果响应给客户端。
什么是Spring MVC?
- Spring MVC是Spring框架的一个后续产品, 是Spring的一个子模块, 二者可以很好的结合使用, 无需整合处理。
- Spring MVC是目前最好的一款实现了MVC设计模式的框架。它对整个MVC设计模式进行的封装, 然后提供更加简洁方便的方法, 大大提高程序员的开发效率。
Spring MVC的核心组件(底层实现)?
- 1、DispatcherServlet:前置控制器, 是整个流程控制的核心, 用来控制其他组件的执行, 进行一个统一的调度,降低各个组件的耦合性, 相当于总指挥。
- 2、Handler:处理器(控制器), 用来完成具体的业务逻辑, 它就是我们Spring MVC中的编写的Controller类。
- 3、HandlerMapping:请求映射, DispatcherServlet接收到不同的请求后, 将不同的请求分发到不同的Handler中, 那么它是如何分发实现的呢?需要借助HandlerMapping, 将请求映射到具体的Handler中, 映射成功后会返回一个HandlerExecutionChain对象给DispatcherServlet。
- 4、HandlerInterceptor:处理器拦截器, 它是一个接口, 如果需要做一些拦截处理, 可以实现这个接口来完成这样的功能, 它会在访问Controller前后执行。它其实与AOP有点类似, 只是它拦截的是url, 而AOP拦截的是类的元数据(包、方法), 相比较而言AOP更细致一点。
- 5、HandlerExecutionChain:处理器执行链, 它包括一个Handler处理器(控制器)对象 和 至少一个HandlerInterceptor拦截器。Handler是我们编写的Controller类, 至于为什么是至少一个HandlerInterceptor呢, Spring MVC一般会默认提供一个拦截器, 如果需要额外添加拦截器的话, 需要实现这个接口。
- 6、HandlerAdapter:处理器适配器, Handler在执行业务方法之前,需要执行一系列的操作。包括对表单数据的验证、表单数据数据类型的转换 以及将表单数据封装到Java Bean当中。这一系列的操作都是由HandlerAdapter来完成的。DispatcherServlet通过HandlerAdapter来执行不同的Handler
- 7、ModelAndView:是装载了模型数据和视图信息的一个类, 这里的视图指的是逻辑视图, 它作为Handler的处理结果返回给DispatcherServlet, DispatcherServlet拿到ModelAndView之后, 是需要进行解析的, 那怎么解析呢?需要借助ViewResolver视图解析器。
- 8、ViewResolver:视图解析器, 视图解析器会将逻辑视图解析成物理视图, 并完成模型数据的填充, 最终将结果渲染响应给客户端。
Spring MVC的实现流程?
- 1、客户端发送的请求被DispatcherServlet接收。
- 2、DispatcherServlet接收到请求后, 根据HandlerMapping的映射将这个请求映射到具体的Handler, 映射成功后会返回一个HandlerExecutionChain对象(包括一个Handler对象 和 至少一个HandlerInterceptor)给DispatcherServlet。注意这里只是拿到Handler对象, 并没有执行Handler中的处理方法。
- 3、DispatcherServlet拿到Handler之后, 通过HandlerAdapter来执行具体的Handler的处理方法, 并且在Handler的处理方法执行之前, 可能会做一系列的处理, 包括表单数据的验证、表单数据类型转换等. . . 。
- 4、在Handler的处理方法执行完之后,会返回一个ModelAndView(模型数据和逻辑视图)这样一个对象给DispatcherServlet。
- 5、DispatcherServlet拿到返回的ModelAndView后, 将其交给ViewResolver, 通过ViewResolver视图解析器进行解析, 将逻辑视图转换成web工程的一个物理视图(jsp), 然后返回一个视图对象给DispatcherServlet。
- 6、然后在jsp视图中将Handler传递过来的模型数据进行封装, 并加以渲染, 最终响应给客户端。
在前面学习到Spring MVC的组件时, 是不是有点小恐惧, Spring MVC有这么多个组件, 那么它使用起来会不会非常复杂,开发步骤会不会很多. . .
其实, Spring MVC的大部分组件是由它自身提供的, 我们只需要通过配置进行关联即可, 实际需要我们手动编写的只有两个部分:Handler 和 View。 Handler是MVC中的C, 即Controller; View是我们的视图, 可以理解为jsp
Spring MVC基于XML的开发方式?
基于XML的开发步骤:
- 1、Spring MVC基础配置, 在web.xml中配置
- 2、编写Handler, 即Controller类
- 3、编写View, 也就是jsp
- 4、通过XML配置Handller(Controller),HandlerMapping组件的映射
- 5、通过XML配置ViewResolver视图解析器
( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )
1、在web.xml中配置Spring MVC基础配置。
- 配置前置控制器DispatcherServlet, < servlet>结点下由三个必须的子节点:
、<servlet-name>
、<servlet-class>
, < servlet-name>是servlet的名字, 一般与servlet类名有关, < servlet-class>是servlet类的全类名, < init-param>初始化参数, 用于指定spring mvc配置文件地址。<init-param>
- 配置servlet与url之间的映射< servlet-mapping>, < servlet-mapping>有两个子节点:
和<servlet-name>
。该< servlet-name>的名字必须与servlet的名字一致, < url-pattern>指定对应servlet的url路径。<url-pattern>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--配置前端控制器,接收不同的url请求分发给不同的Handler,起到一个总指挥的作用-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化参数,指定spring mvc配置文件路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc1.xml</param-value>
</init-param>
</servlet>
<!--配置url请求映射-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、定义Handler, 即Controller类
- 定义一个XmlHandler 实现Controller接口,并重写handlerRequest方法, 然后在方法中处理具体的业务逻辑
package com.cd.handler.xml;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 定义一个Handler实现Controller接口,并重写handlerRequest方法
*/
public class XmlHandler implements Controller {
/**
* 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
*/
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","李宁");
//设置逻辑视图
modelAndView.setViewName("show");
//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
return modelAndView;
}
}
3、编写View, 也就是jsp
- 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。
- 并且, 使用EL表达式需要我们添加
语句, 表示不忽略EL表达式<%@page isELIgnored="false" %>
<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %> <%--不忽略EL表达式--%>
<html>
<head>
<meta charset="UTF-8">
<title>SpringMVC实现方式</title>
</head>
<body>
My name is ${name}
</body>
</html>
4、在springmvc.xml中, 通过XML配置Handller(Controller),HandlerMapping组件的映射
- 就是将url请求通过SimpleUrlHandlerMapping映射到具体的Handler中
<!--配置HandlerMapping,将请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--配置映射url-->
<property name="mappings">
<props>
<!--配置test请求对应的Handler,就是将test请求映射到id为xmlHandler的Handler对象中,
使url请求和Handler进行关联-->
<prop key="/test">xmlHandler</prop>
</props>
</property>
</bean>
<!--配置 Handler的 Bean,即Controller-->
<bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/>
5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器
- 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图前缀-->
<property name="prefix" value="/"/> <!--/表示根目录-->
<!--视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>
完整的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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置HandlerMapping,将请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test">xmlHandler</prop>
</props>
</property>
</bean>
<!--配置Handler,即Controller-->
<bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图前缀-->
<property name="prefix" value="/"/><!--/表示根目录-->
<!--视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Spring MVC基于注解的开发方式?
基于注解的开发步骤:
- 1、Spring MVC基础配置, 在web.xml中配置
- 2、编写Handler, 即Controller类
- 3、编写View, 也就是jsp
- 4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射
- 5、通过XML配置ViewResolver视图解析器
( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )
1、在web.xml中配置Spring MVC基础配置
- 包括前置控制器DispatcherServlet 和 将 配置将 url 请求映射到DispatcherServlet。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化参数,指定spring mvc配置文件路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc2.xml</param-value>
</init-param>
</servlet>
<!--配置url请求映射-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、定义Handler, 即Controller类
- 基于注解方式无需实现Controller接口, 使用@Controller注解声明该类是一个Controller类即可。所以, 我们可以在类中自定义方法, 然后在方法中处理具体的业务逻辑。
package com.cd.handler.annotation;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class AnnotationHandler {
/**
* 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
*/
public ModelAndView testModelAndView(){
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","李宁");
//设置逻辑视图
modelAndView.setViewName("show");
//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
return modelAndView;
}
}
3、编写View, 也就是jsp
- 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。
- 并且, 使用EL表达式需要我们添加
语句, 表示不忽略EL表达式<%@page isELIgnored="false" %>
<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %> <%--不忽略EL表达式--%>
<html>
<head>
<meta charset="UTF-8">
<title>SpringMVC实现方式</title>
</head>
<body>
My name is ${name}
</body>
</html>
4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射
- 通过@RequestMapping注解直接将url请求和Controller中的方法进行关联, @RequestMapping的作用是将一个具体的url请求 和 Controller中的一个具体的方法进行映射关联
package com.cd.handler.annotation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class AnnotationHandler {
/**
* 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","李宁");
//设置逻辑视图
modelAndView.setViewName("show");
//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
return modelAndView;
}
}
5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器
- 配置自动扫描, 使@Controller注解生效
- 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件
<?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"
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 ">
<!--自动扫描-->
<context:component-scan base-package="com.cd.handler.annotation"/>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图前缀-->
<property name="prefix" value="/"/>
<!--视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Spring MVC基于注解开发中Controller的业务方法开发方式?
Spring MVC基于注解开发中, 处理业务方法的方式, 除了ModelAndView之外,还有另外两种方式:Model 和 Map
取前面基于注解开发案例代码, 其它内容不变, 修改AnnotationHandler处理器控制器类代码, 在类中添加两个业务方法, 用来演示Model 和 Map开发方式
package com.cd.handler.annotation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Map;
@Controller
public class AnnotationHandler {
/**
* 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","李宁");
//设置逻辑视图
modelAndView.setViewName("show");
//将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
return modelAndView;
}
/**
* 2、业务方法: Model传值,String进行视图解析
*/
@RequestMapping("/testModel")
public String testModel(Model model){
//填充模型数据
model.addAttribute("name","李宁");
//设置逻辑视图
return "show";
}
/**
* 3、业务方法: Map传值,String进行视图解析
*/
@RequestMapping("/testMap")
public String testMap(Map<String,String> map){
//填充模型数据
map.put("name","李宁");
//设置逻辑视图
return "show";
}
}
Model方式, 其实就是将 ModelAndView 拆分成 Model 和 String , Model用来传递模型数据, String用来设置逻辑视图, 然后return返回。Map方式与Model方式大致相同, 只不过是将Model替换成Map而已, 它们的填充模型数据时调用的方法不一样。
对比Spring MVC中3种Controller的业务方法的开发方式, 发现Model 和 Map方式 明显要比ModelAndView方式要简单很多。 所以实际开发中, 建议使用这两种方式。
1、Spring MVC实现了MVC设计模式, 它对MVC设计模式进行了封装。Spring MVC 是Spring的一个后续产品, 二者可以很好的结合使用, 无需过多的整合处理。
2、Spring MVC底层有很多组件, 它们大部分都是Spring MVC提供的, 我们只需要通过配置进行关联即可, 真正需要我们手动编写的只有Handler 和 View 两个组件。
3、Spring MVC有基于XML 和 注解两种开发方式。
4、基于XML方式需要定义一个类来实现Controller接口, 表明这是一个Controller, 然后再spring mvc配置文件中配置SimpleUrlHandlerMapping 和 Handler(实现了Controller接口的类), 通过SimpleUrlHandlerMapping将url请求和Handler进行关联/映射。
5、基于注解方式, 直接再类中通过@Controller注解声明为Controller类后, 通过@RequestMapping直接将Url请求 和 Controller中具体的业务方法进行关联即可, 比基于XML方式要简单很多, 所以建议使用基于注解方式进行开发。
Spring MVC入门案例源码