文档章节

SpringMVC简单应用

江左煤郎
 江左煤郎
发布于 2018/11/28 21:37
字数 1927
阅读 30
收藏 0

1. 了解SpringMVC

    1. springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合(比如Mybatis与Spring整合的时候需要借助单独的jar包)。springmvc是一个基于mvc模式的web框架。

    2. SpringMVC对于从客户端发来的请求的处理流程:

    第一步:发起请求到前端控制器(DispatcherServlet)

    第二步:前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找

    第三步:处理器映射器HandlerMapping向前端控制器返回Handler

    第四步:前端控制器调用处理器适配器去执行Handler

    第五步:处理器适配器去执行Handler

    第六步:Handler执行完成给适配器返回ModelAndView

    第七步:处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括 Model和view

    第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp、pdf等)

    第九步:视图解析器向前端控制器返回View

    第十步:前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域

    第十一步:前端控制器向用户响应结果

    3. SpringMVC中的重要组件:

  • 前端控制器DispatcherServlet(不需要程序员开发):用于接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping(不需要程序员开发):根据请求的url查找Handler
  • 处理器适配器HandlerAdapter:按照特定规则(HandlerAdapter要求的规则)去执行Handler(或者说Controller)
  • 处理器Handler(或者说Controller,需要程序员开发),注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  • 视图解析器View resolver(不需要程序员开发):进行视图解析,根据逻辑视图名解析成真正的视图(view)
  • 视图View(需要程序员开发jsp),View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

