了解什么是SpringMVC
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
- Spring MVC是一个基于MVC的web框架,Spring MVC 分离了控制器、 模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
MVC
- model 模型, 实体类,DAO层类,业务逻辑层类
- view 视图, jsp.html等页面文件
- controller 控制器
- Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架
- Spring MVC 通过一套 MVC 注解,让 POJO成为处理请求的控制器,而无须实现任何接口
- 支持 REST 风格的 URL 请求
- 采用了松散耦合可插拔组件结构,比其他 MVC框架更具扩展性和灵活性
- 进行更简洁的Web层的开发;
- 天生与Spring框架集成(如IoC容器、AOP等);
- 能简单的进行Web层的单元测试;
- 支持灵活的URL到页面控制器的映射;
- 非常容易与其他视图技术集成,如Velocity、FreeMarker等等
了解MVC在B/S系统下的应用
- 用户发起request请求至控制器(Controller)
地址栏,页面超链接,按钮…
将数据传递给模型进行处理,如果只是页面的请求,name可以直接在控制器处理器中分发到相应的view - 控制器通过模型(Model)处理数据并得到处理结果
模型通常指业务逻辑 - 模型处理结果返回给控制器
- 控制器将模型数据在视图(View)中展示
- 控制器将视图response响应给用户
通过视图展示给用户要的数据或处理结果
理解SpringMVC框架 *
sprigMVC两层控制器1.前端控制器 2.处理器
掌握SpringMVC组件
- 前端控制器 DspatcherServlet(不需要程序员开发)
接受用户请求,将请求交给处理器映射器。
接收处理器映射器返回的执行链,将要寻找的处理器发送给处理器适配器。
将处理器适配器返回的结果发送给视图解析器。
将视图解析器返回的结果处理为view对象返回给视图。 - 处理器映射器 HandlerMapping(不需要程序员开发)
查找处理器,就是谁能处理这个请求,返回给前端控制器一个处理器执行链,为什么是链,不是多个处理器,是你的请求中间可能需要经过很多的处理器拦截器。这个处理器是我们自己来写的。
经过上面的操作,前端控制器知道了当前请求应该是哪个处理器来处理。 - 处理器适配器 HandlerAdapter
前端控制器知道了是哪个处理器来处理, 处理器适配器 是为了知道如何找到并找到这个适配器。
并且接受处理器处理后返回的结果,将返回一个ModelAndView对象给前端控制器。 - 处理器 Handler
处理请求,返回结果给处理器适配器。 - 视图解析器 ViewResolver(不需要程序员开发)
处理结果,找到view对象返回给前端控制器。 - 视图 View
掌握SpringMVC框架开发的环境搭建、开发步骤
开发步骤
1.创建maven web工程
2.pom.xml导入jar 包
3.resources下新增Spring基本配置文件:SpringMVC.xml
4.在 web.xml 中配置 DispatcherServlet
5.新建HelloController继承Controller,指定返回视图页面(本案例使 用默认的index.jsp)
6.SpringMVC.xml配置访问映射
7.视图编写
8.启动tomcat测试
1.创建maven web工程
2.pom.xml导入jar 包
<!--spring框架-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!--servlet--><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
3.src/main/resources下新增Spring基本配置文件:springmvcConfig.xml
4.在webapp/WEB-INF/ web.xml 中配置 DispatcherServlet
<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:springmvcConfig.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
url-pattern有三种匹配方式:
- 精确匹配 如:/a,/b,/hello
- 后缀匹配 如:.do..action
- 通配符匹配 如:/*
maven工程约定配置文件放在resources文件夹下,所以没有将配置文件放在指定的WEN-INF下。
如果springMVC配置文件命名为SpringMVC-servlet.xml,并且放在webapp/WEB-INF下,则不需要写:
<init-param>
<!--指定配置文件位置-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvcConfig.xml</param-value>
</init-param>
5.新建HelloController继承Controller,指定返回视图页面(本案例使 用默认的index.jsp)
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.setViewName("index.jsp");
return modelAndView;
}
}
6.SpringMVC.xml配置访问映射
<bean name="/hello.action" class="com.zx.controller.HelloController"/>
7.视图编写 项目默认生成的webapp/index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
8.启动tomcat测试
springMVC默认的处理器映射器、处理器适配器
映射器、适配器、视图解析器可以不声明,Spring自动分配,上边的例子就没有写。
上面的例子在springmvcConfig.xml配置一个BeanNameUrlHandlerMapping处理器映射器,并不会影响结果
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
BeanNameUrlHandlerMapping根据请求的url和spring容器中定义的bean的name进行匹配,生命的例子中hello.action和bean的name一致。
配置一个SimpleUrlHandlerMapping处理器映射器,就会出错404。
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"/>
这是因为SimpleUrlHandlerMapping是将url和处理器bean的id进行统一映射配置。
正确的使用方式
<bean id="helloController" class="com.zx.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloController</prop>
</props>
</property>
</bean>
springMVC默认有两个HandlerMapping,所以之前的没有配置映射器也能成功访问
自己配制的处理器适配器会覆盖默认的,例如:
<bean id="helloController" name="/hello.action" class="com.zx.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello1.action">helloController</prop>
</props>
</property>
</bean>
hello1.action将访问成功。
默认的处理器适配器,三个:
SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean通过此适配器进行适配、执行。
配置一个SimpleControllerHandlerAdapter运行,也不会出错。
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
自定义一个实现HttpRequestHandler接口的方法
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 HelloAgin implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
httpServletRequest.getRequestDispatcher("/index.jsp").forward(httpServletRequest,httpServletResponse);
}
}
springmvcConfig.xml配置的适配器改为HttpRequestHandlerAdapter
<bean name="/helloAgin.action" class="com.zx.controller.HelloAgin"/>
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
注解形式
/*注解形式,需要在xml配置扫描包*/
@Controller
/*包扫描可以识别到处理器,适配器,不需要实现接口*/
public class AnnotationController {
/*访问路径*/
@RequestMapping("/fun1.action")
public ModelAndView fun1() {
ModelAndView modelAndView = new ModelAndView();
/*配置了前缀WEB-INF/jsp和后缀.jsp*/
modelAndView.setViewName("index.jsp");
return modelAndView;
}
springmvcConfig.xml
<!--注解扫描包-->
<context:component-scan base-package="com.zx"/>
springMVC提供的默认的处理器映射器和处理器适配器,包括非注解形式和注解形式
视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>