SpringMVC —— 前提

发布时间 2023-06-18 17:00:42作者: 朱呀朱~

SpringMVC — 前提

前提了解:Web 开发中的一些概念

  • JavaBean规范

    • 必须是一个公共类,如:public class User{ }
    • 必须有一个空的构造器
    • 类的成员变量是私有,如:private int id;
    • 通过 getter / setter 来访问属性
  • 在软件体系架构中,分层式结构最常见,微软推荐的分层式结构为三层:数据访问层、业务逻辑层 ( 领域层 )、表示层

    • 数据访问层 ( DAL ):面向数据库,数据的添删改查。   

    • 业务逻辑层 ( BLL ):面向业务逻辑,对数据层的操作、对数据业务逻辑处理。   

    • 表示层 ( UI ):面向用户,通俗讲就是展现给用户的界面。

  • 对应关系

    • 数据访问层 ( DAL ) --> Dao 

    • 业务逻辑层 ( BLL ) --> Service   

    • 表示层 ( UI ) --> HTML、JSP

Servlet 的 url-pattern 匹配规则

  • 注解方式:似先前常用 servelt 将功能映射到 web 前端

    • @WebServlet(“/xxx”) .... extends HttpServlet
  • web.xml 配置:

    <!-- 一、 Servlet的url-pattern匹配规则——前提 -->
      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.qut._20.MyServlet</servlet-class>
      </servlet>
    
    • 精准匹配

      <!-- 1、精确匹配1 -->
        <servlet-mapping>
          <servlet-name>MyServlet</servlet-name>
          <url-pattern>/MyServlet</url-pattern>  // “/MyServlet”时会根据MyServlet匹配到上面的class类
        </servlet-mapping>
      
    • 增加路径

      <url-pattern>/a/b/MyServlet</url-pattern>
      
    • 加路径加扩展名

      <url-pattern>/a/b/MyServlet.do</url-pattern>
      
    • 路径匹配,只要是 /a/b 下的所有都可以访问

      <url-pattern>/a/b/*</url-pattern>
      
    • 扩展名匹配,do 结尾的任意 url 都可访问

      <url-pattern>*.do</url-pattern>
      
    • 缺省匹配,任何无扩展名路径来都能匹配上

      <url-pattern>/</url-pattern>
      
  • 注意 / 与 /* 的区别

    • <url-pattern>/</url-pattern> 只匹配 /login,不匹配 *.jsp 这样的后缀型 url ( 静态资源也会被拦截 )
    • < url-pattern>/*</url-pattern> 匹配所有 url,即 /login,* .jsp,* .js,* .html 等 ( 所有都拦截 )
    • 为放行静态资源,xml 需要加上:<mvc:default-servlet-handler/> 放行静态资源的配用

SpringMVC 原理

  • 用户发送请求 -> DispatcherServlet ( 前端控制器 )
    • 前端控制器作为统一访问点,进行全局流程控制:收到请求后委托给其他解析器进行处理
  • DispatcherServlet -> HandlerMapping ( 处理器映射器 ) —— url 到 controller
    • 处理器映射器把请求映射为 HandlerExecutionChain 对象,方便添加各种新的映射策略,HandlerExecutionChain 包含一个 Handler 处理器、多个 HandlerInterceptor 拦截器
  • DispatcherServlet -> HandlerAdapter ( 处理器适配器 )
    • 处理器适配器使用适配器设计模式,把处理器包装为适配器,支持多种类型的处理器
  • HandlerAdapter -> 处理器 —— 具体到 RequestMapping 方法
    • HandlerAdapter 根据适配的结果,调用处理器,完成处理功能,返回一个 ModelAndView 对象
  • DispatcherServlet -> ViewResolver ( 视图解析器 ) —— 返回字符串,得到的是一个页面
    • 视图解析器把逻辑视图名解析为具体的 View,通过这种策略可以很方便的更换其他图技术
  • DispatcherServlet -> View ( 视图 ) —— 页面
    • 视图把传进来的 Model 模型数据进行渲染,该 Model 是一个 Map 数据结构,因此很容易支持其他视图技术
  • 由 DispatcherServlet 返回响应给用户,到此一个流程结束
  • 主要是写好处理器,其实 mvc 可看做就是一个功能强大的 servlet

img

SpringMVC 开发

  • 加 jar 包:spring-context ( 一带四 ccbe ) + spring-webmvc

  • xml:xmlns + xsi —— mvc

  • 想让 web 读配置文件 —— springmvc 的前端控制器编写

    <!--  web.xml 中配置 DispatcherServlet ( SpringMVC 的前端控制器 )  -->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--  value:自己配置文件 xml所在  -->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:8_springMVC.xml</param-value>
        </init-param>
    <!--  随web服务器启动,单实例多线程  -->
        <load-on-startup>1</load-on-startup>
      </servlet>
    
    <!-- 做映射(缺省匹配) -->
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
    <!--   匹配 / 开头的进行拦截,包括静态资源,从而做处理(处理器、映射器),不匹配*.jsp这样有扩展名的后缀型url,如果不拦截的话就不会有后面处理器的操作了  -->
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
  • 注意:如果打开了 tomcat,在 jsp 里点击网页没法直接打开,就把 web.xml 第一行替换为 <?xml version="1.0" encoding="utf-8" ?>

    • WEB-INF 里的资源不能通过浏览器直接访问 —— 可以内部跳转:转发、mv.setViewName
  • 处理器配置

    • xml 的 bean 中 class 指定 MyController 类,name 为 url 被访问的路径 ( 映射 url ),如:<bean id="myController1" class="com.qut._20.controller.MyController1" name="/hello1"></bean> —— 前端用超链接 <a href = "hello"></a>

      • F1:MyController 类 implements Controller {

        ​ 方法返回值 ModelAndView {

        ​ ModelAndView mv = new ModelAndView();

        ​ mv.setViewName ( “ 路径字符串,各层用 / 隔开 ”);

        ​ return mv;

        ​ }

        } —— ModelAndView 既能包含数据,还能告诉你访问哪个页面

      • F2:MyController 类 implements HttpRequestHandler {

        ​ void 方法含参 HttpServletRequest HttpServletResponse {

        ​ httpServletRequest.getRequestDispatcher("WEB-INF/jsp/2.jsp").forward(req, res);

        ​ }

        }

    • F3 ( 推荐 ):

      • xml 内配置

        <!--  1. 扫描包  -->
        	<context:component-scan base-package="com.qut._20"></context:component-scan>
        <!--  2. 用来支持RequestMapping等mvc注解  -->
        	<mvc:annotation-driven></mvc:annotation-driven>
        
        <!--  3. 默认情况下对静态资源不做拦截,放行jsp  -->
            <mvc:default-servlet-handler/>
        
      • 类前使用注解:@Controller

      • @RequestMapping ( “/被请求的url” ) —— 映射 url,被扫描到后自动创建 bean —— 于某方法前,方法里写具体操作

        如果置于类前,如:@RequestMapping ( value=“/controller1” )。则访问为两层:/controller1/被请求的url

      • 写字符串 url 时:/ 斜线开头表示根目录

代码

  • 前端控制器 + 处理器配置的第三种方式