SpringMVC(3)

news2024/11/18 10:41:30

通过上面的学习我们知道,默认情况下无论是Spring MVC还是SpringBoot返回的都是现在都是前后端分离的,后端只需要进行返回数据给前端数据即可

1)向浏览器返回一个HTML界面 

请求参数的数据类型Contnt-Type:text/html;charset=utf-8

@RequestMapping("/CSS")
  @ResponseBody
public String GetHTML(String name)
  {
      return "<h1>你好"+name+"</h1>";
  }

2.给浏览器返回一个JSON格式的数据:

浏览器上面输入:localhost:8080/JS?name=李佳伟
{"currentTime":"2022-07-17T12:30:34.76","name":"李佳伟"}

 @RequestMapping("/JS")
    @ResponseBody
    public Object GetJson(String name)
  {
      HashMap<String,Object> map=new HashMap<>();
      map.put("name",name);
      map.put("currentTime", LocalDateTime.now());
      return map;
  }
@Controller
public class UserController {
       @RequestMapping("/Java100")
       @ResponseBody
        public void run(String username,String password,Integer ClassID,Integer UserID,HttpServletResponse resp) throws IOException {
         ObjectMapper objectMapper=new ObjectMapper();
         User user=new User();
         user.setUserID(UserID);
         user.setClassID(ClassID);
         user.setUsername(username);
         user.setPassword(password);
         resp.setContentType("application/json;charset=utf-8");
         String html= objectMapper.writeValueAsString(user);
         resp.getWriter().write(html);
       }
}

 

 实现一个简单的计数器:

注意后端最好要针对前端的参数要做一个参数校验,因为如果前端传递过来参数如果是null,那么最终两个null值是不可以进行相加的;

1)上面我们使用form表单给服务器发送一个GET请求的时候,我们使用Fidder抓包的结果是:自定义的参数放到了URLquerystring里面:

2)当我们使用form表单发送一个POST请求的时候:请求的数据直接放在body里面了

现在我们进行修改一下博客系统的登录的前端页面:

1)小技巧:ctrl+a进行全选,然后ctrl+c进行复制,然后在进行点击SpringBoot项目里面的resource目录下的static目录,在按下crtl+v进行粘贴;

2)jquery.getJSON("请求的地址url",{请求的参数},function(data,status){},请求成功之后的回调函数);

前端代码:通过AJAX发送HTTP请求:

有时候前端代码修改之后不会生效,我们只需要把target目录直接进行删除,重新启动程序

1)注意我们一定要在方法体内部获取UserName和Password的控件,获取控件里面的内容;

2)注意括号的范围不要写错,看看下面Spring自动判空的一些类;

3)因为在之前不同的浏览器是由不同的浏览器厂商去写的,不同的浏览器厂商引擎可能是不一样的,微软设计的是IE,火狐浏览器,搜狗浏览器,也就是说自己可以设计自己的一个JS行为,所以说在早期的时候,你写的JS代码在谷歌可以运营,在火狐底下可以运行,但是在IE浏览器上不可以运行,因为不同的开发厂商有自己的行为,可以不遵循一些设计规范,不同的浏览器会写不同的JS代码;

4)jQuery本身又是一个门面模式,底层可以有不同的实现,不同的厂商可能会有不同的实现,用户的代码写jQuery代码的时候只是写一份,然后jQuery()会根据底层浏览器的不同,因为他是可以拿到浏览器的一个标识的,那么我会按照底层浏览器标识的不同从而生成不同的代码,但是对于用户是啥也感知不到的,用户在写代码的时候只需要会JQuery的代码就可以,兼容性只是有我们的JQuery()来进行自适应的,但是后来浏览器都遵循了一定的规范;

