Java基础框架之SpringMVC

MVC三层架构

  • MVC三层架构前面也都了解过了,在这里想说的是,在实际的开发中Model层可能有dao、service、pojo(entity),但是pojo也有可能会被细分为dto、vo,vo就是向视图层传输必要的数据,比如用户表中有用户名、密码、爱好、生日...,但是在登录的时候,视图层就只需要用户名和密码,如果把整个用户表封装为对象传过去会浪费资源,所有就使用了vo,只传输必要的数据,一些项目的源码都有这个。

SpringMVC框架要做哪些事?

  • 1.将URL映射到java类或java类的方法。
  • 2.封装用户提交的数据。
  • 3.处理请求、调用相关的业务、封装响应数据。
  • 4.将响应的数据进行渲染 .jsp/html等表示层数据。

SpringMVC中的DispatchServlet

  • 相当于在以前的servlet加了一层,以前每访问一个页面都要注册servlet,而现在用了DispatchServlet就只用配置一次,每个URL地址都会有DispatchServlet来处理,更加方便了。

SpringMVC执行原理

mvc.png
  • 1.DispatchServlet表示前置控制器,是SpringMVC的控制中心。用户发出请求,DispatchServlet接受请求并拦截请求。
    • 假设我们请求的url为:http://loaclhost:8080/springmvc/hello(这里的springmvc不是我们在代码中写的url,而是在Tomcat中配置的站点!)
    • http://localhost:8080 为服务器域名,springmvc为部署在服务器上的站点。
    • hello 就可表示为控制器,由此分析,此url为:请求位于服务器localhost:8080上的springmvc站点的hello控制器。
  • 2.HandlerMapping为处理映射器。DispatchServlet调用HandlerMapping,HandlerMapping在根据url查找Handler。
  • 3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。如上,被查找到的控制器为hello。
  • 4.HandlerExecution将解析后的信息传递给DispatchServlet,DispatchServlet再让HandlerAdapter(处理器适配器)去执行Handler。
  • 5.Handler在让具体的Controller执行。
  • 6.Controller执行完后再讲返回的信息传给HandlerAdapter,如ModelAndView。
  • 7.HandlerAdapter在将试图逻辑名或模型传给DispatchServlet,DispatchServlet再调用ViewResolver(视图解析器)来解析逻辑试图名。
  • 8.ViewResolver再将解析出来的结果传给DispatchServlet,DispatchServlet最后再调用具体的试图,最终呈现给用户。

配置SpringMVC的DispatchServlet

  • 在web.xml中配置DispatchServlet,以前我们一个页面需要配置一个servlet,现在只用配置一个DispatchServlet,让它管理所有的servlet。(用架构的话来说就是加了一层)
<!--配置SpringMVC的核心:DispatchServlet,请求分发器或前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatchServlet</servlet-class>
<!--DispatchServlet要绑定Spring的配置文件-->
<!--classpath:就是resources文件下的路径-->
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern><!--这是请求的路径,所有请求都会被它拦截-->
</servlet-mapping>

Tips:这里的请求路径不要写成 /* ,因为 /* 会匹配所有请求,包括jsp页面,而 / 则不会匹配jsp页面。

spring-mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
           ">
  <!-- 扫描controller的注解,别的不扫描 -->
    <context:component-scan base-package="com.jxlg.controller">
    </context:component-scan>

    <!-- 配置视图解析器,这个可以改变,到使用springboot时可以改为thymeleaf模板引擎 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- JSP文件所在的目录,前缀 -->
        <property name="prefix" value="/pages/" />
        <!-- 文件的后缀名 ,后缀-->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/img/" mapping="/img/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/plugins/" mapping="/plugins/**" />

    <!-- 开启对SpringMVC注解的支持,并且自动注入了处理器映射器和处理器适配器 -->
    <mvc:annotation-driven />

</beans>

Tips:页面 = 试图解析器前缀 + 返回的值(return "xxx") + 试图解析器后缀

RestFul风格

@Controller
public class test{
    @ResquestMapping("/add/{a}/{b}")
  public void add(@PathVariable int a,@PathVariable int b,Model model){
    int res=a+b;
    model.addAtribute("msg","结果为"+res);
    return "add";
  }
}

【总结】:主要是要利用@PathVariable注解进行传值。

  • RestFul风格还有多种提交方式:
    • GetMapping
    • DeleteMapping
    • PutMapping
    • PostMapping
    • PatchMapping

Tips:@RestController是只返回字符串,不会走视图解析器,@ResponseBody也是直接返回字符串不会走试图解析器。

解决springmvc中文乱码问题

  • 在web.xml中配置filter过滤器
<!--利用springMvc帮我们写好的过滤器来解决中文乱码问题-->
<filter>
  <filter-name>ecoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

了解JSON

  • 什么是JSON:json只是一种格式。在前后端分离时代,后端就复责给前端一个接口,但是后端传给前端的值必须要是json的格式,前端才能识别使用,所以我们要将数据转换为json格式,可以使用Jackson架包将数据转为json格式,要导入Jackson依赖。
  • JSON中文乱码的问题:自己百度,就是在applicationContext.xml中配置。
  • FastJson:阿里巴巴的一个工具包,也可以将数据转为json格式,简单好用 QuickStart

SpringMVC拦截器

  • SpringMVC的处理器拦截器类似于Servlet中的Filter过滤器,用于处理器进行预处理和后处理。
  • 过滤器和拦截器的区别:拦截器是利用AOP的思想,对代码进行横切进去的。拦截器只能拦截访问控制器的方法,如果访问的是静态资源文件则不会被拦截。
  • 自定义拦截器:实现HandlerInterceptor接口。

Tips:在WEB-INF目录下的页面或者文件都不能直接访问,必须通过Controller或者Servlet进行访问!

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

推荐阅读更多精彩内容

  • Java分层概念(转) 原文地址(也不属于原文吧,这也是别人转载的不知道原作者是谁,如有侵权,请联系,以删除):h...
    小小世界R阅读 1,638评论 0 0
  • 从PO, DTO到Domain Driven Design 前言 随着各种模式的层出不穷(MVC, MVP, MV...
    AllenJoker阅读 1,804评论 0 0
  • service是业务层,DAO (Data Access Object) 数据访问 1.JAVA中Action层,...
    FSDemo阅读 4,557评论 0 5
  • java的(PO,VO,TO,BO,DAO,POJO)解释 O/R Mapping 是 Object Relati...
    李序锴阅读 2,260评论 0 7
  • 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构 表现层就是看到的东西,比如你现在看到的当...
    ZZS_简阅读 1,256评论 0 1