2. SpringMVC的简单使用

    1. 准备环境:新建一个Maven项目,导入所需要的相关jar包

    2. 首先配置前端解析器,修改项目的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SpringWebMVC</display-name>
 
  <!-- 配置SpringMVC前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 配置SpringMVC加载的配置文件,该文件中会配置处理器映射器、处理器适配器、视图解析器等 -->
  	 <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:conf/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 
  	前端控制器的url-pattern有三种形式:
  	1.*.xx:即只会解析以".xx"结尾的路径
  	2./ :所有的访问地址都会被前端控制器解析,对于静态文件的路径访问需要特殊配置不被前端控制器解析,
  		因为依据静态文件的路径,前端控制器是无法找到对应的Handler的,所以会报错,
  		使用此形式的url-pattern可以实现RESTful路径风格
  	3./*:此种方式有错误,当最终转发到一个jsp页面时,仍会有前端控制器解析jsp页面路径,而依据此路径
  		前端控制器是无法找到对应的Handler的,所以会报错
   -->
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
  
   <!-- 配置SpringMVC的RESTful路径风格的前端控制器,两个前端控制器可以并存不会影响  -->
   <!-- 关于RESTful风格的url-pattern所带来的无法解析静态资源(js,css)路径问题,将在SpringMVC
   配置文件中进行特殊配置,避免只解析部分路径,即/js/**.js只解析/js路径而缺失了/**.js-->
  <servlet>
  	<servlet-name>springmvc_RESTful</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	 <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:conf/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc_RESTful</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

    2. 在上面指定的classpath:conf/springmvc.xml文件中配置SpringMVC的注解式处理器映射器和处理器适配器:

<?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:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	
	<!-- 配置视图解析器,解析jsp,默认使用jstl标签,所以需要导入jstl的相关jar包 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置前缀与后缀,这样Controller返回的视图名只用写视图文件的部分路径加视图文件名称即可 -->
		<!-- 解析视图名时要添加的前缀 -->
		<property name="prefix" value="/WEB-INF/"></property>
		<!-- 解析视图名时要添加的后缀 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 使用注解式 -->
	<!-- 多个适配器或映射器可以共存 -->
	<!-- 配置注解式处理器映射器 
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
-->
	<!-- 配置注解式处理器适配器
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
 -->
	
	
	<!-- 开启注解,使用mvc的注解驱动,适配器以及映射器配置可以取消,即删除上面的适配器以及映射器配置 -->
	<!-- 开发时仅使用此配置即可,但需要开启注解扫描,用来扫描带有相关注解的类 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<!-- 开启注解扫描 -->
	<context:component-scan base-package="test"></context:component-scan>
	
</beans>

    3. 通过注解编写处理器(Controller):

import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import cn.taotao.po.Items;
//通过@Controller注解标示该类是一个Controller处理器,括号内的字符串可以指定该类在Spring中作为bean的id
@Controller("controller2")
public class Controller2 {
//@RequestMapping该注解标示该方法用于映射处理/findItems.action路径传来的请求
	@RequestMapping("/findItems")
	public ModelAndView findItems(){
		List<Items> itemsList=new ArrayList<Items>();
		//向list中填充数据
		Items i1=new Items();
		i1.setName("华为手机");
		i1.setPrice(3000f);
		i1.setDetail("mate10");
		i1.setId(1);
		Items i2=new Items();
		i2.setName("苹果手机");
		i2.setPrice(8888f);
		i2.setDetail("苹果10");
		i2.setId(2);
		itemsList.add(i1);
		itemsList.add(i2);
		//生成返回值
		ModelAndView mav=new ModelAndView();
		//相当于request.setAttribute(),在jsp页面中通过itemsList获取数据
		mav.addObject("itemsList", itemsList);
		//指定视图
		//原本的视图文件路径应写为mav.setViewName("/WEB-INF/jsp/itemsList.jsp");但在视图解析器中配置了前缀和后缀,所以可以简写为
        mav.setViewName("jsp/itemsList");
		return mav;
	}
}

    4. 编写视图文件:需要在对应的路径下编写jsp文件,并对传来的Model数据进行处理

    5. 调试跟踪:在前端控制器的源码中doDiapatch方法打断点,通过前端控制器源码分析springmvc的执行过程。

第一步:前端控制器接收请求,调用doDiapatch

第二步:前端控制器调用处理器映射器查找 Handler

第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView

第四步:视图渲染,将model数据填充到request域。视图解析,得到view:

调用view的渲染方法,将model数据填充到request域,渲染方法:

© 著作权归作者所有

江左煤郎

江左煤郎

粉丝 26
博文 129
码字总数 305609
作品 0
西安
后端工程师
私信 提问
加载中

评论(0)

Spring MVC 到 Spring Boot 的简化之路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

别打我会飞
2018/10/21
257
0
若不是公司需要,我怎么会用上 Spring Boot ?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/96402637 我从业于第三方支付和互联网金融这...

GitChat技术杂谈
2019/07/17
0
0
Spring MVC 到 Spring BOOT的简化之路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

临江仙卜算子
2018/05/09
320
0
从Spring MVC 到 Spring BOOT的简化道路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

微笑向暖wx
2018/11/13
133
0
Spring(二):配置和简单使用

1、下载地址(目前使用的是4.2.0) 下面都可以 http://repo.springsource.org/libs-release-local/org/springframework/spring http://repo.spring.io/simple/libs-release-local/org/sprin......

_Roger_
2015/08/16
276
0

没有更多内容

加载失败,请刷新页面

加载更多

redis+lua 实现分布式令牌桶,高并发限流

方案一、在提供给业务方的Controller层进行控制。 1、使用guava提供工具库里的RateLimiter类(内部采用令牌捅算法实现)进行限流 2、使用Java自带delayqueue的延迟队列实现(编码过程相对麻烦,...

stys35
6分钟前
7
0
socket编程之websocket实现

主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket。 websocket是一种可以双向通讯的长连接协议,http是获取完数据就关闭,websocket则可以...

php开源社区
13分钟前
15
0
这款Mac视频下载神器,轻松解决1000多个视频网站下载难题!

Mac视频下载工具哪款好用?号称Mac届经典的网页视频下载神器,支持 1000 多个流媒体网站的视频下载,包括YouTube,优酷,Bilibili,Vimeo等,,让你轻松解决视频下载难题! Downie 4 Mac版值...

mac小叮当
15分钟前
10
0
基于三维GIS技术的矢量地图动态LOD渲染方法

本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染。研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数...

ZTMAP
19分钟前
17
0
Docker安装MySQL&Redis

Docker安装MySQL 下载 mysql 镜像 docker pull mysql:5.7 启动容器 docker run -p 3306:3306 --name mysql \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysq......

农夫三拳有点疼-_-
19分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部