SpringMVC 程序开发

这篇具有很好参考价值的文章主要介绍了SpringMVC 程序开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

✏️作者:银河罐头
📋系列专栏:JavaEE

🌲“种一棵树最好的时间是十年前,其次是现在”

什么是 Spring MVC

SSM = Spring Boot + Spring Web(Spring MVC) + MyBatis

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc), 但它通常被称为"Spring MVC".

  1. Spring MVC 是⼀个 Web 框架。
  2. Spring MVC 是基于 Servlet API 构建的。

MVC 定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

SpringMVC 程序开发

怎么学 Spring MVC

学习 Spring MVC 我们只需要掌握以下 3 个功能:

1.连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序

2.获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数。

3.输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

Spring MVC 创建和连接

创建 Spring MVC 项目

2018年之前,使用 maven 项目添加 Spring MVC 框架的方式来创建,太复杂。

2018年之后 ,使用 Spring Boot 来创建 Spring MVC 项目。

@RestController
public class UserController {

    @RequestMapping("/say")//可以是 1 级路由,也可以是 n 级路由
    public String sayHi(){
        return "hi spring mvc";
    }
}

SpringMVC 程序开发

实现用户到 spring 程序的连接。

@RequestMapping 注解介绍

它支持 GET 请求

SpringMVC 程序开发

那它是否支持 post 请求?

用 postman 测试:

SpringMVC 程序开发

得出结论:它也支持 POST 请求.

SpringMVC 程序开发

GET, HEAD, POST,PUT, PATCH, DELETE, OPTIONS, TRACE 都支持。

在浏览器地址栏输入地址,默认是 GET 请求。

  • 如果我想设置成只支持其中某一种请求类型,如何实现?
@RestController
public class UserController {
    @RequestMapping(value = "/sayhi",method = RequestMethod.POST)
    public String sayHi(){
        return "hi spring mvc";
    }
}

SpringMVC 程序开发

设置成只支持 POST 请求,再发 GET 请求就失败了。

@PostMapping

除了通过 @RequestMapping 来设置 POST,还可以通过@PostMapping 来设置。

@PostMapping("/sayhello")
public String sayHello(){
    return "hello spring mvc";
}

SpringMVC 程序开发

小结:

2种实现路由连接的方式 :@RequestMapping 和 @PostMapping

@GetMapping("/hi")
public String hi(){
    return "spring mvc hi";
}

获取参数

获取单个参数

@RequestMapping("/sayhi")
public String sayHi(String name){
    return "hi " + name;
}

SpringMVC 程序开发

这里地址栏里 key 必须写"name", 才能成功拿到 value

SpringMVC 程序开发

SpringMVC 程序开发

如果传了错误的 key 或者不传参数 ,结果就是String 的默认值 null

@RequestMapping("/sayhi2")
public String sayHi2(Integer id){
    return "hi " + id;
}

SpringMVC 程序开发

@RequestMapping("/sayhi3")
public String sayHi3(int id){
    return "hi " + id;
}

SpringMVC 程序开发

参数传递不要使用基本数据类型(如 int)。

@RequestMapping("/sayhi4")
public String sayHi4(HttpServletRequest request, HttpServletResponse response){
    return "hi " + request.getParameter("name");
}

SpringMVC 程序开发

@RequestMapping("/sayhi4")
public String sayHi4(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.sendRedirect("https://www.sogou.com");
}

还可以实现重定向跳转页面。

获取多个参数

@RequestMapping("/sayhi")
public String sayHi(String name, String password){
    return "name =  " + name + "  | password = " + password;
}

SpringMVC 程序开发

参数顺序不重要,保证 key 正确就行。

传递对象

@Data
public class Userinfo {
    private int id;
    private String name;
    private String password;
    private int age;
}
//获取对象
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){
    return userinfo;
}

SpringMVC 程序开发

@RequestMapping("/h1")
public Object getH1(){
    return "<h1>我是 h1</h1>";
}

SpringMVC 程序开发

后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致, 比如前端传递一个 username 给后端,后端用 name 接收,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用@RequestParam 来重命名前后端的参数值。

@RequestMapping("/reg2")
public Object reg(@RequestParam("username") String name, String password){
    return "name = " + name + "  | password = " + password;
}

SpringMVC 程序开发

如果前端传的是 name, 会怎样?

SpringMVC 程序开发

SpringMVC 程序开发

规定 前端必须传 “username”.

@RequestMapping("/reg2")
public Object reg(@RequestParam(value = "username",required = false) String name, 
                  String password){
    return "name = " + name + "  | password = " + password;
}

required = false 设置之后

SpringMVC 程序开发

