SpringMVC学习笔记

Spring MVC的工作流程

1 用户请求
2 前端控制器
3 handlerMapping 找到对应的Controller
4 controller 返回执行链给前端控制器
5 前端控制器通过 HandlerAdapter去执行执行链,返回model and view
6 前端控制器将model and view交给视图渲染器,渲染成视图
7.前端控制器将视图交给用户

0x01使用配置

配置前端控制器,在Web.xml中添加

<servlet>
    <servlet-name>dispatcher-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--集成Mybatis-->
    <!--集成Spring-->
    <!--集成SpringMvc-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/spring-*.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher-servlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

配置完成后,在classpath目录冲创建 spring文件夹,文件夹中创建spring Mvc配置文件

分层配置

先不考虑service层和dao层,有了前端控制器,就需要配置HandlerMapping 映射器和HandlerAdapter 适配器,最后是视图解析器

为了简化配置,DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter被mvc标签代替
所以 spring-web.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:tx="http://www.springframework.org/schema/tx"
       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 http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启注解模式-->
    <!--简化注解:
        1:自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
        2:提供了一系列功能(数据绑定,数字和日期转换 @NumberFormat、@DateTimeFormat) xml和json的读写
    -->
    <mvc:annotation-driven/>


    <!--
        静态资源默认Servlet配置
        对静态资源请求的支持:图片,css,js
        允许使用"/"做整体映射
    -->
    <mvc:default-servlet-handler/>

    <!--静态资源映射-->
    <mvc:resources mapping="/rs/**" location="/WEB-INF/static/"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置自动扫描bean 如果和Spring其他组件一起使用,不建议全局扫描,只扫描controller就好了-->
    <context:component-scan base-package="com.zing"/>

</beans>

0x02 Controller

  • URL映射
    简单URL映射的配置:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
    <property name="mappings">  
        <props>  
            <prop key="/userInfo">ControllerA</prop>  
        </props>  
    </property>  
</bean>  
      
<bean id="ControllerA" class="com.zing.controller.ControllerDemo"></bean>

不过现在一律使用注解式映射

@Controller()
@RequestMapping("/user")
public class AccountController {

    @RequestMapping(value = "/login")
    public String login(HttpSession session) {
      ...
    }
}

通过RequestMapping来限定url访问的方法,注意的是@Controller()和@RequestMapping()是需要成对出现的,否则无法访问,另外RequestMapping还有延伸,通过规范请求方式,请求头等来限定用户请求。

  • 参数的绑定和自定义参数绑定
    Spring MVC 自带参数绑定的功能,就是根据request中的key/value数据,找到对应名称和类型的入参,将参数绑定到对应的pojo对象上,特殊类型例如Date,可以通过自定义参数绑定,来讲参数绑定到pojo上

写几个案例:

 <form action="/user/signUp" method="post">
    <input type="text" placeholder="邮箱  name="email"/>
 </form>
//注入1
    @PostMapping("user/signUp")
    public static String getToken(String email) {
      ...
    }

//注入2
   @PostMapping("user/signUp")
    public static String getToken(@RequestParam(“email”)String name) {
      ...
    }

还有N多注入方式,其原理大致一样:有兴趣百度:SpringMVC参数绑定
自定义参数绑定的方式是参数按照用户自己编写转换器处理后绑定

<bean id= "convertersBinder" class= "org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name= "converters">
       <list>
        <bean class= "com.zing.converter.Converter01"/>
        <bean class= "com.zing,converter.Converter02"/>
        <bean class= "com.zing,converter.Converter03"/>
        </list>
    </property>
</bean>
package com.zing.account.interceptor;

import org.springframework.core.convert.converter.Converter;

public class Converter01 implements Converter<I,O> {
    @Override
    public O convert(I input) {
//        将input处理后生成O类型输出
        return new O();
    }
}

这样前端的字符串,就可以转换成其他任意类型了。

0x03 SpringMVC对事务的支持

service一般用来处理数据逻辑业务,校验数据等。这一层属于业务逻辑层,所以在某些业务上需要进行事物处理.

如何使用SpringMVC的事务管理呢,有两种方法

  1. 开启事务注解
  <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--数据库连接池,集成之后就不会出现红色-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启注解式事物-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

使用

//注册Service接口中的注解式事物
@Transactional(readOnly = false, rollbackFor = DataAccessException.class)   
    Account register(Account account);   
  1. 配置AOP自动事务管理

    <!--切面通知-->
    <tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!--配置AOP-->
    <aop:config>
        <aop:advisor advice-ref="transactionInterceptor"
                     pointcut="execution(* com.zing.*.service.*.*(..))"></aop:advisor>
    </aop:config>

前者简单,后者可以规范代码。都可以选择。

0x04 RESTful链接和静态资源的支持

可以将URL的链接某部分作为参数传入方法


静态资源可以用<mvc:resource >标签来映射,否则可能会会被拦截


如图的配置,表示将WEB-INF下static文件夹用/rs/来映射,这样就可以通过
http://localhost:8000/rs/js/jquery.min.js来访问static目录下/js/jquery.min.js文件了

0x05 拦截器

Spring拦截器,编写一个类实现org.springframework.web.servlet.HandlerInterceptor;就可以作为拦截器使用了

拦截器中有3个方法

//请求到达方法前执行
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

//执行方法后,没有返回ModuleAndView之前,可以执行
    void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;

//方法执行后执行
    void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;

配置拦截器方式

<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/rs/**"/>
    <mvc:exclude-mapping path="/getCaptcha"/>
    <mvc:exclude-mapping path="/user/**"/>    <bean class="com.zing.account.interceptor.LoginInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

0x06全局异常的处理 ExceptionResolver

Spring中有现成的全局异常处理解决方法

public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

        if (e instanceof MyException) {
            //处理逻辑
        } else {
            //处理逻辑
        }
        return null;
    }
}

可以看到返回的依旧是 ModelAndView ,处理完成后,可将想返回给用户的友好的界面。

将这个全局异常处理器配置到xml中, 直接当Bean放进去就行,Spring会默认将异常处理交给这个Resolver。

<bean class="com.zing.exp-resolver.MyExceptionResolver"></bean>

---- 转载请注明出处,https://micorochio.github.io/2017/03/19/spring-mvc-note/
文章参考了一些其他大牛的技术博客和书籍,时间原因,忘了一些,
只记得: 开涛的博客 - ITeye
如有问题请批评指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,369评论 1 92
  • springmvc学习笔记 学习springmvc框架原理 包括哪些组件: 前端控制器(中心) 处理器映射器(三大...
    罗志贇阅读 1,171评论 0 51
  • 今天还在看《每天最重要的二小时》,第一章今天好像看明白点了一些,如忽略抉择点的坏处,是告诉我们有意识的去思考如何利...
    弈臻阅读 207评论 0 0
  • 2018年4月11号星期三天气晴亲子日记一年级七班谢明宇妈妈。 今天的天气比较热,担心明宇早上穿的保暖,下午...
    明天有宇阅读 184评论 0 0