利用Spring MVC开发程序1:https://developer.aliyun.com/article/1521792
获取Cookie信息
在之前使用Servlet来获取Cookie信息时,首先就需要利用HttpServletRequest对象来获取所有的cookie信息,然后进行遍历。
@RequestMapping("/cookie") public String getCookie(HttpServletRequest req){ Cookie[] cookies = req.getCookies(); StringBuilder stringBuilder = new StringBuilder(); for(Cookie item : cookies){ stringBuilder.append("CookieName:"+item.getName()+ "cookieValue:"+item.getValue()+" \n"); } return stringBuilder.toString(); }
使用@CookieValue注解来实现Cookie信息的读取,但是使用该注解只能获取一个参数信息,若要获得多个参数的注解就需要在之后继续使用该注解来进行获取。
我们可以在前端页面的控制台先添加几个cookie信息,方便进行测试。
获取name信息:
还想要获取age信息的话,就再使用@CookieValue注解:
@RequestMapping("/getcookie") public String getcookie(@CookieValue("name") String namevalue,@CookieValue("age") String age){ return "nameValue:"+namevalue+",ageValue:"+age; }
获取请求头Header信息
使用Servlet在进行获取时,同样要从HttpServletRequest对象中来进行获取,但是在Spring MVC项目中就可以使用@RequestHeader注解来进行获取:
@RequestMapping("header") public String getHeader(@RequestHeader("User-Agent") String value){ return "User-Agent:"+value; }
存储和获取Session信息
在获取Session信息之前先要存储Session信息,可以使用代码现将Session信息进行存储:
@RequestMapping("/setsession") public boolean setSession(HttpServletRequest req){ boolean flag = false; HttpSession session = req.getSession(true);//没有Session对象就先进行创建 session.setAttribute("userinfo","user"); flag = true; return flag; }
Session信息存储完成之后就要进行信息的获取,需要使用@SessionAttribute注解,设置value属性为要获取的Session对象,required属性设置为false,表示要获取的Session对象即使为空程序也不会进行报错。
@RequestMapping("/getsession") public String getSession(@SessionAttribute(value = "userinfo",required = false) String info){ return "userinfo:"+info; }
三、返回数据
返回静态页面
在没加任何注解的情况默认返回的是静态页面,当返回的不是静态页面就会报错:
@RequestMapping("/test") public String get(){ return "test"; }
当修改返回的是一个html静态页面时,程序就能正确运行:
@RequestMapping("/test") public String get(){ return "test.html"; }
返回非静态页面的数据
当我们要返回的是非静态页面的数据时就需要用到@ResponseBody注解,该注解既能修饰类,也能修饰方法。
@Controller @ResponseBody public class ReceiveController { @RequestMapping("/test") public String get(){ return "test.html"; } }
也能直接在类之前使用 @RestController注解来代替@Controller注解和@ResponseBody注解,来返回非静态页面的数据。
请求转发
请求转发:客户端向服务器端发送请求,服务器收到请求之后会现将请求转发给目标地址,然后将目标地址的结果返回给客户端。
请求转发有两种实现方式:
方式一:在forward之后加请求转发的内容地址:
@RequestMapping("/fw") public String fw(){ return "forward:/test.html"; }
此处若要跳转到test.html页面,切忌加@ ResponseBody注解。
方式二:使用http请求的getRequestDispatcher方法获取到要转发的对象,然后利用forwad进行转发:
@RequestMapping("fw2") public void fw2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/test.html").forward(req,resp); }
请求重定向
请求重定向:客户端向服务端发送一个请求,然后服务器端会给客户端发送一个临时响应头,这个响应头中包含客户端需再次访问的url地址,客户端收到地址之后就需要将请求再次转发给新的目标地址。
方式一: 在redirect之后加上请求重定向的地址:
@RequestMapping("/rd") public String rd(){ return "redirect:/test.html"; }
虽然 输入的是rd路由地址,但是会重定向到test.html。
方式二:使用HttpServletResponse对象的sendRedirect进行重定向:
@RequestMapping("/rd2") public void rd2(HttpServletResponse resp) throws IOException { resp.sendRedirect("/test.html"); }
请求转发 VS 请求重定向
定义不同:请求转发是客户端给服务器端发送请求,服务器端收到请求后会将请求转发给目标地址,然后将目标地址的结果返回给客户端;请求重定向是客户端给服务器端发送请求,服务器端收到请求之后会给客户端返回一个临时响应头,里面包含了客户端需再次访问的url地址,客户端就需要将请求再次发送新的目标url地址。
请求方不同:请求转发是服务器端的行为,服务器代替客户端发送请求给目标地址;请求重定向是客户端行为,客户端需将请求转发给新的目标地址。
数据共享不同:请求转发的客户端只发送一次请求整个交互过程就只有一个HttpRequest对象和一个HttpResponse对象,整个过程请求和返回的数据可以共享;但是请求重定向发送了两次请求,HttpResponse对象和HttpRequest对象不唯一,整个过程数据不可共享。
最终的url地址不同:请求转发的url地址就是请求的url地址,但是请求重定向的最终的url地址是第一次请求之后服务端返回的临时响应头中的目标url地址。
代码实现不同:上文已进行说明。
四、案例演示
1、利用form表单实现两数相加
前端页面使用form表单实现:
<form action="cal"> num1:<input type="text" name="num1"><br> num2:<input type="text" name="num2"><br> <input type="submit" value="add"> </form>
后端将前端获取的两数进行相加,并将结果打印,并添加了一个可以返回的超链接:
@RequestMapping("/cal") @ResponseBody public String cal(Integer num1,Integer num2){ return "<h1>" + (num1+num2) +"</h1>"+"</br>" + "<a href='javascript:history.go(-1);'>返回</a>"; }
效果展示:
点击add按钮之后:
2、利用ajax实现页面登录
前端使用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"> <title>login</title> <script src="js/jquery.min.js"></script> <script> function login(){ var username = jQuery("#username"); var password = jQuery("#password"); if(jQuery.trim(username.val())===""){ alert("请输入用户名"); username.focus();//光标重置 return; } if(jQuery.trim(password.val())===""){ alert("请输入密码"); password.focus(); return; } jQuery.ajax({ url:"/login", type:"POST", contentType:"application/json", data:JSON.stringify({"username":username.val(),"password":password.val()}), success:function (result){ alert(JSON.stringify(result)); } }); } </script> </head> <body> <div style="text-align: center"> <h1>登录</h1> 用户名:<input type="text" id="username"><br> 密 码:<input type="password" id="password"><br> <input type="submit" value="登录" onclick="login()" style="margin-top: 20px;margin-left: 50px;"> </div> </body> </html>
后端使用返回Json格式的数据给前端:
@Controller public class Login { @ResponseBody @RequestMapping("/login") public HashMap<String,Object> login(@RequestBody Userinfo userinfo){ HashMap<String,Object> result = new HashMap<>(); int state = 200; if(userinfo.getUsername()!= null && userinfo.getPassword() != null && userinfo.getUsername().equals("user") && userinfo.getPassword().equals("user")){ result.put("msg","登录成功"); }else{ result.put("msg","登录失败"); } result.put("state",state); return result; } }