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>

总结式流程图

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值