我们可以自动在JS代码中写一个mysub()函数,来执行我们自动写的一部分逻辑 

  public static boolean hasLength(@Nullable String str) {
        return str != null && !str.isEmpty();
    }
  let button=document.querySelector("#submit");
 button.onclick=function()
    {
        //1先拿到用户名和密码控件iput1和input2都是id属性
        var username=jQuery("#input1");
        var password=jQuery("#input2");
        console.log(username.val());
        console.log(password.val());
//jQuery里面填写的是id属性,我们可以通过username.val可以得到输入框里面的内容
        // 2进行非空校验
        if(jQuery.trim(username.val())=="")
        {
            alert("请先输入用户名");
            username.focus();//光标设置到用户名输入框
            return;
        }
        if(jQuery.trim(username.val())=="")
        {
            alert("请先输入密码");
            username.focus();
            return;
        }
        // 3发送ajax请求和后端进行交互
        jQuery.getJSON("/login",
        {"username":jQuery.trim(username.val()),
         "password":jQuery.trim(password.val()),//trim方法就是去掉里面的空格
          },function(data){
            if(data!=null&&data.succ==200)
            {
                console.log("后端接口访问成功");
                if(data.state==1)
                {
                    alert("登陆成功");
                }else{
                    alert(data.message);
                }
            }else{
                console.log("后端接口访问失败"+data.succ);
            }
          });
//第一个参数表示请求的地址,第二个参数表示请求的参数,第三个参数表示服务器端返回的一个回调函数
    }

或者通过这种方式给后端发送AJAX:

 <input type="text" id="username"><div>用户名</div>
   <input type="text" id="password"><div>密码</div>
   <input type="button" value="开始进行登陆" id="Dclick">
<script
src="https://code.jquery.com/jquery-3.6.0.js"
integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
crossorigin="anonymous"></script>
<body>
  
   <script>
  let button=document.querySelector("#Dclick");
  button.onclick=function(){
    var username=jQuery("#username");
    var password=jQuery("#password");
  console.log(username.val());
  console.log(password.val());
   if(jQuery.trim(username.val())==""){
        alert("请输入用户名");
        username.focus();
        return;
   }
   if(jQuery.trim(password.val())==""){
        alert("请输入密码");
        password.focus();
        return;
    }
  jQuery.ajax({
    url:"hello",
    type:"POST",
    data:{
        "username":username.val(),
        "password":password.val()
       },
    success:function(result,status){
    console.log(result);
    console.log(status);
    }
  });
}

 后端代码:

@Controller
public class UserController{
    @RequestMapping("/hello")
    @ResponseBody
    public HashMap<String,Object> Login(String username,String password){
        HashMap<String,Object> result=new HashMap<>();
        int state=200;//这个表示如果state=200表示访问这个方法是成功的
        int data=-1;//最终我们要在前端进行参数校验,data=1说明登录成功,data=-1说明登录失败
        String message="";
        if(StringUtils.hasLength(username)&&StringUtils.hasLength(password)){
         //此时发现username不为空,password不为空,况且username和password都等于特定的值,那么说明登陆成功
            if(username.equals("李佳伟")&&password.equals("12503487")){
                //说明用户名密码匹配登陆成功
                   data=1;
                   message="登陆成功";
            }else{
                //说明用户名密码不匹配,登陆失败
                message="用户名或者密码失败";
            }
        }else{
            //说明前端传递的username或者password等于空
            message="前段传递的用户名或者密码为空";
        }
        result.put("state",state);
        result.put("data",data);
        result.put("message",message);
        return result;
    }
}

 

1)我们可以进行打断点进行调试,比如说咱们输入了用户名和密码之后,点击提交,就会自动来到断点位置,来到了结果;

2)我们可以在Watch里面输入我们要观察的值比如说我输入了一个data就会显示data具体的值

3)我们还可以点击Watch:输入JSON.parse(result),JSON.stringfy(result),就可以把result转化成JSON格式的数据,前提必须是我们输入用户名和密码点击提交之后获取到返回相应的数据,回调函数返回的是一个字符串之后,才可以把返回的数据转化成JSON格式的字符串,contentType:application/json;charset=utf-8;

JSON.stringify 方法用于将 JavaScript 值转换为 JSON 字符串,一般回调函数data传输回来的值是一个JSON格式的字符串;

JSON.parse() 方法将JSON数据转换为 JavaScript 对象;

1)application/x-www-urlencoded
username="aaa"&password="bbb"
2)application/json;charset=utf-8
data:JSON.stringfy({"username":username,"password":password});

1)假设前端给后端传递的格式数据是application/json;charset=utf-8,只写JSON.stringify,键值对字符串还是不可以的,必须要指定前端向后端传递的格式的数据是什么也就是说必须要写上ContentType,一定要指定ContentType和JSON.stringfy操作把JSON格式对象转化成JSON格式的字符串的操作一个不能少;

2)后端代码框架:

