SpringMVC03 基础操作续与几个简单的交互

news2025/1/12 21:02:24

前文

第一篇

第二篇

基础操作

上篇博客我们知道了如何获取Session内容以及传输数组,json,对象,集合等的传送和获取

这节课我们可以从上篇的结束开始,其实Spring对Session进行了进一步的封装,我们可以使用其他的方式也可以读取和设置Session(更简洁的方式)

1.直接使用HTTPSession

@RequestMapping("/r16")
    public String getR(HttpSession session) {
        String name = (String) session.getAttribute("name");
        return "name:"+name;
    }

2.使用注解方式

@RequestMapping("/r17")
    public String getR2(@SessionAttribute("name")String name) {
        return "name:"+name;
    }

3.获取Header信息

 @RequestMapping("/r18")
    public String getHeader(HttpServletRequest request){
        String UserAgent = request.getHeader("User-Agent");
        return "获取信息UserAgent:"+UserAgent;
    }

4.@Controller与@RestController的区别与演示

我们可以理解为@RestController = @Controller + @ResponseBody

这里我们又要谈到MVC的事情了

我们知道这里的C指的是Controller

@RestController是一个复合注解  

@Controller 含义是定义一个控制器,交给Spring管理

@ResponseBody 表示返回的是一个非视图内容,可以是html/text内容

我们可以理解为Controller默认是返回一个视图html页面

然后加上@ResponseBody注解时返回一个html/text内容

所以我们之前使用@RestController返回的就是一个text内容

我们可以先尝试一下

我们如果直接使用RequestController来修饰类,这里显示就是默认使用text表示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>这是一个测试</h1>
</body>
</html>
@RequestMapping("/r19")
    public String getIndex(){
        return "index_test.html";
    }

这里如果我们去掉@RequestBody这里就可以看到一个正常的html页面

@Controller
public class RequestController1 {

    @RequestMapping("/r20")
    public String hello() {
        return "/index_test.html";
    }

这里如果使用的@Controller就是直接返回一个html页面,如果找不到文件就直接报错

@Controller
public class RequestController1 {

    @RequestMapping("/r20")
    public String hello() {
        return "/idex_test.html";
    }
}

我们只是将文件名修改了一下,并没有返回字符串而是直接报错了

注:这里如果放的是html代码也会被识别

5.返回json对象

@RequestMapping("r21")
    @ResponseBody
    public HashMap<String,String>  getJson() {
        HashMap<String,String> map = new HashMap<>();
        map.put("a","b");
        map.put("c","d");
        map.put("e","f");
        return map;
    }

注意:这里的@RequestBody一定要加上

这里是我们抓包的结果

6.设置状态码

其实我们可以看到平常200OK的页面情况可以转成任意的状态码

这里我们也可以侧面知道状态码是不一定靠谱的

这里其实是设置成功的,却返回了这个内容

这也就意味着我们设置header中的任何字段其实都是可以获取的

2.简单前后端交互小练习

1.加法器

开始是这个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
     <form action="calc/sum" method="post">
        <h1>计算器</h1>
        数字1:<input name="num1" type="text"><br>
        数字2:<input name="num2" type="text"><br>
        <input type="submit" value=" 点击相加 ">
    </form>
</body>

</html>

我们希望可以得到返回一个结果的页面

这里涉及到的最重要的就是设计URL,设计参数等等,也就是接口设计

我们这里设计URL为 /calc/sum

参数则是两个Integer数字,接下来我们开始从后端实现接口

@RequestMapping("/calc")
@RestController
public class CalcController {
    @RequestMapping("/sum")
    public String sum(Integer num1, Integer num2) {
        Integer sum = num1 + num2;
        return "计算结果是"+sum;
    }

2.实现登录页面的跳转

设计接口

后端只负责返回数据

首先我们这里是为了实现一个html页面的跳转,设置账号密码都是admin,最后来进行跳转

输入成功则

输入失败则

我们先来实现后端代码

1.设计接口

对于第一个前端页面

设置url : /user/login

参数 userName,password

返回 true false  表示密码正确或者失败

对于第二个前端页面

url:/user/index

无参数

返回值是userName

2.编写代码

后端主要是获取两个输入框中的值进行判断,然后提供一个用户名信息

所以这里我们使用session来进行传递,session进行获取就行

后端代码

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public Boolean login(String userName, String password, HttpSession session){
        if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {
            return false;
        }
        //判断账号密码是否正确
        if("admin".equals(userName) && "admin".equals(password)) {
            //设置Session
            session.setAttribute("userName",userName);
            return true;
        }
        return false;
    }