前端:对象/JSON 对象字符串

后端:对象/JSON 对象字符串

@RequestBody 接收JSON对象

用之前接收对象的方式,不能成功接收到 JSON 对象。

@RequestMapping("/reg")
public Object reg(Userinfo userinfo){
    System.out.println(userinfo);
    return userinfo;
}

用 postman 发送一个 post 请求。

SpringMVC 程序开发

用 @RequestBody 这个注解就可以成功接收到 JSON 对象了。

@RequestMapping("/reg3")
public Object reg3(@RequestBody Userinfo userinfo){
    return userinfo;
}

SpringMVC 程序开发

获取URL中参数@PathVariable

/user?uid=12345

/user/12345 优点:搜索引擎抓取关键字权重更高,更简洁

@RequestMapping("/reg4/{name}/{password}")
public Object reg4(@PathVariable String name, @PathVariable String password){
    return "name = " + name + " | password = " + password;
}

SpringMVC 程序开发

如果把路径里的 password 改成 pwd,会怎样?

SpringMVC 程序开发

SpringMVC 程序开发

SpringMVC 程序开发

这个参数是必须的。所以会报错。

@RequestMapping("/reg4/{name}/{pwd}")
public Object reg4(@PathVariable String name, @PathVariable(required = false) String password){
    return "name = " + name + " | password = " + password;
}

SpringMVC 程序开发

加 required = false 之后就不会报错,但是 还是得不到 password 的值。

小结:

@PathVariable: 基础 url 里面的参数(? 之前的参数)

@RequestParam: url 参数部分的参数(? 之后的参数)

@RequestMapping("/reg4/{name}/{pwd}")
public Object reg4(@PathVariable String name, @PathVariable(required = false,name = "pwd") String password){
    return "name = " + name + " | password = " + password;
}

SpringMVC 程序开发

上传文件@RequestPart

