SpringMVC基础

简介: SpringMVC基础

一:什么是SpringMVC

SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把模型--视图--控制器分离,将web层进行职责解耦,把复杂的web运用分成逻辑清晰的几部分,简化开发,减少出错,方便组内成员的配合

二:SpringMVC快速入门

1.导入依赖

创建Maven项目,并导入对应的jar包,在pom.xml文件中导入以下两个依赖

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.31</version>
        </dependency>

2.创建核心配置类

在src包下创建两个包,分别为config包和controller包

在config包下创建SpringMvcConfig核心配置类

 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
 
@Configuration//表示为一个配置类
@ComponentScan("com.lcyy")//扫描包
public class SpringMvcConfig {
 
    //创建一个视图解析器到IOC容器中去
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        //设置视图的前缀
        resolver.setPrefix("/pages/");
        //设置后缀
        resolver.setSuffix(".jsp");
 
        return resolver;
    }
 
    
}

在创建ServletConfig类

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
 
public class ServletConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置,放到IOC容器中去
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
 
    }
 
    //配置tomcat需要接收到的哪些资源
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
 
    //加载spring配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

3.创建controller关键类

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Controller
public class UserController {
    //访问的是视图
    @RequestMapping("/save")
    public String save(){
        return "success";
    }
 
    /**
     * @ResponseBody 添加这个注解表示为在视图显示json字符串
     * @return
     */
    @RequestMapping("/save2")
    @ResponseBody
    public String save2(){
        return "hello";
    }
}

4.创建访问的资源

在webapp下创建pages包,在包下创建名为:success.jsp的jsp文件

<%--
  Created by IntelliJ IDEA.
  User: 22818
  Date: 2024/5/12
  Time: 13:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
hello 我是Springmvc
</body>
</html>

5.配置tomcat

6.浏览器测试

运行tomcat,在浏览器输入localhost:8080/save 和  localhost:8080/save2,对应的结果分别如下:

7.解决中文乱码问题:

在ServletConfig类下,重写getServletFilters()方法(此为过滤器),定义编码格式为utf-8

 /**
     * 解决中文乱码问题,使用过滤器(输入(服务器向外发送为输入))
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        //设置为utf-8
        filter.setEncoding("utf-8");
        //返回过滤器
        return new Filter[]{filter};
    }

 三:测试工具:Postman

1.软件介绍:

1. Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具

2. 做 WEB 页面开发和测试的人员常用工具

3. 创建和发送任何的 HTTP 请求 (Get/Post/Put/Delete...)

2.测试请求数据

Get请求:

2.1:普通参数—参数名相同
/**
     * 普通参数--参数相同(get)
     * @param name
     * @param age
     * @return
     */
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,Integer age){
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "success";
    }
2.2参数为字符串数组
  /**
     * 参数为字符串数组(get请求)
     * @param hobby
     * @return
     */
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] hobby){
        //封装到数组里
        System.out.println("hobby = " + Arrays.toString(hobby));
        return "success";
    }
2.3参数为字符串集合
/**
     * 参数为字符串集合(get)需添加@RequestParam
     * @param hobby
     * @return
     */
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> hobby){
        System.out.println("hobby = " + hobby);
        return "success";
    }
2.4日期类型
  /**
     * 日期格式
     * @param date
     * @param date1
     * @return
     */
    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(Date date,
                            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1)
    {
        System.out.println("date = " + date);
        System.out.println("date1 = " + date1);
        return "success";
    }

Post请求:

2.5普通参数—参数名相同
/**
     * 普通参数--参数相同(get)
     * @param name
     * @param age
     * @return
     */
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name,Integer age){
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "success";
    }
2.6普通参数—参数名不同
 /**
     * 普通参数--形参名不同,起别名
     * @param username
     * @param age
     * @return  返回给前端
     */
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String username, Integer age){
        System.out.println("username = " + username);
        System.out.println("age = " + age);
        return "success";
    }
2.7参数为实体类型
 /**
     * 参数为pojo(实体类)类型(post)
     * @param u
     * @return 返回给前端
     */
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User u){
        //封装为了实体类
        System.out.println("user = " + u);
        return "success";
    }
2.8参数为实体类型嵌套实体类
 /**
     * pojo嵌套使用(post)
     * @param u
     * @return
     */
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User u){
        //封装为了实体类
        System.out.println("user = " + u);
        return "success";
    }
2.9JSON数组—字符串数组接收,集合接收
 /**
     * 理论上get请求可以发送json数据,但一般用post请求发送json数据
     * @param hobby
     * @return
     */
    @RequestMapping("/jsonArray")
    @ResponseBody
    public String jsonArray(@RequestBody List<String> hobby){
        System.out.println("hobby = " + hobby);
        return "success";
    }
 
 /**请求
     * JSON对象数组,用pojo实体集合接收
     * @param list
     * @return
     */
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list = " + list);
        return "success";
    }
2.10JSON对象—实体类接收
 /**
     * 请求
     * @param user
     * @return
     */
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("user = " + user);
        return "success";
    }
2.11JSON对象数组—实体类集合接收
/**请求
     * JSON对象数组,用pojo实体集合接收
     * @param list
     * @return
     */
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list = " + list);
        return "success";
    }

3.测试响应数据

3.1POJO转JSON字符串
/**
     * 响应:JSON转字符串,响应给前端
     * @param user
     * @return
     */
    @RequestMapping("/toJson")
    @ResponseBody
    public User toJson(User user){
        User user1 = new User();
        user1.setName("张三");
        user1.setAge(18);
        user1.setAddress(new Address("广州省·","深圳市"));
        return user1;
    }
3.2POJO集合转JSON数组
 /**响应
     *pojo集合转json数组
     * @param
     * @return
     */
    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        List<User> users = new ArrayList<>();
        User user1 = new User();
        User user = user1;
        user.setName("张三");
        user.setAge(25);
        user.setAddress(new Address("陕西省","西安市"));
 
        User user2 = new User();
        user2.setName("李四");
        user2.setAge(20);
        user2.setAddress(new Address("陕西省","安康市"));
 
        User user3 = new User();
        user3.setName("李非");
        user3.setAge(21);
        user3.setAddress(new Address("陕西省","汉中市"));
 
        users.add(user);
        users.add(user2);
        users.add(user3);
        return users;
    }


相关文章
|
26天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
3天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
352 14
|
19天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
23天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2590 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
5天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
180 2
|
3天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
104 65
|
6天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
321 2
|
23天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码