    @RequestMapping("/index")
    public String getUserName(@SessionAttribute("userName") String userName) {
        return userName;
    }
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>登录页面</title>
</head>

<body>
  <h1>用户登录</h1>
  用户名:<input name="userName" type="text" id="userName"><br>
  密码:<input name="password" type="password" id="password"><br>
  <input type="button" value="登录" onclick="login()">
  
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    function login() {
      $.ajax({
        url:"user/login",
        type:"post",
        data:{
          userName:$("#userName").val(),
          password:$("#password").val()
        },
        //http响应成功回调函数
        success:function(result){
          if(result==true){
            location.href="index.html"
          }else {
            alert("用户名或密码错误");
          }

        }
      });
    }

  </script>
</body>

</html>

另一个页面只需要接收返回数据即可

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>用户登录首页</title>
</head>

<body>
    登录人: <span id="loginUser"></span>

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        $.ajax({
            url:"user/index",
            type:"get",
            success:function (result){
                $("#loginUser").text(result)
            }
        });
    </script>
</body>

</html>

然后我们就可以得到想要的结果了

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

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

相关文章

力扣hot100:34. 在排序数组中查找元素的第一个和最后一个位置(二分查找的理解)

我们知道使用二分查找能找到值所在的位置。假如我们在找到值后仍然不断的更新指针会发生什么&#xff1f;我们可以利用这一点来找到最左边的以及最右边的值。 如果当nums[mid]target时&#xff0c;使得 rightmid-1&#xff0c;那么最终会使得target在right的右边。 如果当nums[…

Cloudways搭建WordPress外贸独立站完整教程

现在做个网站不比从前了&#xff0c;搭建网站非常的简单&#xff0c;主要是由于开源的CMS建站系统的崛起&#xff0c;就算不懂编程写代码的人也能搭建一个自己的网站&#xff0c;这些CMS系统提供了丰富的主题模板和插件&#xff0c;使用户可以通过简单的拖放和配置操作来建立自…

【Linux】基础 IO(文件描述符)-- 详解

一、前言 1、文件的宏观理解 文件在哪呢&#xff1f; 从广义上理解&#xff0c;键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件&#xff0c;因为 “Linux 下&#xff0c;一切皆文件”。 从狭义上的理解&#xff0c;文件在磁盘&#xff08;硬件&#…

【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)

背景需求&#xff1a; 大四班老师要以前的姓名描字帖 【教学类-35-02】20231207大班姓名描字帖&#xff1a;A4单面3*10个姓名&#xff0c;双面共60个名字-CSDN博客文章浏览阅读402次&#xff0c;点赞5次&#xff0c;收藏8次。【教学类-35-02】20231207大班姓名描字帖&#xf…

前端学习之css样式 背景样式、字体样式、列表样式、边框样式、内外边距元素属性的转换

背景样式 html文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>背景样式</title><link rel"stylesheet" href"../css/3.1背景样式.css"> </head> <bo…

MyBatis3源码深度解析(十三)MyBatis的核心组件(二)

文章目录 前言4.3 Configuration组件4.3.9 mappedStatements4.3.10 Configuration组件的其它属性 4.4 Executor4.5 MappedStatement4.6 StatementHandler4.7 TypeHandler4.8 ParameterHandler4.9 ResultSetHandler4.10 小结 前言 MyBatis框架的配置信息有两种&#xff0c;一种…

Flutter开发进阶之使用工具效率开发

Flutter开发进阶之使用工具效率开发 软件开发团队使用Flutter开发的原因通常是因为Flutter开发性能高、效率高、兼容性好、可拓展性高&#xff0c;作为软件PM来说主要考虑的是范围管理、进度管理、成本管理、资源管理、质量管理、风险管理和沟通管理等&#xff0c;可以看到Flu…

OpenCV图像相似性及相似度比对算法

背景 在做图像处理或者计算机视觉相关的项目的时候&#xff0c;很多时候需要我们对当前获得的图像和上一次的图像做相似性比对&#xff0c;从而找出当前图像针对上一次的图像的差异性和变化点&#xff0c;这需要用到OpenCV中的一些图像相似性和差异性的比对算法&#xff0c;在O…

Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?

一、本期教学目标 掌握map集合常用方法。掌握map集合使用场景。通过map集合实现斗地主洗牌发牌动作。 二、前言 对于双列集合之map集合&#xff0c;它的相关知识点及拓展咱们都已经差不多学完了。接下来&#xff0c;就是带着大家如何灵活运用map进行一个实战教学&#xff0c;…

【方法封装】时间格式化输出,获取请求设备和IP

目录 时间类 1.1 获取当前时间&#xff0c;以特定格式化形式输出 1.2 自定义时间&#xff0c;以特定格式化输出 1.3 获取当前时间&#xff0c;自定义格式化 1.4 自定义时间&#xff0c;自定义格式化 设备类 根据请求头信息&#xff0c;获取用户发起请求的设备 请求IP类 …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)

仅在Tabs中使用&#xff0c;对应一个切换页签的内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 可内置系统组件和自定义组件&#xff0c;支…

【SpringCloud微服务实战08】RabbitMQ 消息队列

MQ异步通信优缺点: 优点: 吞吐量提升:无需等待订阅者处理完成,响应更快速 故障隔离:服务没有直接调用,不存在级联失败问题 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换 流量削峰:不管发布事件的流量波动多大,都由Broker接收,…

终止代码: DRIVER IRQL NOT LESS OR EQUAL 失败的操作:Netwtw12.sys

蓝屏警告&#xff1a; 今天电脑浏览器用着用着就蓝屏重启&#xff0c;蓝屏上报这个错误&#xff1a; 上网找了一堆&#xff0c;发现关键是这句话&#xff1a;“失败的操作:Netwtw12.sys” 最终在一顿操作下&#xff0c;发现了是23年更新的网卡&#xff08;Intel(R) Wi-Fi6E A…

搜维尔科技:工作室选择 OptiTrack 进行新的虚拟制作舞台

35North Studios 成立于 2020 年&#xff0c;是一家最先进的制作工作室。他们的全方位服务方法可帮助电影制片人和企业在一个设备齐全且先进的地点规划、拍摄、编辑、评分和完成项目。该工作室位于爱荷华州克利尔湖&#xff0c;为创作者提供了一个安静的空间&#xff0c;让他们…

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

【Linux】信号保存{sigset_t/sigpending/sigprocmask/bash脚本/代码演示}

文章目录 1.信号相关常见概念2.管理信号的数据结构3.初识sigset_t4.信号集操作函数4.1sigpending4.2sigprocmask4.2代码测试1.测试12.测试23.测试3 4.3bash 脚本文件 1.信号相关常见概念 信号相关动作&#xff1a;产生 发送 接收 阻塞 递达(处理) 实际执行信号的处理动作称为信…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

面部表情参考图

创造表情形变 | Character Creator | Reallusion 皮笑肉不笑&#xff1f;读取情绪的AI说&#xff1a;我太难了_面部

HAProxy高性能负载均衡器

一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器&#xff0c;它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡&#xff0c;还能应用于数据…

RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件&#xff0c;在服务应用中&#xff0c;可解决高性能&#xff0c;高并发&#xff0c;高应用的问题&#xff0c;极大程度上解决了应用的性能问题。 2.MQ的使用分为生产者和消费者&#xff0c;生产者生产消息&#xff0c;消费者去消费消息。 3.…