SpringMVC 学习笔记 (day1 )

2021-12-08 21:42:49 浏览数 (1)

文章目录

  • SpringMVC Maven 项目创建配置
    • 一、添加东西 (构建项目更快)
    • 二、运行第一个 Spring MVC 程序
    • 2.1 Maven 配置
      • 2.2 springmvc.xml 配置
      • 2.3 SpringMVC 中的组件控制器
      • 2.3 web.xml 配置
      • 2.4 RequestMapping 讲解
    • 三、请求参数的绑定
      • 3.1 绑定的机制
      • 3.2 获得原生 Servlet API
    • 四、常用注解
      • 4.1 RequestParam
      • 4.2 RequestBody
      • 4.3 PathVariable
      • 4.4 RequestHeader
      • 4.5 CookieValue
      • 4.6 ModelAttribute
      • 4.6 SessionAttribute

SpringMVC Maven 项目创建配置

一、添加东西 (构建项目更快)

解决 maven 构建项目慢的问题

代码语言:javascript复制
 name: archetypeCatalog ,value: internal 

name:archetypeCatalog

value:: internal

二、运行第一个 Spring MVC 程序

2.1 Maven 配置
代码语言:javascript复制
<properties>  
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>  <maven.compiler.source>1.8maven.compiler.source>  <maven.compiler.target>1.8maven.compiler.target>  
	  
	<spring.version>5.2.3.RELEASEspring.version>
properties>

<dependencies>  
	<dependency>    
		<groupId>junitgroupId>    
		<artifactId>junitartifactId>    
	<version>4.11version>    
	<scope>testscope>  
	dependency>  
	  
	<dependency>    
		<groupId>org.springframeworkgroupId>    
		<artifactId>spring-coreartifactId>    
		<version>${spring.version}version>  
	dependency>  
	
	<dependency>    
		<groupId>org.springframeworkgroupId>    
		<artifactId>spring-contextartifactId>    
		<version>${spring.version}version>  
	dependency>  
	
	<dependency>    
		<groupId>org.springframeworkgroupId>    
		<artifactId>spring-webartifactId>    
		<version>${spring.version}version>  
	dependency>  

	<dependency>    
		<groupId>org.springframeworkgroupId>    
		<artifactId>spring-webmvcartifactId>    
		<version>${spring.version}version>  
	dependency>  
	
	<dependency>    
		<groupId>javax.servletgroupId>    
		<artifactId>javax.servlet-apiartifactId>    
		<version>4.0.0version>    
		<scope>compilescope>  
	dependency>
dependencies>
2.2 springmvc.xml 配置
代码语言:javascript复制
<beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.0.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-3.0.xsd">   
        
    <context:component-scan base-package="cn.gorit">context:component-scan>    
    
        
            
        <property name="prefix" value="/WEB-INF/pages/">property>        
        <property name="suffix" value=".jsp">property>    
    bean>    
        
    <mvc:annotation-driven/>
    
beans>
  1. 启动服务器,加载一些配置文件
    • DispatcherServlet对象创建
    • springmvc.xml 被加载了
    • HelloController 创建成对象
2.3 SpringMVC 中的组件控制器
  1. DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于 mvc 中的 c,dispatcherServlet 是整个流程控制中心,由它调用其他组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性

  1. HanderMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了 不同的映射器实现不同的映射方式,例如配置文件方式,实现接口方式,注解方式等

  1. Handler:处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet把用户请求转发送到 Handler。由 Handler 对具体用户请求进行处理

  1. HandlerAdapter:处理适配器

通过对 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器执行。

类比插座 和 接口

  1. View Resolver:视图解析器

View Resolver 负责将处理结果生成 View 视图, View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展现给用户

  1. View:视图

SpringMVC 框架提供很多 View 视图类型的支持,包括 jstlView,freemarkerView,pdfView等,我们最常用的视图就是 jsp。 一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发页面

  1. mvc:annitation-driven 说明
2.3 web.xml 配置
代码语言:javascript复制
	<web-app>  
		<display-name>Archetype Created Web Applicationdisplay-name>

      
    <servlet>    
        <servlet-name>dispatcherServletservlet-name>    
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>    
        <init-param>      
            <param-name>contextConfigLocationparam-name>      
            <param-value>classpath:springmvc.xmlparam-value>    
        init-param>    

        <load-on-startup>1load-on-startup>  
    servlet>  

	  
	<servlet-mapping>    
		<servlet-name>dispatcherServletservlet-name>    
		<url-pattern>/url-pattern>  
	servlet-mapping>
	
    
  <filter>
    <filter-name>characterEncodingFilterfilter-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>characterEncodingFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
web-app>
2.4 RequestMapping 讲解

作用:建立请求 URL 和处理请求方法之间对应的关系。

  1. path:指定请求路径 url
  2. value:value 属性和 path 属性是一样的
  3. method:指定该方法的请求方式
  4. params:指定限制请求参数的条件
  5. headers:发送请求中必须包含的请求头

三、请求参数的绑定