@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){
    File saveFile = new File("D:\\Data\\myimg.png");
    try {
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

用 postman 发送 post 请求:

SpringMVC 程序开发

SpringMVC 程序开发

文件上传成功。

默认要求上传单个文件大小不超过 1MB.

Common Application Properties (spring.io)

SpringMVC 程序开发

如果我要上传的文件很大怎么办?

SpringMVC 程序开发

可以设置上传文件大小。

有一个问题,后面上传的文件会把之前的文件覆盖。

MySQL -> InnoDB(5.5) -> B+存储 -> 聚簇索引树

叶子(数据页) 主键(如果有) + 数据

  • 如何保证每次上传的文件不会覆盖?也就是最终保存的是不同的文件名。

UUID。

SpringMVC 程序开发

//上传文件
@RequestMapping("/myupload")
public Object upload(@RequestPart("myimg")MultipartFile file){
    String fileName = UUID.randomUUID() + //文件名
            file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//后缀名
    File saveFile = new File("D:\\Data\\" + fileName);
    try {
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

SpringMVC 程序开发

成功上传,没有覆盖原有的。

获取Cookie/Session/header

//获取 cookie
@RequestMapping("/getCookie")
public Object getCookie(@CookieValue(value = "java",required = false) String java){
    return "java = " + java;
}

SpringMVC 程序开发

我们可以手动构造一个 cookie。

SpringMVC 程序开发

  • 获取 Header
//获取 header
@RequestMapping("/header")
public Object getHeader(@RequestHeader("user-agent") String userAgent){
    return "userAgent = " + userAgent;
}

SpringMVC 程序开发

  • 获取 Session
private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
//存储 session
@RequestMapping("/setSession")
public void setSession(HttpServletRequest request){
    HttpSession session = request.getSession();//没有就创建,默认是 true
    session.setAttribute(SESSION_KEY,"zhangsan");
}
//获取 session
@RequestMapping("/session")
public Object getSession(@SessionAttribute(SESSION_KEY) String name){
    return "session = " + name;
}

SpringMVC 程序开发

返回数据

1)返回静态页面

@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/getIndex")
    public Object getIndex(){
        return "index.html";
    }
}

SpringMVC 程序开发

SpringMVC 程序开发

确认 target 下有 index.html.

那是什么原因?

SpringMVC 程序开发

加了"/"之后就能访问成功了。

SpringMVC 程序开发

加了"/“表示是 从根目录去找"index.html”, 不加"/"是在 test 目录下去找 "index.html"就找不到.

SpringMVC 程序开发

SpringMVC 程序开发

2)请求转发或请求重定向

1.请求转发

//请求转发
@RequestMapping("/forward")
public String forward(){
    return "forward:/index.html";
    //return "/index.html"; 默认就是请求转发
}

SpringMVC 程序开发

2.请求重定向

//请求重定向
@RequestMapping("/redirect")
public String redirect(){
    return "redirect:/index.html";
}

SpringMVC 程序开发

@RequestMapping("/redirect2")
public void redirect2(HttpServletResponse response) throws IOException {
    response.sendRedirect("https://www.baidu.com");
}

forward 和 redirect 具体区别如下:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  2. 请求重定向地址发生变化,请求转发地址不发⽣变化。
  3. 请求重定向,不存在原来的外部资源不能访问;请求转发服务器端转发 有可能造成原外部资源不能访问。

举例:

请求转发:张三找李四借钱,李四自己也没钱,李四又去找王五借,最终张三只借了一次钱,剩下的事都是 李四干的。

请求重定向:张三找李四借钱,李四自己也没钱,李四告诉张三说自己没钱让张三去找王五借钱。然后张三又去找王五借到了钱。

请求转发和请求重定向有什么区别? | Javaᶜⁿ 面试突击 (javacn.site)文章来源地址https://www.toymoban.com/news/detail-462161.html

到了这里,关于SpringMVC 程序开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序怎么开发?怎么开发自己的小程序

    一、明确需求与定位 在开发小程序之前,需要明确需求. 首先,明确小程序的定位非常重要。我们需要确定小程序是为了提供便捷的购物体验还是特定领域的服务。明确定位可以帮助我们更好地设计和优化小程序的功能,以符合用户的期望和需求。 其次,了解目标用户群体也

    2024年02月22日
    浏览(51)
  • 微信小程序用什么工具开发(微信小程序开发工具介绍)

    有很多人在开发小程序之前都会去了解微信小程序开发工具,想知道微信小程序用什么工具开发。时至今日,随着互联网技术的发展,现在开发微信小程序也能使用多种不同的工具,让我们来了解一下吧。 一、微信开发者工具 这是微信官方提供的微信小程序开发工具,可以

    2024年02月11日
    浏览(67)
  • 商城小程序代客下单程序开发演示

    一款专为传统电商、实体商家开发的商城系统小程序,做私域、做留存、做社交必备功能全都有。 1、丰富的营销玩法:拼团、秒杀、定金预售、分销、社区团购、积分商城、支付有礼等主流获客玩法都有。 2、强大的会员体系:普通会员、付费会员、会员卡制卡、账户储值预

    2024年01月19日
    浏览(57)
  • 关机恶搞小程序的开发程序

    目录 关机恶搞小程序的开发程序 一、引言 二、开发思路 三、代码实现 1. 界面设计 2. 关机动画 3. 关机逻辑 4. 恢复功能 5. 异常处理 四、相关术语解释 关机恶搞小程序是一种基于C#语言开发的应用程序,旨在通过一些有趣的方式模拟关机过程,给用户带来欢乐和娱乐。本文档

    2024年04月12日
    浏览(40)
  • 小程序云开发(十四):小程序的组件

    🔗 运行环境:小程序云开发 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 🔐####  防伪水印——左手の明天 #### 🔐 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗 今天更新小程序云开发 💗 📆  最近更新: 2024 年 03 月

    2024年04月10日
    浏览(51)
  • 微信小程序怎么制作?【小程序开发平台教学】

    随着移动互联网的快速发展,微信小程序已经成为了人们日常生活中不可或缺的一部分。从购物、支付、出行到社交、娱乐、教育,小程序几乎涵盖了我们生活的方方面面。那么,对于有营销需求的企业商家来说,如何制作一个自己的微信小程序呢?下面给大家讲解微信小程

    2024年02月06日
    浏览(46)
  • webstorm+小程序相配合来开发小程序

    前言:         webstorm可以安装的一个小程序插件: wechat-miniprogram-plugin ,来实现小程序语法的高亮,并识别 rpx 这种小程序专有单位,还可以实现跟开发者工具中一些类似的操作功能。 注意事项: 1、小程序的根目录下的 project.config.json 文件中必须存在下面的才会被插件检

    2024年02月14日
    浏览(41)
  • 【微信小程序】小程序是什么?怎样快速上手开发一个小程序?

    大家好,从今天起我们开始微信小程序的学习之路,今天我们就先来认识一下什么是微信小程序,以及做好小程序开发前的准备! 微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播

    2024年02月09日
    浏览(57)
  • C++程序开发技巧

    类(class)的使用分为两种——基于对象(object Based)和面向对象(object oriented) 基于对象是指,程序设计中单一的类,和其他类没有任何关系 单一的类又分为:不带指针的类(class without pointer members)和带指针的类(class with pointer members) 面向对象则是类(class)中涉及了

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包