2.1)先看看用户名和密码是否为空,不为空在进行下一步,判断一下用户名和密码是否匹配,匹配登陆成功,不匹配登陆失败;

2.2)如果为空直接登陆失败:

这里面要注意一个问题在Spring里面通过resp.setContentType进行设置是不会进行生效的:

前端代码:
let button=document.querySelector("#submit");
    let username=document.querySelector("#input1");
    let password=document.querySelector("#input2");
    button.onclick=function(){
    // console.log(username.value);
    // console.log(password.value);
    if(username.value==""||password.value=="")
    {
        alert("当前的用户名或者密码是空");
        return;
    }
        $.ajax({
            type:"GET",
            url:"login?"+"username="+username.value+"&password="+password.value,
            success:function(data,status)
            {
                console.log(data);
                console.log(status);
            }
        });
     }
后端代码:
@Controller
public class UserController {
    @RequestMapping(value="/login",produces = "text/html;charset=utf-8")
    @ResponseBody
    public String start(String username, String password, HttpServletResponse resp) throws IOException {
        return "<h1>"+username+""+password+"</h1>";
    }
    @RequestMapping("/cat")
    @ResponseBody
    public String start(String username,String password)
    {
        return username+password;
    }

}

SpringMVC中Controller处理response.setContentType() - 知乎

总结:想要ajax发送JSON格式的数据,上面写的JSON格式的数据两者缺一不可 

 请求转发和请求重定向

1)return不光可以返回一个视图,还可以实现跳转,跳转的方式有两种:请求转发和请求重定向,既然是实现跳转,那么返回的就是一个页面,就不能加上@ResponseBody注解;

2)forward是请求转发:是服务器干的,一次请求;

服务器返回的格式的数据就是text/html;charset=utf-8,返回的就是一个完整的HTML

3)redirect是请求重定向:是客户端自己干的,客户端进行了两次HTTP请求,客户端第一次来到服务器这里的时候,服务器会返回一个302响应,并告知服务器你来错地方了,下次你去我所指定的地方吧;

//4这是请求重定向:
@Controller
public class UserController3 {
    @RequestMapping("/redriect")
    public String start(){
        return "redirect:/blog.html";
    }
}
//resp.sendRedirect("/blog.html");

//1请求转发:
@Controller
public class UserController2 {
    @RequestMapping("/forward")
    public String run(){
        return "forward:/blog.html";
    }
}
//2请求转发
@Controller
public class UserController2 {
  @RequestMapping("/forward2")
    public void start(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      req.getRequestDispatcher("/blog.html").forward(req,resp);

  }

}
//3.请求转发:
@Controller
public class UserController2 {
  @RequestMapping("/forward2")
   public String start(){
    return "/Text.html";
  }
}

请求转发和请求重定向之间有什么区别?

1)请求转发:这是发生在服务器的内部,当我们的服务器端收到客户端的请求的时候,会先将请求转发给目标地址,再将目标地址返回的结果转发给客户端,电脑搜索栏里面的URL地址是不会发生改变的,浏览器啥也不用干,是服务器的行为;

2)请求重定向:让浏览器重新请求另一个地址,服务器端将请求重新定义到要访问的地址上面,URL地址会发生改变(浏览器自己要干活)(和直接访问服务器地址是一样的);

3)使用请求转发有可能外部资源时会丢失的,是会访问不到的,但是请求重定向是直接重定向到URL地址了,所以请求重定向和直接访问目标地址的效果是一模一样的,所以是不会存在外部资源丢失的情况,如果说请求转发的资源和转发的页面不在同一个目录下,就会造成外部资源不可以进行访问,目录模式只有一级,样式直接丢失了;

如果你的请求转发的路径是一级路径,但是最终的url地址是二级路径,资源是一级目录的资源文件就会丢失,目录层级不一样,就很有可能造成资源丢失;

4)数据共享不同:请求转发只需要进行一次请求,但是请求重定向是多次请求,因为我们的请求转发是服务器端进行实现的因此在整个交互过程中使用的都是同一个HttpServletRequest和一个HttpServletResponse对象,因此在整个请求的过程中,请求和返回的数据是共享的,5)但是请求重定向是客户端发送起的两次完全不一样的请求,所以两次请求的数据是不同的

请求转发的地址最终就是第一个服务器端的地址,请求重定向地址会发生改变

