美文网首页
Java基础框架之SpringMVC

Java基础框架之SpringMVC

作者: 在error边缘疯狂试探 | 来源:发表于2020-04-16 10:52 被阅读0次

    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进行访问!

    相关文章

      网友评论

          本文标题:Java基础框架之SpringMVC

          本文链接:https://www.haomeiwen.com/subject/wevlvhtx.html