IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> WEB应用开发--SpringMVC部分学习(一)--详解SpringMVC运行流程与搭建步骤 -> 正文阅读

[Java知识库]WEB应用开发--SpringMVC部分学习(一)--详解SpringMVC运行流程与搭建步骤

SpringMVC 概述

springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。

springmvc 是一个基于 mvc 的 web 框架,方便前后端数据的传输. Spring MVC 拥有控制器,接收外部请求,解析参数传给服务层.

SpringMVC 运行流程

在这里插入图片描述

流程如下:

  1. 用 户 向 服 务 器 发 送 请 求 , 请 求 被 Spring 前 端 控 制 ServeltDispatcherServlet 捕获;前端控制器DispatcherServlet接收请求后,调用处理器映射HandlerMapping。
  2. 处理器映射器 HandlerMapping 根据请求的 url 找到处理该请求的处理器Handler ( 即 Controller ) , 将 处 理 器 Handler 返 回 给 前 端 控 制 器DispatcherServlet。
  3. DispatcherServlet 根 据 获 得 的 Handler , 选 择 一 个 合 适 的HandlerAdapter。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
    HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息
    数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double等
    数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
    数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult 或 Error 中
  4. Handler(自己的控制器)执行完成后,向 DispatcherServlet 返回一个ModelAndView 对象;
  5. 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet ;
  6. ViewResolver 结合 Model 和 View,来渲染视图
  7. 将渲染结果返回给客户端。

搭建 SpringMVC

1.导入相关jar包

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2.配置 DispatcherServlet 在 web.xml 文件中配置 DispatcherServlet 配置 spring 核心请求分发器

  <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置一个初始化参数, 参数spring配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--这次我们将部署在服务器上,所以需要在需要加载的配置文件地址前加classpath-->
            <param-value>classpath:Spring.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup><!--服务器启动时创建servlet-->
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern> <!-- / 所有请求都会进入到DispatcherServlet-->
    </servlet-mapping>

3.开启 SpringMVC 注解

<!--开启springmvc注解-->
<mvc:annotation-driven></mvc:annotation-driven>

导包进入spring.xml配置文件中

<import resource="spring_mvc.xml"></import>

控制器类搭建

@Controller 用于标记在一个类上,使用它标记的类就是一个 SpringMVC Controller 对象. Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@Controller 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。 @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上。

搭建代码以及搭建的三种方法

package com.qn.ssm.controller;

import com.qn.ssm.model.Admin;
import com.qn.ssm.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping(path = "/admin")
public class AdminController {
    @Autowired
    AdminService adminService;
      /*
      1.  value path 都是为类和方法指定映射地址. 是一个数组.
       可以配置多个地址,value = {"/test","/test1"}
       method 设置哪些请求方式可以访问此方法 ,如果没有设置,那么所有请求都可以
       也可以使用@PostMapping(value = "/test")  或者 @GetMapping(value = "/test");来指定
       @GetMapping(value = "/test")

     @RequestMapping(value = {"/test","/test1"},method = RequestMethod.GET)
     public void test(){
         System.out.println("访问到了控制层");
         //adminService.saveAdmin();
     }*/


     /*
      2. springMVC可以将HttpServletRequest request,HttpServletResponse 直接注入到我们方法中

     @GetMapping(path = "/getAdmin")
     public void getAdmin(HttpServletRequest request, HttpServletResponse response){
          System.out.println(request.getParameter("id"));
          System.out.println(request.getParameter("name"));
     }
     */

   /* 3. 如 果 请 求 参 数 的 名 称 与 处 理 器 方 法 中 的 参 数 名 称 相 同 , 那 么 在 使 用
    @RequestParam 绑定的时候,可以省略参数,甚至连@RequestParam 都可以省略*/

    /* @GetMapping(path = "/getAdmin")
     public void getAdmin(@RequestParam("id") Integer adminid,
                          @RequestParam("name") String adminName,
                          @RequestHeader("User-Agent") String User_Agent){
          System.out.println(adminid);
          System.out.println(adminName);
          System.out.println(User_Agent);
     }*/

     /*@GetMapping(path = "/getAdmin")
     public void getAdmin(Integer id,String name){
          System.out.println(id);
          System.out.println(name);
     }*/

    /*@PostMapping(path = "/getAdmin")
    public void getAdmin(Admin admin, Integer flag){
        System.out.println(admin);
    }*/

 
   @PostMapping(path = "/getAdmin")
   public void getAdmin(Admin admin, Integer flag){
       System.out.println(admin);
   }
}


Service层配置

package com.qn.ssm.service;

import com.qn.ssm.dao.AdminDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AdminService {
    @Autowired
    AdminDao adminDao;
    @Transactional
    public void saveAdmin(){
        adminDao.saveAdmin();
    }
}

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <a href="admin/getAdmin?id=1&name='zhangsan'">admin</a>

  <form method="post" action="admin/getAdmin">
       <input type="text" name="account">
       <input type="text" name="password">
       <input type="text" name="age">
       <input type="text" name="birthday">
       <input type="submit">
  </form>
</body>
</html>

还有我们事先搭建的Admin类

package com.qn.ssm.model;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class Admin {
    private Integer id;
    private String account;
    private String password;
    private Integer age;
    private Date birthday;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}

现在开始测试

超简易界面

在这里插入图片描述

输入数据,进行提交,查看返回

在这里插入图片描述

发现报错,这是为什么呢 ?

在这里插入图片描述

发现是在提交birthday时因为类型无法转换,所以无法输出,我们要在这里对时间的输出格式进行规范化

@DateTimeFormat(pattern = "YYYY-MM-dd")
private Date birthday;

再次测试
在这里插入图片描述

输出成功

参数绑定与类型转换

如果请求参数比较多,通常是将这些参数放到一个实体中,然后只需要在处理器方法上定义这个实体作为参数。HandlerAdapter 会将这个对象的实例创建出来,然后从请求参数中取出这些参数然后放到实体对象中,需要注意的是请求参数的名字需要与实体类中的属性一一对应,只有对应的属性才会提取参数的值。

过滤静态资源文件

 <!--不过滤静态文件进入到DispatcherServlet, 如果检测到请求地址中有.这样的符号,认为是.html .css .jpg....静态文件访问,不是访问后端控制器的地址-->
    <mvc:default-servlet-handler/>

当 DispatcherServlet 的 url 配置为/时 需要添加此配置,能够访问静态资源
例如.jpg,.js,.css 带有后缀名文件。

在 springMVC-servlet.xml 中配置后,会在 Spring MVC 上下文中定义一个
org.springframework.web.servlet.resource.DefaultServletHttpRequest Handler,它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理

中文乱码处理

我们发现在提交请求的时候,如果输入的是中文,处理器方法获取到之后是乱码。乱码产生的原因在 Java Web 课程中已经讲解过了,解决的方法就是添加一个过滤器,为 request 对象设置编码集。SpringMVC 中已经为我们提供了这个过滤器,只需要在 web.xml 中配置好即可

 <!--post请求中文编码过滤器设置-->
    <filter>
        <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

总结式流程图

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:14:49  更:2022-02-28 15:18:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:03:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码