@Controller
@RequestMapping("/User")
public class TextController {
    @RequestMapping("/Java")
    public String forward(HttpServletResponse resp) throws IOException {
       // resp.sendRedirect("blog3.html");
        return "forward:/blog3.html";
    }
    @RequestMapping("CC")
    public String preforward()
    {
        return "redirect:/blog3.html";
    }
}

1)补充一个组合注解:@RestController=@Controller+@ResponseBody

2)@ResponseBody返回的值如果是字符串会转换成text/html,如果返回的是对象那么会转换成application/json返回给前端;

3)@ResponseBody可以用来修饰方法或者用来修饰类,修饰类表示类中的所有方法都会返回html或者json,而不是视图;

4)Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能,不要再写另一个getter或equals方法,只要有一个注释,你的类就有一个功能齐全的构建器,自动记录变量等等;

 

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

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

相关文章

Linux centos、麒麟V10 安装redis

目录 1、下载redis安装包 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 3、 解压文件 4、安装redis 5、配置redis.conf 6、启动redis 1、下载redis安装包 Redis各版本下载&#xff1a;https://download.redis.io/releases/ 2、将下载后的.tar.gz压缩包上传到…

用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(二)(2017)

文章目录用主动游泳的三维水母模型量化美杜莎的&#xff08;medusan&#xff09;机械空间的性能&#xff08;二&#xff09;(2017)原文链接&#xff1a;https://doi.org/10.1017/jfm.2017.3结果3.1 参考案例的游泳动力学3.2 改变钟的主动和被动材料属性3.2.1 改变施加的张力3.2…

【并发编程】【1】概览

并发编程 1. 概览 1.1 这门课讲什么 这门课中的【并发】一词涵盖了在Java平台上的 进程线程并发并行 以及Java并发工具&#xff0c;并发问题以及解决方案&#xff0c;同时也会包含一些其他领域的开发 1.2 为什么学这么课程 我工作中用不到并发啊&#xff1f; 1.3 课程特…

qemu的snapshot快照功能的详细使用介绍

快照功能还是蛮有趣的&#xff0c;就是资料比较少&#xff0c;这边万能菜道人特意整理了一下。参考内容&#xff1a;QEMU checkpoint(snapshot) 使用-pudn.comKVM&QEMU学习笔记&#xff08;二&#xff09;-蒲公英云 (dandelioncloud.cn)在线迁移存储 - 爱码网 (likecs.com)…

SpringMVC DispatcherServlet源码(4) HandlerMapping和HandlerAdapter等组件说明

本文介绍一下与DispacherServlet相关的几个重要组件&#xff1a; HandlerMapping - 管理请求与处理器映射关系HandlerAdapter - 请求处理器HandlerMethodArgumentResolver - 处理器方法参数解析器HandlerMethodReturnValueHandler - 处理器方法返回值处理器HttpMessageConvert…

LeetCode(剑指offer) DAY2

1.题目 从尾到头打印链表 解法一&#xff1a;先统计链表有多少节点&#xff0c;然后创建数组&#xff0c;再次遍历链表将值存储至数组&#xff0c;然后反转数组。这种解法思路简单&#xff0c;但是时间复杂度较高。 class Solution {int a 0,b0;public int[] reversePrint(Li…

Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model

Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model 2019 Design, Automation & Test in Europe Conference & Exhibition (DATE) DOI: 10.23919/DATE.2019.8715126 目录Abstract一、Introduction二、PROBLEM FORMULATION AND PRELIMINARIE…

java分析插入排序

首先查看一张经典的插入排序的图片 有图片可知&#xff0c;插入排序其字面的意思找到小的插入到前面就行 插入排序的基本思想就是分治&#xff1a;将数组分为两个区域&#xff0c;分别是已排序区和没有排序的区域 已排序区&#xff1a;假定一边的数组是都排序好的 wei排序区&…

软件测试选Python还是Java?

目录 前言 1、先从一门语言开始 2、两个语言的区别 3、两个语言的测试栈技术 4、如何选择两种语言&#xff1f; 总结 前言 对于工作多年的从业者来说&#xff0c;同时掌握java和Python两门语言再好不过&#xff0c;可以大大增加找工作时的选择范围。但是对于转行的人或者…

Vue2之Vue-cli应用及组件基础认识

