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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张洋洋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值