SpringMVC程序开发

news2024/11/26 2:02:18

目录

SpringMVC

1、MVC定义

2、MVC和SpringMVC之间的关系

学SpringMVC

1、Spring MVC的创建和连接

浏览器获取前端接口和后端程序连接功能实现

2、获取参数

2.1、传递单个参数/多个参数

2.2、传递对象

 2.3、传递表单参数

2.4、后端参数重命名

2.5、@RequestBody接收JSON对象

​2.6、获取URL中的参数@PathVariable

2.7、上传文件@RequestPart

2.8、获取Cookie/Session/header

3、返回数据

3.1、返回静态页面

3.2、返回text/html 

3.3、返回JSON对象

3.4、请求转发或者请求重定向


SpringMVC

1、构建在Servlet(API)之上的;

2、是一个Web框架(具备http);

3、来自于Spring webMVC模块

1、MVC定义

MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

a681d5a3f05f1388e9b07440a3a67c48.jpeg

M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。

C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

2、MVC和SpringMVC之间的关系

springmvc提供了 前端控制器 DispatcherServlet,仅针对对客户端的请求和响应进行统一 处理(就是说封装了servlet),是个框架 。是针对三层架构的表述层(或表示层) 开发提供的框架 ,而mvc是一种思想。对于原先的mvc思想来说,springmvc只是包含了mvc思想的一部分 Controller进行实现。

当用户在浏览器中输入url之后,SpringMVC项目就可以感知用户的请求

学SpringMVC

1、构建在servlet(API)之上;

2、是一个Web框架(HTTP);

3、来自于Spring webMVC模块

1、Spring MVC的创建和连接

213b47e0843a4498a4f8a0b429d25c71.png

edde22d77f1242519be4a7c1fd2b6add.png

20673b0109044a8a9310bb2577f61574.png

@RequestMapping("/test")  //路由注册
//@Controller  //程序返回的是数据而非页面
//@ResponseBody  //只有加载的类,别人才能访问
@RestController
public class TestConstroller {

    @RequestMapping("/hi")
    public String sayHi(){
        return "hi,spring mvc";
    }
}

@RequestMapping既可以修饰类,也可以修饰方法。当修饰类和方法时,访问的地址是类+方法

方法地址:localhost:8080/test/hi

浏览器获取前端接口和后端程序连接功能实现

