美文网首页
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