IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring MVC(下) -> 正文阅读

[Java知识库]Spring MVC(下)

?Mybatis~~~

目录

1.获取参数

1.1获取cookie/header

1.2存储并获取session

2.将结果返回给用户

2.1返回一个静态html文件

2.2返回json对象

2.3实现请求转发和重定向


1.获取参数

本节内容接上期所讲的Spring MVC(上)

1.1获取cookie/header

我们前面讲过SpringMVC是基于Servlet的,所以,在MVC中,方法中的HttpServletRequest 与HttpServletResponse参数默认是隐藏的,如果想要使用,直接写上即可。所以,在这里我们的cookie和header都会有两种获取方式,一种是基于Servlet的,另一种是基于Spring本身的,下面我们来一一演示:

①cookie:

(1)servlet获取cookie的方法:

为了防止以下这种空指针异常的情况,我们手动地添加一项cookie

添加如下:

?代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@Controller
@ResponseBody
public class UserController6 {
    @RequestMapping("/getcookie")
        public void getCookie(HttpServletRequest req){
        //得到全部的cookie
            Cookie[]cookies= req.getCookies();
            for (Cookie a:cookies){
                log.info("CookieKey:" + a.getName() + "   CookieValue:" + a.getValue());
            }
        }

?输出结果:

同时我们可以通过抓包看到此时的cookie:

?(2)使用@CookieValue注解获取cookie的方法:

代码:

    @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue("111") String cookie) {
        return "CookieValue:" + cookie;
    }

输出结果:

注意:对于第一种方法来说会把所有的cookies都给读出来,而第二种的话更有针对性的拿出某个cookie,具体用哪种根据我们自己的需求

②header:(我们这里以获取header中的UA为例)

(1)通过servlet来获取

代码如下:

  @RequestMapping("/getheader")
    public String getHeader(HttpServletRequest request){
        return "header"+request.getHeader("User-Agent");
    }

结果如下:

(2)通过@RequestHeader注解来获取

代码如下:

    @RequestMapping("/getheader2")
    public String getHeader2(@RequestHeader("User-Agent")String UA){
        return "header"+UA;
    }

结果如下:

1.2存储并获取session

我们知道,在获取session之前需要先存入session,而在Spring MVC中存取session和在servlet阶段的存入是一致的。

①存储session:

    @RequestMapping("/setsession")
    public boolean setSession(HttpServletRequest req){
        boolean result=false;
        //1.得到HTTPsession
        HttpSession session= req.getSession(true);//此处的true,如果有session就直接用,没有就进行创建
        //2.使用setAtribute设置值
        session.setAttribute("Student对象", "这是一个Student对象");
        result=true;
        return result;
    }

②获取session:

(注意!此处一定要先setSession,即访问设置会话,否则是不会返回的)

(1)存储session的代码:

 @RequestMapping("/setsession")
    public boolean setSession(HttpServletRequest req){
        boolean result=false;
        //1.得到HTTPsession
        HttpSession session= req.getSession(true);//此处的true,如果有session就直接用,没有就进行创建
        //2.使用setAtribute设置值
        session.setAttribute("name", "大家好,我是session存储的张三同学");
        result=true;
        return result;
    }

(2)用servlet来获取session:

  @RequestMapping("/getsession1")
    public String getSession(HttpServletRequest req){
        String result=null;
        //1.得到HTTPSession对象
        HttpSession session= req.getSession(false);//如果会话不为空就可以拿到,不新建一个会话
        //2.利用getAtrribute得到会话信息
        if ((session!=null)&&session.getAttribute("name")!=null){
             result= (String)session.getAttribute("name");
        }
        return result;
    }

(3)用@RequestSession注解来获取session:

  @RequestMapping("/getsession2")
    public String getSession2(@SessionAttribute(value = "name",required = false)String name){
        return "这是一个会话:"+name;
    }

结果如下:

设置会话:

?获取会话:

2.将结果返回给用户

前面的三部曲,我们已经进行了两步,下面将是最后的环节,即从服务器返回给客户端(用户)

2.1返回一个静态html文件

首先,我们先了解@ResponseBody这个注解的意思是返回一个非静止页面,也就是说,当我们不加这个注解的时候,服务器会去找我们返回的值是否存在一个页面,若不存在,就会出现以下情况报错:

代码:

package com.example.demo.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
    @RequestMapping("/gettext")
    public String gettext(){
        return "hello";
    }
}

结果:

①创建一个html文件,来看是否能够读取到:

