Spring Mvc 框架(一)


异常码:

405:请求不允许

404:资源不存在

400:参数有问题

500:代码有问题

SpringMvc是Spring FrameWork提供的WEB组件,是目前的主流的实现MVC设计模式的框架,提供前端的路由映射、视图解析等

java web 开发者必要的框架

Spring mvc 功能

部分概念

MVC :

MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。

  • 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
  • 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
  • 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。
  • JSP+JavaBean
  • Servlet+JSP+JavaBean
    优点
  • 多视图共享一个模型,大大提高了代码的可重用性
  • MVC 三个模块相互独立,松耦合架构
  • 控制器提高了应用程序的灵活性和可配置性
  • 有利于软件工程化管理
    缺点
  • 原理复杂
  • 增加了系统结构和实现的复杂性
  • 视图对模型数据的低效率访问

SpringMvc的组件:

1)DispatcherServlet

DispatcherServlet 是前端控制器,从图 1 可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。

2)HandlerMapping

HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)信息。

3)HandlerAdapter

HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。

4)Handler

Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。

5)View Resolver

View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)。

6)View

View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。

7)HandlerExecutionChain:处理器执行链(包括两部分Handler和HandlerInterceptor)

SpringMVC 的执行流程如下

  1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
  2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
  3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
  4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
  5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
  6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
  7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
  8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
  9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
  10. 视图负责将结果显示到浏览器(客户端)。

SpringMvc 的具体使用

1.导入依赖:


    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>5.2.3.RELEASEversion>
    dependency>
  dependencies>

2.在web.xml中配值SpringMvc 的DispatchServlet

<servlet>
  <servlet-name>springmvcservlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
  <init-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:springmvc.xmlparam-value>
  init-param>
servlet>
<servlet-mapping>
  <servlet-name>springmvcservlet-name>
  <url-pattern>/url-pattern>
servlet-mapping>

3.Springmvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"
>

    
    <context:component-scan base-package="com.southwind.controller">context:component-scan>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">

        <property name="prefix" value="/">property>

        <property name="suffix" value=".jsp">property>
    bean>
beans>

4.创建Handller

package com.southwind.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.xml.ws.RequestWrapper;

@Controller
public class HellowHandler {
    @RequestMapping ("/index")
    public String index(){
        System.out.println("接受到了请求");
        //返回逻辑视图
        return  "index";
    }
}

流程梳理:

1.DispatcherServlet接收到url请求index,结合@RequestMapping("/index")注解将该请求交给index业务处理

2.执行index业务方法,控制台打印日志,并返回”index“字符串

3.组合springmvc.xml中的视图解析器配置,找到对应的资源;/index.jsp, 即根目录下的index.jsp文件,将该文件的jsp资源返回客户端。

搭建成功;

SpringMvc的常用注解

@RequestMapping()

SpringMvc通过@RequestMapping注解将URL请求与业务的方法进行映射,在控制器的类定义处定义方法处都可以添加@RequestMapping,在类定义处添加相当于多了一层访问路径。

  • value :指定URL请求的地址,是@RequestMapping的默认值。
  • method:请求的method类型包括 GET POST PUT DELETE
  • params 请求的参数
    @Controller
    public class HellowHandler {
    @RequestMapping (value = "/index",params = {"id=1","name=tom"})
    public String index(){
    System.out.println("接受到了请求");
    //返回逻辑视图
    return "index";
    }
    }

参数绑定

params是对URL请求参数进行限制,不满足的URL不能访问,需要在业务方法中获取URL的参数值。

1.在业务方法定义时声明参数列表

2.给参数列表添加@RequsetParam 注解进行绑定

@Controller
public class HellowHandler {
    @RequestMapping (value = "/index",params = {"id"})
    public String index(@RequestParam("id") double id){
        System.out.println("接受到了请求"+"id="+id);
        //返回逻辑视图
        return  "index";
    }
}

Springmvc也支持RESTful风格的URL传参

@RequestMapping (value = "/index/{id}")
public String index1(@PathVariable("id") double id){
    System.out.println("接受到了请求"+"id="+id);
    //返回逻辑视图
    return  "index";
}

映射Cookie

@RequestMapping (value = "/Cookie")
public String index2(@CookieValue("JSESSIONID") String session){
    System.out.println("接受到了请求"+"session="+session);
    //返回逻辑视图
    return  "index";
}

使用POJO绑定参数

Springmvc会自动更据请求参数与POJO的属性名匹配,自动为该对象填充属性值,并支持属性级联。

乱码


<filter>
  <filter-name>encodingFilterfilter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
  <init-param>
    <param-name>encodingparam-name>
    <param-value>UTF-8param-value>
  init-param>
filter>
<filter-mapping>
  <filter-name>encodingFilterfilter-name>
  <url-pattern>/*url-pattern>
filter-mapping>

User:

package com.southwind.entity;

import lombok.Data;

@Data
public class User {
    private  Integer id;
    private  String name;
    private  Address address;
}

Address;

package com.southwind.entity;

import lombok.Data;

@Data
public class Address {
    private  Integer code;
    private  String name;
}

jsp:

<%--
  Created by IntelliJ IDEA.
  User: 郝泾钊
  Date: 2022-04-06
  Time: 17:34
  To change this template use File | Settings | File Templates.
--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Titletitle>

head>
<body>
    <form action="/add">
        <table>
            <tr>
                <td>编号:td>
                <td>
                    <input type="text" name="id">
                td>
            tr>
            <tr>
                <td>姓名:td>
                <td>
                    <input type="text" name="name">
                td>
            tr>
            <tr>
                <td>地址编号:td>
                <td>
                    <input type="text" name="address.code">
                td>
            tr>
            <tr>
                <td>地址信息:td>
                <td>
                    <input type="text" name="address.name">
                td>
            tr>
            <tr>
                <td>
                    <input type="submit" value="提交">
                td>
            tr>
        table>
    form>
body>
html>

controller:

@RequestMapping("/add")
public String add(User user){
    System.out.println(user);
    return "addUser";
}

JSP页面的转发和重定向

转发是服务器行为,重定向是客户端行为。转发耗时比重定向少。

转发——>客户浏览器发送HTTP请求——>web服务器接受请求——>调用内部一个方法在容器内部完成请求处理和转发动作——>再将转发跳转到的那个网页资源返回给客户; 转发只能在同一个容器内完成 转发的时候浏览器地址是不会变的,在客户浏览器里只会显示第一次进入的那个网址或者路径,客户看不到这个过程,只是得到了想要的目标资源。转发行为浏览器只做了一次请求。(转发只能跳转一次)

重定向——>客户浏览器发送HTTP请求——>web服务器接受请求后发送302状态码以及新的位置给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的HTTP请求,请求指向新的地址(302:Found 临时移动,但资源只是临时被移动。即你访问网址A,但是网址A因为服务器端的拦截器或者其他后端代码处理的原因,会被重定向到网址B。)——>服务器根据此请求寻找资源发个客户;再客户浏览器中显示的是重定向之后的路径,客户可以看到地址的变化。重定向行为浏览器做了至少两次请求。(重定向可以跳转多次

SpringMVC默认是以转发,(地址栏没有改变0

重定向:redirect

@RequestMapping("/add")
public String add(User user){
    System.out.println(user);
    return "redirect:/addUser.jsp";
}

转发;forward

相关