黑马程序员课程SpringMVC听课笔记

news2024/11/15 17:50:48

目录

SpringMVC概述

入门案例

   使用Servlet技术开发web程序流程

  使用SpringMVC技术开发web程序流程

导入pom.xml文件

UserController

SpringMvcConfig

ServletContainersInitConfig

POST请求中文乱码处理

代参数GET请求

请求参数与传递

普通参数:请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

POJO参数传递和嵌套POJO参数传递

对应实体类

数组和集合传参

接受请求中的JSON数据

 设置接受JSON数据@RequestBody

@RequestBody和@RequestParam区别

日期类型参数的传递


SpringMVC概述

1.SpringMVC 是一种基于Java实现MVC模型的轻量级框架

优点

    1.1使用简单,开发便捷

     1.2灵活性强

入门案例

   使用Servlet技术开发web程序流程

   1.创建web工程

   2.设置tomcat服务器,加载web工程(tomcat插件)

   3.导入坐标Servlet

   4.定义处理请求的功能类(User Servlet)

   5.设置请求映射

  使用SpringMVC技术开发web程序流程

 1.创建web工程

   2.设置tomcat服务器,加载web工程(tomcat插件)

   3.导入坐标SpringMVC+Servlet

   4.定义处理请求的功能类(UserController

   5.设置请求映射(配置映射关系)

   6.将SpringMVC设定加载到Tomcat容器中

导入pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.liyang</groupId>
  <artifactId>springMVC_001</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springMVC_001 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.18</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

UserController

package com.liyang.controller;

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

/**
 * @version 1.0
 * @auter liyang
 */

//定义controller
//使用@Controller定义bean
@Controller
public class UserController {
    //设置当前操作的访问路径
    @RequestMapping("/save")
    //设置当前操作的返回值类型
    @ResponseBody
    public String sava(){
        System.out.println("user save...");
        return "{'module':'springmvc'}";
    }
}

SpringMvcConfig

package com.liyang.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @version 1.0
 * @auter liyang
 */

//创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.liyang.controller")
public class SpringMvcConfig {

}

ServletContainersInitConfig

package com.liyang.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * @version 1.0
 * @auter liyang
 */
//定义一个servlet容器启动配置类在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

    //加载springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置那些请求归属springmvc处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

因为功能不同,如何避免Spring错误的加载到SpringMvc的bean

加载Spring控制的时候排除掉SpringMVC控制的bean

1.SpringMVC对应bean加载

2.Spring对应bean加载

package com.liyang.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * @version 1.0
 * @auter liyang
 */
//定义一个servlet容器启动配置类在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}


/*
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

    //加载springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置那些请求归属springmvc处理
    @Override
    protected String[] getServletMappings() {

        return new String[]{"/"};
    }

    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
}
*/

POST请求中文乱码处理

//乱码处理

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter=new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

代参数GET请求

 //普通参数
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("普通参数 name==>"+name+"  "+age);
        return "{'module':'common param'}";
    }

请求参数与传递

普通参数:请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

 @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String Username, int age){
        System.out.println("普通参数 name==>"+Username+"  "+age);
        return "{'module':'common param different name'}";
    }

POJO参数传递和嵌套POJO参数传递

//POJO参数
    @RequestMapping("/PojoParam")
    @ResponseBody
    public String PojoParam(User user){
        System.out.println("POJO参数传递 name==>"+user);
        return "{'module':'POJO param'}";
    }

    @RequestMapping("/PojoContainPojoParam")
    @ResponseBody
    public String PojoContainPojoParam(User user){
        System.out.println("POJO参数传递 name==>"+user);
        return "{'module':'POJO Contain Pojo param'}";
    }

对应实体类

package com.liyang.domain;

/**
 * @version 1.0
 * @auter liyang
 */
public class User {
    private String name;
    private int age;

    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

数组和集合传参

@RequestMapping("/ArrayParam")
    @ResponseBody
    public String ArrayParam(String[] likes){
        System.out.println("POJO参数传递 likes==>"+ Arrays.toString(likes));
        return "{'module':'Arrayparam'}";
    }

    @RequestMapping("/listParam")
    @ResponseBody
    public String ArrayParam(@RequestParam List<String> likes){
        System.out.println("POJO集合参数传递 likes==>"+ likes);
        return "{'module':'list param'}";
    }

接受请求中的JSON数据

设置发送json数据(请求body中添加JSON数据)

开启自动转换JSON数据支持

//@EnableWebMvc开启 由JSON数据转换实体类数据
//创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.liyang.controller")
@EnableWebMvc
public class SpringMvcConfig {

}