3.1 绑定的机制
  1. 请求参数绑定说明
    1. 绑定机制
      1. 表单提交的数据都是 k=v 形式 user=hehe&pwd=123
      2. SpringMVC 的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
      3. 要求:提交表单的 name 和 参数名称是相同的
    2. 支持的数据类型
      1. 基本数据类型和字符串类型
      2. 实体类型(JavaBean)
      3. 集合数据类型(List,map集合等)
  2. 基本数据类型和字符串类型
    1. 提交表单的 name 和参数的名称是相同的
    2. 区分大小写
  3. 实体类型(JavaBean)
    1. 提交表单的 name 和 javaBean 中的属性名称要一致
    2. 如果一个 JavaBean类中包含其他的引用类型,那么表单的 name 属性需要编写成:对象 属性: eg:address name
  4. 给集合属性数据封装
    1. JSP 页面编写方式:list[0] 属性, 封装对象表达式,对 前端的表单页面进行设置
  5. 请求参数中乱码解决(解决 post 请求乱码)
    1. web.xml 中配置 Spring提供的过滤器类 (上面的 web.xml 已经修改)
3.2 获得原生 Servlet API
代码语言:javascript复制
    // 获取原生的 Servlet API
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("执行了");
        System.out.println(request.getRemoteUser());
        return "success";
    }

四、常用注解

4.1 RequestParam

作用: ​ 把请求中指定名称的参数给控制器中的形参赋值 属性: ​ value:请求参数的名称 ​ required:请求参数中是否必须提交此参数

代码语言:javascript复制
// jsp 代码
<a href="anno/testRequestParam?name=haha">常用注解</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {

    @RequestMapping(value = "/testRequestParam")
    public String testAnno(@RequestParam(name="name") String username) {
        // 这样强制要求必须传 name,否则就把报错
        System.out.println("执行了");
        System.out.println("username:" username);
        return "success";
    }
}

https://www.bilibili.com/video/BV1Sb411s7qa?p=18

4.2 RequestBody

作用: ​ 用于获取请求体内容,直接使用得到的是 key=value&key1=value1 … 结构的数据 ​ 不适合 get 请求方法 赋值 ​ value:请求参数的名称 ​ required:是否必须有请求体,默认为:true,当取值为 get 时,请求方法会报错,如果

代码语言:javascript复制
// jsp 代码
    <form action="anno/testRequestBody" method="post">
        用户姓名:<input type="text" name="username"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    /**
     * 获取到请求体的内容
     * */
    @RequestMapping(value = "/testRequestBody")
    public String testRequestBody(@RequestBody String body) {
        System.out.println("执行了。。。");
        System.out.println(body);
        return "success";
    }
}
4.3 PathVariable
  1. 作用:拥有绑定 url 中的占位符的,例如:url中有/delete/{id},id 是占位符
  2. 属性:
    1. value:指定 url 中的占位符名称
  3. Restful 风格的 URL
    1. 请求路径一样,可以根据不同的请求方式执行后台的不同方法
    2. restful 风格的 URL 优点
      1. 结构清晰
      2. 符合标准
      3. 易于理解
      4. 扩展方便
代码语言:javascript复制
// jsp 代码
    <a href="anno/testPathVariable/10">PathVariable</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {

    /**
     * PathVariable 注解
     * */
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(name = "sid") String id) {
        System.out.println("执行了。。。");
        System.out.println(id);
        return "success";
    }
}
4.4 RequestHeader

作用: ​ 用于获取请求头消息 属性: ​ value:提供消息头名称 ​ value:请求参数的名称 ​ required:是否必须有此请求头

代码语言:javascript复制
// jsp 代码
    <a href="anno/testRequestHeader">RequestHeader</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {

    /**
     * 获取请求头的值
     * */
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
        System.out.println("执行了。。。");
        System.out.println(header);
        return "success";
    }
}
4.5 CookieValue

作用: ​ 用于把指定 cookie 名称的值传入控制器方法参数 属性: ​ value:指定 cookie 的名称 ​ required:是否必须有此 cookie

代码语言:javascript复制
// jsp 代码
    <a href="anno/testCookieValue">CookieValue</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {

    /**
     * 获取 Cookie 的值
     * */
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
        System.out.println("执行了。。。");
        System.out.println(cookieValue);
        return "success";
    }
}
4.6 ModelAttribute
代码语言:javascript复制
// jsp 代码
    <form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="username"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

@Controller
@RequestMapping("/anno")
public class AnnoController {

    /**
     * testModelAttribute 注解
     * */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute() {
        System.out.println("testModelAttribute 执行了。。。");
        return "success";
    }

    // 该方法会先执行
    @ModelAttribute
    public void showUser(String username, int age) {
        System.out.println("showUser 执行了");
        System.out.println(username);
        System.out.println(age);
        // 这里就可以进行数据库的一些操作了
    }
}
4.6 SessionAttribute

作用: ​ 用于多次执行控制器方法间的参数共享。 属性: ​ value:用于指定存入的属性的名称 ​ type:用于指定存入的数据类型

代码语言:javascript复制
// jsp 代码
    <a href="anno/testSessionAttributes">SessionAttributes</a>
        
// java 代码 存到 request 域当中
@Controller
@RequestMapping("/anno")
public class AnnoController {
    /**
     * testSessionAttributes 注解
     * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model) {
        System.out.println("testSessionAttributes 执行了。。。");
        // 底层会存储到 request 域对象中
        model.addAttribute("msg","World");
        return "success";
    }

}

// 存到 session 对象中
@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) // 把 msg=World 存入到 session域中 (新增)
public class AnnoController {
    /**
     * testSessionAttributes 注解
     * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model) {
        System.out.println("testSessionAttributes 执行了。。。");
        // 底层会存储到 request 域对象中
        model.addAttribute("msg","World");
        return "success";
    }

}

// pages/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>跳转成功了</h3>
    ${requestScope}
    
	${sessionScope}
</body>
</html>

显示 request 域

显示 session 域

0 人点赞