1.1、@RequestMapping(" /xxx' )既能修饰类又能修饰方法

特性:既支持GET方式的请求又支持POST方式的请求...

1.2、@RequestMapping设置只支持GET/POST请求

@RequestMapping("/test")  //路由注册
//@Controller  //程序返回的是数据而非页面
//@ResponseBody  //只有加载的类,别人才能访问
@RestController
public class TestConstroller {

    //@RequestMapping("/hi")
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    public String sayHi(){
        return "hi,spring mvc";
    }
}

1.3、@PostMapping

@RequestMapping("/test")  //路由注册
//@Controller  //程序返回的是数据而非页面
//@ResponseBody  //只有加载的类,别人才能访问
@RestController
public class TestConstroller {

    //@RequestMapping("/hi")
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    @PostMapping("/hi")
    public String sayHi(){
        return "hi,spring mvc";
    }
}

1.4、@GetMapping

@RequestMapping("/test")  //路由注册
//@Controller  //程序返回的是数据而非页面
//@ResponseBody  //只有加载的类,别人才能访问
@RestController
public class TestConstroller {

    //@RequestMapping("/hi")
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    @GetMapping("/hi")
    public String sayHi(){
        return "hi,spring mvc";
    }
}

2、获取参数

2.1、传递单个参数/多个参数

@RequestMapping("/test")  //路由注册
//@Controller  //程序返回的是数据而非页面
//@ResponseBody  //只有加载的类,别人才能访问
@RestController
public class TestConstroller {

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

8aa136696eff4a2b87e849ca15918aa7.png

传参注意事项:在Spring Boot(Spring MVC)中传参一定要传包装类型,而不是基础类型

原因:当需要一个基础类型,但又忘记传递时,使用基础类型会报错(500),而包装类型不会错,只是值为null 

    @GetMapping("/num")
    public String getnum(Integer num){
        return "num="+num;
    }
    @GetMapping("/hi")
    public String sayHi(String name,Integer age){
        return "hi"+name+" age:"+age;
    }

 d5275db03c094f0592db8259ffc5f281.png

2.2、传递对象

后端实现 

@Data
public class User {
    private int id;
    private String name;
    private int age;
}
    @GetMapping("/showuser")
    public String showu(User user){
        return user.toString();
    }

前端实现

c4848ac6d717425fb048b23f253c1661.png

 2.3、传递表单参数

当参数较少时,可以使用传递多个参数的方法;

当参数较多时,可以使用传递对象的方法

2.4、后端参数重命名

后端实现

    @GetMapping("/showtime")
    public String shoeTime(@RequestParam("t") String startTime,
                            @RequestParam("t2") String endTime){
        return "开始时间:" +startTime+ " 结束时间:" +endTime;
    }

前端实现

bdc674c229d142219bdb6d89dba9a92e.png

如果t值不是必须要传

    @GetMapping("/showtime")
    public String shoeTime(@RequestParam(value = "t",required = false) String startTime,
                            @RequestParam("t2") String endTime){
        return "开始时间:" +startTime+ " 结束时间:" +endTime;
    }

2.5、@RequestBody接收JSON对象

后端实现 

    //@RequestBody接收JSON对象
    @PostMapping("/show-json-user")
    public String showJSONuser(@RequestBody User user){
        return user.toString();
    }

前端实现

85e52341a362402b8e09562f65d16ebe.png2.6、获取URL中的参数@PathVariable

后端实现

    @RequestMapping("/login/{username}/{password}")
    public String login(@PathVariable("username")String username,
                         @PathVariable("password")String password){
        return username + ":" + password;
    }

前端实现

edfac2dce5a2430190d62f57cb56a51c.png

2.7、上传文件@RequestPart

后端实现

    @RequestMapping("/upfile")
    public String uofile(@RequestPart("myfile")MultipartFile file) throws IOException {
        String path="D:\\baekhyun\\bobo.jpg";
        file.transferTo(new File(path));
        return path;
    }

前端实现

9b98067381984aee93c055ed8553c14d.png

最终上传文件后端实现 

    @RequestMapping("/finalfile")
    public String finalupfile(@RequestPart("myfile")MultipartFile file) throws IOException {
        //根目录
        String path="D:\\baekhyun\\";
        //根目录+【唯一的文件名】
        path+= UUID.randomUUID().toString();
        //根目录+唯一的文件名+文件的后缀
        path+=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        file.transferTo(new File(path));
        return path;
    }

前端实现

600d12786fdc47ad803baa648a11df1b.png

2.8、获取Cookie/Session/header

1、获取Cookie

    //获取全部Cookie
    @RequestMapping("/getck")
    public String getCookie(HttpServletRequest request){
        Cookie[] cookies=request.getCookies();
        for (Cookie item:cookies){
            log.error(item.getName()+":"+item.getValue());
        }
        return "get cookie";
    }

2、获取单个Cookie  @CookieValue

    //获取单个Cookie
    @RequestMapping("/getck2")
    public String getCookie2(@CookieValue("do") String val){
        return "cookie value"+val;
    }

3、获取Header @RequestHeader

后端实现

    //获取header
    @RequestMapping("/getheader")
    public String getheader(@RequestHeader("User-Agent") String userAgent){
        return userAgent;
    }

前端实现

a0945c4b619541508844ba396092c70d.png

4、存Session

后端实现

    //存Session
    @RequestMapping("/setsession")
    public String setSession(HttpServletRequest request){
        HttpSession session=request.getSession();
        session.setAttribute("userinfo","userinfo");
        return "set Session success";
    }

 前端实现

56f1601c8df4407fa103564721c6b762.png

5、获取Session

后端实现

    //读Session
    @RequestMapping("getsession")
    public String getSession(HttpServletRequest request){
        HttpSession session=request.getSession(false);
        if (session!=null && session.getAttribute("userinfo")!=null){
            return (String) session.getAttribute("userinfo");
        }else {
            return "暂无session信息";
        }
    }

前端实现

c974a78d1f484986aa9fff686ef0398f.png

    @RequestMapping("/getsession2")
    public String getSession2(@SessionAttribute(value = "userinfo",required = false)String userinfo){
        return userinfo;
    }

3、返回数据

3.1、返回静态页面

后端实现

@RequestMapping("/resp")
@Controller
public class RespController {

    @RequestMapping("/hi")
    public String sayHi(){
        return "/hello.html";
    }
}

 前端实现

672300e0a15445c99dc316f410c0839b.png

3.2、返回text/html 

案例:计算器的实现

@ResponseBody
@Controller
public class CalcController {

    @RequestMapping("/calc")
    public String calc(Integer num1,Integer num2){
        if (num1==null || num2==null) return "参数错误";
        return "结果为=" +(num1+num2);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/calc">
        <div style="margin-top: 100px;text-align: center;">
            <h1>计算器</h1>
            数字1:<input name="num1"><br>
            数字2:<input name="num2"><br>
            <input value="提交" type="submit">
        </div>
    </form>
    
</body>
</html>

3.3、返回JSON对象

后端实现

    @RequestMapping("/respjson")
    public HashMap<String,String> respJson(){
        HashMap<String,String> map=new HashMap<>();
        map.put("baekhyun","baekhyun.value");
        map.put("do","do.value");
        map.put("sehun","sehun.value");
        return map;
    }

前端实现

639ac14b86944890bae7e7da3f57f0b7.png 

3.4、请求转发或者请求重定向

forward和redirect

forward和redirect具体区别如下: 
1.请求重定向(redirect) 将请求重新定位到资源;请求转发(forward) 服务器端转发。
2.请求重定向地址发生变化,请求转发地址不发生变化。
3.请求重定向与直接访问新地址效果一致, 不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

 

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

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

相关文章

postgres源码解析52 磁盘管理器--1

简介 postgres中的磁盘管理器SMGR对外提供了管理磁盘介质的接口&#xff0c;其主要实现在md.c文件中。磁盘管理器并非对磁盘上的文件直接进行操作&#xff0c;而是通过VFD机制进行文件操作。凡是对存储在磁盘中的表进行访问操作均会与磁盘管理器打交道&#xff0c;由它进行统一…

145页企业数字化转型大数据湖项目建设和运营综合解决方案WORD

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 2 需求分析 2.1功能需求 数据湖的应用、管控、展示为一体&#xff0c;提供标准的服务和数据接口和报表展现方式。数据湖数据采用高效&#xff0c;可靠的存储架构。企业业务数据制订…

【0基础学爬虫】爬虫基础之网页基本结构

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

不用vdom的lit框架学习1:安装和编译

上一篇文章讲了我们不得不在部分页面将vuepress换用其他框架的原因&#xff0c;这里我们用了一个新的&#xff0c;号称轻量级的lit框架。 主要原因&#xff1a; 1&#xff09;我们只是部分页面使用&#xff0c;不要要太重的 2&#xff09;vite默认创建有这个选项…… 我们依…

centos 7下JDK8安装

下载安装包https://www.oracle.com/java/technologies/downloads/#java8-linux上传路径 /usr/local&#xff08;替换为自己需要安装的路径&#xff09;解压tar -zxvf jdk-8u131-linux-x64.tar.gz配置环境变量[rootlocalhost java]# vi /etc/profile添加如下配置在配置文件最后&…

C++实现红黑树(RBTree) + 模拟实现map set

目录 一、红黑树(RBTree) 1.1 红黑树概念与性质 1.2 红黑树节点的定义 1.3 红黑树模拟实现 1.3.1 红黑树成员框架 1.3.2 红黑树调整情形 1.3.3 insert() 插入结点 1.3.4 IsBalanceTree() 判断是否为平衡搜索树 二、关联式容器与键值对 2.1 关联式容器概念 2.2 键值对…

python趣味编程-盒子追逐者游戏

在上一期我们用Python实现了一个奥赛罗游戏的游戏&#xff0c;这一期我们继续使用Python实现一个简单的盒子追逐追逐者游戏&#xff0c;让我们开始今天的旅程吧~ 在Python自由源代码中使用Turtle的盒子追逐者游戏 在Python中使用Turtle的盒子追逐者游戏 是一个以 python 程序设…

数据库索引原理

数据库索引的作用是做数据的快速检索&#xff0c;而快速检索实现的本质是数据结构。像二叉树、红黑树、AVL树、B树、B树、哈希等数据结构都可以实现索引&#xff0c;但其中B树效率最高。MySQL数据库索引使用的是B树。二叉树&#xff1a;二叉树中&#xff0c;左子树比根节点小&a…

C++回顾(十六)—— 异常处理机制

16.1 异常的基本语法 1&#xff09; 若有异常则通过throw操作创建一个异常对象并抛掷。2&#xff09; 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句&#xff0c;然后执行try块内的保护段。3&#xff09; 如果在保护段执行期间没有引起异常&#xf…

dark.x86病毒新变种

病毒行为类似https://www.cnblogs.com/wangbingbing/p/15319257.html依然是来自俄罗斯莫斯科的病毒。旧病毒换了个伪装程序查服务器nginx日志发现一个异常请求170.254.229.130 - - [09/Mar/2023:07:19:08 0800] "GET /bin/zhttpd/${IFS}cd${IFS}/tmp;rm${IFS}-rf${IFS}*;$…

4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件

有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外&#xff0c;我们知道这可能是一种非常可怕的体验。在这种情况下&#xff0c;找到安卓手机解锁软件&#xff0c;重新获得手机中重要数据和文件的访问权限。看看这篇文章&#xff0c;因为我们将与您分享什么是解锁…

DML 添加、修改、删除数据

目录 DML 一、添加数据 1、给指定字段添加数据 2、给全部字段添加数据 3、批量添加数据 二、修改数据 三、删除数据 DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据 1、给指定字…

中国人民大学与加拿大女王大学金融硕士——沉淀自己是最好的升华

三毛曾说过&#xff1a;“给自己时间&#xff0c;不要焦虑&#xff0c;一步一步来&#xff0c;一日一日过&#xff0c;请相信生命的韧性是惊人的&#xff0c;跟自己的心去合作&#xff0c;不要放弃对自己的爱护”。当你的能力还驾驭不了你的目标时&#xff0c;你就应该沉下心来…

如何配置用于构建 FastReport Online Designer 的 API ?

FastReport Online Designer 是一个跨平台的报表设计器&#xff0c;允许通过任何平台的移动设备创建和编辑报表。今天我们就一起来看看在2023版中新增和改进的功能有哪些&#xff0c;点击下方可以获取最新版免费试用哦&#xff01; FastReport Onlin Designe最新版试用https:/…

市场营销的核心是什么?

之所以写下「市场营销的核心是什么&#xff1f;」这篇文章&#xff0c;是因为这几天刚读完了《经理人参阅&#xff1a;市场营销》这本书。作为一个有着近十年工作经验的市场营销从业人员&#xff0c;看完这本书也产生了很多新的想法&#xff0c;也想记录一下&#xff0c;遂成此…

Idea+maven+spring-cloud项目搭建系列--11-2 dubbo鉴权日志记录数据统一封装

前言&#xff1a;使用dubbo做为通信组件&#xff0c;如果接口需要鉴权&#xff0c;和日志记录需要怎样处理&#xff1b; 1 鉴权&#xff1a; 1.1 在bootstrap.yml 中定义过滤器&#xff1a; dubbo.provider.filter: 过滤器的名字&#xff1a; 1.2 resources 目录下创建配置文…

随笔:车辆游戏功能开发-思路

目录1 博客内容2 PS4pro3 功能开发1 博客内容 年初朋友聊天谈到车辆增加G&#xff08;Game&#xff09;挡位&#xff0c;适配泛娱乐化功能。均非该领域人员&#xff0c;上月他也离开去无锡&#xff0c;同时该功能涉及悬架、座椅、HUT、音响、转向、线控底盘等多专业人员&#x…

深信服校园招聘安全攻防F卷

1.请尽可能列举你知道的网站未能正确使用图片验证码机制的情况&#xff0c;以及如何绕过其限制&#xff1f; - 图形验证码的内容可OCR识别 - 多阶段的过程&#xff0c;先校验验证码&#xff0c;成功之后的下一步不需要验证码&#xff0c;可以直接抓包&#xff0c;跳过第一步的验…

小诺开源技术

小诺开源技术 文章目录小诺开源技术前言页面演示介绍文档学习建议登录地址下载地址前言 近期接触了小诺开源技术的一个前端框架&#xff0c;底层是蚂蚁框架&#xff0c;感觉很好用&#xff0c;不过需要稍微学习并适应一下&#xff0c;推荐给大家&#xff0c;本篇仅用于学习&am…

人员摔倒识别预警算法 opencv

人员摔倒识别预警算法通过opencv网络模型技术&#xff0c;人员摔倒识别预警算法能够智能检测现场画面中人员有没有摔倒&#xff0c;无需人为干预可以立刻抓拍告警。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&…