 设置接受JSON数据@RequestBody

 //JSON参数数据传输
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("POJO集合参数传递 likes==>"+ likes);
        return "{'module':'list for Json param'}";
    }

    //POJO参数JSON传输
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("POJO集合参数传递 user==>"+ user);
        return "{'module':'POJO for Json param'}";
    }

    //POJO集合参数JSON传输
    @RequestMapping("/listpojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list POJO集合参数传递 user==>"+ list);
        return "{'module':'list POJO for Json param'}";
    }

@RequestBody和@RequestParam区别

区别:

    @RequestParam用于接收url地址传输,表单传输【application/x-www-from-urlencoded】

   @RequestBody用于接收json数据(application/json)

运用

   后期开发中,发送json格式数据为主,@RequestBody运用较广

   如果发送非JSON格式数据,选用@RequestParam接受请求参数

日期类型参数的传递

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python -- PyQt5(designer)中文详细教程(一)Qt的基本功能

在介绍PyQt5中文详细教程前&#xff0c;如有需要安装PyQt5的同学可以在此 PyQt5安装详细教程_M_Q_T的博客-CSDN博客参考安装&#xff0c;里面有详细的安装内容。 下一章内容python -- PyQt5&#xff08;designer&#xff09;中文详细教程(二)菜单和工具栏 ​​​​​​​http:…

技术人员创业的第一步分析

概述&#xff1a;看完了本文&#xff0c;基本上可以了解确认自己所掌握的技术是否适合创业&#xff0c;如果不适合&#xff0c;不如找个大公司长期停留&#xff0c;也挺好的&#xff0c;免得折腾&#xff01;————————————————————前几天和一个朋友聊天&…

资源管理的部分

估算资源的活动的资源目录概述需求&#xff1a;设计思路实现思路分析1.估算的资源的资源的分解结构&#xff1a;获取资源2.虚拟团队3.CPO模型4.团队的5.资源日历建设团队团队一般成长规律形成 指导型管理风格认可奖励培训指标管理团队关于授权情商&#xff0c;领导力等控制资源…

排障必用的4款工具,帮你缩减排障时间!-网络工程师

Zen Load Balancer Zen Load Balancer是一个基于 Debian 的发行版&#xff0c;主要用于实现 TCP 的负载均衡。如果你在工作中遇到需要服务器负载均衡的功能&#xff0c;但又没有预算的时候&#xff0c;这个工具就能帮到你了。 可通过定制的脚本来检查后端的运行状态&#xff0c…

【java】3-获取线程引用与线程的属性

1.获取线程的引用 在创建一个线程之后&#xff0c;我们很有必要去获取当前线程实例的引用&#xff0c;以便能够观察到线程的一些属性&#xff0c;或是对于当前线程进行一系列的操作 调用Thread类的静态方法currentThread&#xff0c;我们便能拿到当前线程的引用 Thread.curr…

软件项目尾期,客户提新需求怎么办?

1、需求管理流程很关键 面对客户的需求要求&#xff0c;需求管理流程很关键。 在前期与用户签订合同时&#xff0c;可以增加一些相关条款&#xff0c;如限定用户提出需求变更的时间&#xff0c;规定何种情况的变更可以接受、拒绝接受或部分接受&#xff0c;还可以规定发生需求变…

[论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)