package com.example.demo.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
    @RequestMapping("/gettext")
    public String gettext(){
        return "test.html";
    }
}

输出结果:

②此时如果想要返回一个数据,则需要使用注解@ResponseBody修饰对应的方法或者修饰类才能实现:

代码如下:

package com.example.demo.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class UserController {
    @RequestMapping("/gettext")
    public String gettext(){
        return "test.html";
    }
}

输出结果:?

③关于ResponseBody的一些说明:

(1)ResponseBody可以修饰类,表示当前类中的所有方法都会返回一个非静态页面的数据;当然其也可以修饰方法,修饰方法时表示当前方法返回的是一个非静态页面的数据。说白了,就是作用域的问题。

(2)@RestController是@ResponseBody和@Controller的集合,所以写这一个就表示了它们两个

2.2返回json对象

此处我们通过一个ajax来构造一个登陆页面的案例,来返回json对象。在开始之前,我们先说几点需要注意的地方

(1)不要忘了设置ajax对象参数中的contentType:"application/json;charset=utf8"

(2)将对象转换成json格式的字符串需要用到JSON.Stringify

①前端通过ajax来构造:

<!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">
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <title>Document</title>
    <script>
        // ajax 提交
        function mysub(){
            // 1.判空
            var username = jQuery("#username").val();
            var password = jQuery("#password").val();
            if(jQuery.trim(username)==""){
                alert("请先输入用户名!");
                username.focus(); // 光标重制到此元素
                return;
            }
            if(jQuery.trim(password)==""){
                alert("请先输入密码!");
                password.focus(); // 光标重制到此元素
                return;
            }
            jQuery.ajax({
                url:"/test",
                type:"POST",
                contentType:"application/json",
                data:JSON.stringify({"username":name,
            "password":password}),
                success:function(result){
                    alert(JSON.stringify(result));
                }
            });
        }
    </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    用户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

②后端java代码:

package com.example.demo.test;
import org.apache.catalina.User;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
@ResponseBody
@Controller
public class UserController1 {
    @RequestMapping("/test")
    public HashMap<String, Object> login(@RequestParam(value = "username", required = false) String name, String password) {
        HashMap<String, Object> res = new HashMap<>();
        //假设用户只有admin,密码也是admin
        //状态码
        int state = 200;
        //是否登录成功
        boolean ok = false;
        //原因
        String msg = "登录成功!";
        //对密码进行验证
        if (StringUtils.hasLength(name) && StringUtils.hasLength(password)) {
            //账号与密码均不为空
            if (name.equals("admin") && password.equals("admin")) {
                //验证通过
                ok = true;
                msg = "登录成功!";
            } else {
                //账号或密码错误
                msg = "账号或密码错误!";
            }
        }
        res.put("state", state);
        res.put("ok", ok);
        res.put("msg", msg);
        //spring中返回map会自动转换成json格式
        return res;
    }

}

输出结果:

?

2.3实现请求转发和重定向

在介绍请求转发和请求重定向之前,我们先举一个实例来区别一下这两个:

张三向李四借钱,李四说他没有钱了,让他找王五借钱,这种当前丢了,负责人就是张三的行为就是类似于请求重定向。而当张三向李四借钱,李四说自己没钱,然后李四去找王五借钱,最后把钱给张三,而要是这个时候,钱丢了,责任人就是李四,这种行为就是类似于请求转发。

①请求转发:

(1) 第一种方式:此时的forward:/是可以省略的:

    @RequestMapping("/fw")
    public String fw(){
        return "forward:/hello.html";
    }

输出结果:

(2)第二种方式:使用request对象来进行跳转

 @RequestMapping("/fw2")
    public void myForward2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, ServletException, IOException {
        req.getRequestDispatcher("hello.html").forward(req, resp);
    }

输出结果:

②请求重定向:

(1) 将请求转发中的forward改为redirect:

代码如下:

    @RequestMapping("/rd")
    public String rd(){
        return "redirect:/hello.html";
    }

输出结果:(注意是跳转到了这个页面)

?(2)通过使用response对象来进行跳转:

代码如下:

 @RequestMapping("/rd2")
    public void rd2(HttpServletResponse res) throws IOException {
        res.sendRedirect("hello.html");
    }

输出结果:

关于请求转发和重定向的五大不同可以参考下面这篇博客:

面试突击66:请求转发和请求重定向有什么区别? - 掘金 (juejin.cn)

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:40:47  更:2022-10-31 11:44:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 4:28:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码