Vue2之Vue-cli应用及组件基础认识一、Vue-cli1、单页面应用程序2、vue-cli介绍3、安装和使用4、创建项目4.1 输入创建项目4.2 选择第三项&#xff0c;进行自主配置&#xff0c;按回车键即可4.3 选择自己需要的库4.4 选择Vue的版本4.5 选择CSS选择器4.6 选择Babel、ESLint、etc等…

Sitara™处理器的产品开发路线图

Sitara™处理器的产品开发路线图概述Evaluation Phase(评估阶段)Board Development Phase(硬件发展阶段&#xff0c;硬件设计人员应重点关注这个阶段)Software Development Phase(软件发展阶段)Product Phase/SW Lifecycle概述 一般情况下&#xff0c;会存在四个主要的发展阶段…

从0到1一步一步玩转openEuler--15 openEuler使用DNF管理软件包

文章目录15.1 搜索软件包15.2 列出软件包清单15.3 显示RPM包信息15.4 安装RPM包15.5 下载软件包15.6 删除软件包DNF是一款Linux软件包管理工具&#xff0c;用于管理RPM软件包。DNF可以查询软件包信息&#xff0c;从指定软件库获取软件包&#xff0c;自动处理依赖关系以安装或卸…

书籍《金字塔原理》读后感

上周读完了书籍《金字塔原理》这本书&#xff0c;这本书在管理学中&#xff0c;比较有名的书籍了&#xff0c;之前没怎么读过跟管理学相关书籍&#xff0c;这本算是第一本&#xff0c;是上级推荐给自己的&#xff0c;自己首先查了下&#xff0c;推荐度还是挺好的&#xff0c;看…

uniapp实现app检查更新与升级-uni-upgrade-center详解

app检查更新与升级 参考链接&#xff1a; 升级中心uni-upgrade-center - App uni-admin h5 api App资源在线升级更新 uni-app使用plus注意事项 关于在线升级&#xff08;WGT&#xff09;的几个疑问 什么是升级中心uni-upgrade-center uniapp官方开发的App版本更新的插件&#…

结构体的不定长数组,用起来就是这么爽

结构体的不定长数组 结构体数组不定长的做法&#xff0c;有两种 第一种&#xff1a; 指针 第二种&#xff1a;长度为0的数组 1. 结构体的数组指针 特点&#xff1a; 结构体初始化时&#xff0c;可以是结构体指针&#xff0c;如struct tag_info *pInfo NULL; 也可以是结构体变量…

Python文件和数据格式化(教程)

文件是一个存储在副主存储器的数据序列&#xff0c;可包含任何数据内容。 概念上&#xff0c;文件是数据的集合和抽象&#xff0c;类似的&#xff0c;函数是程序的集合和抽象。 用文件形式组织和表达数据更有效也更加灵活。 文件包括两种形式&#xff0c;文本文件和二进制文…

推荐几款市面上常用的免费CMS建站系统

小编在网站建设行业从业十几年&#xff0c;很多客户或者朋友找我做网站的时候&#xff0c;都喜欢开发一个完全熟悉自己的网站系统&#xff0c;但是小编这里很不推荐。从0到1全新开发&#xff0c;成本&#xff0c;效率和成熟度这些和主流的cms建站系统比起来&#xff0c;完全没有…

文件与IO

一.文件的定义什么是文件&#xff1f;文件分为狭义上的文件和广义上的文件 狭义上的文件&#xff1a;文件夹中的文件&#xff1a;包括视频、图片、文本、可执行文件等等......其中有些文件是有后缀名的&#xff0c;而有一些文件是没有后缀名的广义上的文件&#xff1a;在Linux系…

Unix Linux、MAC、Window 如何安装配置环境?都在这里啦~

嗨害大家好鸭&#xff01;我是小熊猫~ 这次将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 “python” 命令来查看本地是否已经安装Python以及Python的安装版本。 源码资料电子书:点击此处跳转文末名片获…

PHP代码审计神器——RIPS个人汉化版(2017年老文)

一、RIPS简介 RIPS是一款PHP开发的开源的PHP代码审计工具&#xff0c;由国外的安全研究者Johannes Dahse开发&#xff0c;目前开源的最新版本是0.55。 程序小巧玲珑&#xff0c;仅有不到500kb&#xff0c;其中的PHP语法分析非常精准&#xff0c;可以实现跨文件变量和函数追踪…