• 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

    添加如下:

     代码:

    1. import org.springframework.web.bind.annotation.RequestMapping;
    2. import org.springframework.web.bind.annotation.ResponseBody;
    3. import javax.servlet.http.Cookie;
    4. import javax.servlet.http.HttpServletRequest;
    5. @Slf4j
    6. @Controller
    7. @ResponseBody
    8. public class UserController6 {
    9. @RequestMapping("/getcookie")
    10. public void getCookie(HttpServletRequest req){
    11. //得到全部的cookie
    12. Cookie[]cookies= req.getCookies();
    13. for (Cookie a:cookies){
    14. log.info("CookieKey:" + a.getName() + " CookieValue:" + a.getValue());
    15. }
    16. }

     输出结果:

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

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

    代码:

    1. @RequestMapping("/cookie2")
    2. public String getCookie2(@CookieValue("111") String cookie) {
    3. return "CookieValue:" + cookie;
    4. }

    输出结果:

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

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

    (1)通过servlet来获取

    代码如下:

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

    结果如下:

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

    代码如下:

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

    结果如下:

    1.2存储并获取session

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

    ①存储session:

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

    ②获取session:

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

    (1)存储session的代码:

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

    (2)用servlet来获取session:

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

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

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

    结果如下:

    设置会话:

     获取会话:

    2.将结果返回给用户

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

    2.1返回一个静态html文件

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

    代码:

    1. package com.example.demo.test;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. @Controller
    5. public class UserController {
    6. @RequestMapping("/gettext")
    7. public String gettext(){
    8. return "hello";
    9. }
    10. }

    结果:

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

    1. package com.example.demo.test;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. @Controller
    5. public class UserController {
    6. @RequestMapping("/gettext")
    7. public String gettext(){
    8. return "test.html";
    9. }
    10. }

    输出结果:

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

    代码如下:

    1. package com.example.demo.test;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.ResponseBody;
    5. @Controller
    6. @ResponseBody
    7. public class UserController {
    8. @RequestMapping("/gettext")
    9. public String gettext(){
    10. return "test.html";
    11. }
    12. }

    输出结果: 

    ③关于ResponseBody的一些说明:

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

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

    2.2返回json对象

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

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

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

    ①前端通过ajax来构造:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport"
    6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    8. <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">script>
    9. <title>Documenttitle>
    10. <script>
    11. // ajax 提交
    12. function mysub(){
    13. // 1.判空
    14. var username = jQuery("#username").val();
    15. var password = jQuery("#password").val();
    16. if(jQuery.trim(username)==""){
    17. alert("请先输入用户名!");
    18. username.focus(); // 光标重制到此元素
    19. return;
    20. }
    21. if(jQuery.trim(password)==""){
    22. alert("请先输入密码!");
    23. password.focus(); // 光标重制到此元素
    24. return;
    25. }
    26. jQuery.ajax({
    27. url:"/test",
    28. type:"POST",
    29. contentType:"application/json",
    30. data:JSON.stringify({"username":name,
    31. "password":password}),
    32. success:function(result){
    33. alert(JSON.stringify(result));
    34. }
    35. });
    36. }
    37. script>
    38. head>
    39. <body>
    40. <div style="text-align: center;">
    41. <h1>登录h1>
    42. 用户:<input id="username">
    43. <br>
    44. 密码:<input id="password" type="password">
    45. <br>
    46. <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
    47. div>
    48. body>
    49. html>

    ②后端java代码:

    1. package com.example.demo.test;
    2. import org.apache.catalina.User;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.util.StringUtils;
    5. import org.springframework.web.bind.annotation.*;
    6. import java.util.HashMap;
    7. @ResponseBody
    8. @Controller
    9. public class UserController1 {
    10. @RequestMapping("/test")
    11. public HashMap login(@RequestParam(value = "username", required = false) String name, String password) {
    12. HashMap res = new HashMap<>();
    13. //假设用户只有admin,密码也是admin
    14. //状态码
    15. int state = 200;
    16. //是否登录成功
    17. boolean ok = false;
    18. //原因
    19. String msg = "登录成功!";
    20. //对密码进行验证
    21. if (StringUtils.hasLength(name) && StringUtils.hasLength(password)) {
    22. //账号与密码均不为空
    23. if (name.equals("admin") && password.equals("admin")) {
    24. //验证通过
    25. ok = true;
    26. msg = "登录成功!";
    27. } else {
    28. //账号或密码错误
    29. msg = "账号或密码错误!";
    30. }
    31. }
    32. res.put("state", state);
    33. res.put("ok", ok);
    34. res.put("msg", msg);
    35. //spring中返回map会自动转换成json格式
    36. return res;
    37. }
    38. }

    输出结果:

     

    2.3实现请求转发和重定向

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

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

    ①请求转发:

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

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

    输出结果:

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

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

    输出结果:

    ②请求重定向:

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

    代码如下:

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

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

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

    代码如下:

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

    输出结果:

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

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

  • 相关阅读:
    前端练习--3D盒子背景图运动效果
    GO语言使用之网络编程(TCP编程)
    C++面向对象 _ 成绩单系统
    Gartner 发布 2022 年人工智能技术成熟度曲线:复合 AI、决策智能快速发展,因果 AI 是热点
    【开发工具】idea 的全局搜索快捷键(Ctrl+shift+F)失效
    23年计算机408复习规划以及高分技巧--上岸学姐总结
    基于FPGA的图像拉普拉斯变换实现,包括tb测试文件和MATLAB辅助验证
    【ATT&CK】ATT&CK视角下的水坑钓鱼攻防战法
    python设计模式(二)--创建类设计模式
    C 与 C++ 的真正区别在哪里?
  • 原文地址:https://blog.csdn.net/weixin_58850105/article/details/127567382