[论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping for Example-Based Colour Transfer, [paper], [matlab代码] 1-算法原理 本文将颜色迁移变成数据分布的转换问题, 因而本文需要解决2个方面的问题, 如何描述…

Kettle BIGNUMBER TIMESTAMP 类型格式处理

一、问题描述 Kettle默认的格式化处理对BIGNUMBER列 ,把0 会强行写成0.0;对TIMESTAMP列强行写成如2021/12/31 16:51:55.000000000格式。从而引起不必要错误。 二、解决方案 最新的Kettle下载地址:https://udomain.dl.sourceforge.net/project/pentaho/Pentaho-9.3/client…

算法常见技巧 -快速幂及其相关应用

快速幂 题目 快速幂 典型题例&#xff1a; 给定 n 组 aia_iai​, bib_ibi​, pip_ipi​&#xff0c;对于每组数据&#xff0c;求出 aiba_i^baib​ modmodmod pip_ipi​的值。 示例 &#xff1a; 2 3 2 5 4 3 9思路 代码&#xff1a; /* 核心思路&#xff1a;反复平方法 …

【大数据入门核心技术-Hadoop】Hadoop非高可用集群搭建

目录 目录 一、Hadoop部署的三种方式 1、Standalone mode&#xff08;独立模式&#xff09; 2、Pseudo-Distributed mode&#xff08;伪分布式模式&#xff09; 3、Cluster mode&#xff08;集群模式&#xff09; 二、准备工作 1、/etc/hosts 2、关闭防火墙和禁用swap交…

计算机软考高项(信息系统项目管理师)、中项(系统集成项目管理工程师),统计师中级的一些备考经验

软考高项及中项 对于因各种原因需要拿工程系列职称的朋友&#xff0c;计算机软考高项和中项可能是性价比最高的副高级职称和中级职称&#xff0c;没有学历和工作经验的要求&#xff0c;是水平考试&#xff0c;即可以跳过初级、中级&#xff0c;直接考高级&#xff0c;也可以考…

[附源码]JAVA毕业设计九宫格日志网站(系统+LW)

[附源码]JAVA毕业设计九宫格日志网站&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

# 智慧社区管理系统-核心信息管理-02物业收费管理

一 后端 1:entity package com.woniu.community.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public class PropertyInfo {private int id;private int typeId;private Doub…

制作php的composer包

目录 1、初始化包 2、将代码推送到github远程仓库 3、为写好扩展包打上tag标签标记当前代码版本 4、将包发布到包管理平台 初始化包&#xff0c;生成 创建配置文件composer.json composer init composer init 按照引导就可以生成了 , 详细的引导解释如下 This command wil…

计算机图形学中的曲线问题——拉格朗日插值曲线绘制实践

拉格朗日插值曲线的绘制 限于篇幅&#xff0c;我们将在这篇文章中介绍拉格朗日插值曲线绘制实践&#xff0c;主文章链接&#xff1a; GGN_2015 计算机图形学中的曲线问题 在主文章中我们已经介绍了拉格朗日插值函数的绘制方法。给定一个函数必须通过的点的集合&#xff0c;保证…

学习spring源码的意义是什么呢?有什么高效的源码学习方式吗?

这不是准备跳槽了&#xff0c;所以最近摸鱼比较多一些&#xff0c;老大默许了&#xff0c;我觉得我老大还是很好的。也在网上看了一些资料&#xff0c;但是&#xff0c;我发现很多讲解注解的时候&#xff0c;对于一些可以直接点击源码查看的内容讲解的占多数&#xff0c;但是授…

【学习笔记】《Python深度学习》第六章:深度学习用于文本和序列

文章目录1 处理文本数据1.1 单词和字符的one-hot编码1.2 使用词嵌入1.3 从原始文本到词嵌入2 循环神经网络2.1 Keras中的循环层2.2 LSTM层和GRU层2.3 实例&#xff1a;使用 LSTM 进行 IMDB 电影评论分类3 循环神经网络的高级用法3.1 温度预测问题3.2 准备数据3.3 基于常识、非机…

eclipse导入svn项目,项目有红色的感叹号/叉号

eclipse导入svn项目&#xff0c;项目左下角有红色的感叹号/叉号 1.首先调出Problems ( window -> show view-> Problems ) 查看报错信息 其次&#xff0c;看看Project是否开启了项目自动构建&#xff08;Build Automatically&#xff09; 2.根据报错信息逐一解决 3.…

【Linux内核代码分析1】Linux时间子系统及HRTIMER实现

Linux时间子系统软件架构 &#xff08;1&#xff09;嵌入式设备需要较好的电源管理策略。传统的linux会有一个周期性的时钟&#xff0c;即便是系统无事可做的时候也要醒来&#xff0c;这样导致系统不断的从低功耗&#xff08;idle&#xff09;状态进入高功耗的状态。这样的设计…

从 Nauty 数据结构出发认识群论

在阅读本文前&#xff0c;强烈建议有志入门群论的同学观看 3blue1brown 魔群 视频。 对于计算机方向同学&#xff0c;可以尝试从数据结构的角度理解。本文主要基于文档、网站 Nauty 和 Nauty 的 python binding, pynauty(github.com) 展开。 Nauty 数据结构 本小节截选自 Na…