cookie
Cookie是用来识别用户的。
如何防止借钱时被骗?
如何防止不认识一个人呢?
没有设置有效期的cookie,浏览器关闭了,cookie也就没有了
设置cookie有效期
链接:https://pan.baidu.com/s/1Fce0wIyk6jGHhO2QFQtr5Q
提取码:s2ss
下载完成后解压到,你的项目文件中
更改项目名字为:springmvc02cookie
更改后,打开项目,打开pom.xml,修改依赖名
然后eclipse中 ,导入此项目
导入成功,打开application.properties 修改端口为:
选中com.tedu.webDemo右键新建一个com.tedu.webDemo.controller 包
设置cookie有效期
需求:用户不登录情况下,记录用户购买了那些商品。
在com.tedu.webDemo.controller中 新建一个类IndexController
package com.tedu.webDemo.controller;
import java.util.UUID;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
//保存一个cookie,设置有效期,浏览器关闭还在
//关闭服务器,重启 tomcat started on port 1314
//localhost:1314 点i图标,查看cookie有效期,关闭浏览器,cookie还在
@SpringBootApplication
public class IndexController {
@RequestMapping("/index")
public String index(HttpServletResponse response){
//不设有效期
//创建临时的cookie,浏览器一关,就没了
String id1=UUID.randomUUID().toString();
Cookie cookie=new Cookie("baidu_id1",id1);
response.addCookie(cookie);
//长期的cookie,浏览器关了,还存在
String id2=UUID.randomUUID().toString();
Cookie cookie2=new Cookie("baidu_id2", id2);
cookie2.setMaxAge(60*3);//有效期是3分钟
return "设置cookie";
}
}
查看bd_id1的有效期
查看bd_id2的有效期
查看bd_id2还在,有效期结束后就没有了
网站能收到A网站的cookie吗?
浏览器只会把A网站保存的cookie发给A网站
像银行只会把A存的钱给A一样。
Session
会话:session用在服务器端,用session保存数据,相当于一个小型的数据库
需求:商城购物车
添加购物车
package com.tedu.webDemo.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//需求:商城购物车
@RestController
public class CartController {
//把商品放到session中
@RequestMapping("/add")
//localhost:1314/add?mate=10
//session内部是有hashmap,用来存放数据
public String add(String name,HttpSession session) {
//找到购物车
ArrayList<String> cartList = (ArrayList<String>)session.getAttribute("cartList");
//第一次执行add(),cartList == null
//判断购物车是否为空
if (cartList == null) {
//创建购物车
cartList = new ArrayList<String>();
//把集合保存到session当中
//保存购物车
session.setAttribute("cartList", cartList);
}
//把商品放到集合中
//向购物车添置商品
cartList.add(name);
return "将商品添加到session";
}
//查看购物车
//从session中取出商品
//http://localhost:1314/list
@RequestMapping("/list")
public String list(HttpServletRequest request,HttpSession session) {
String string = "";
//找到购物车
ArrayList<String> cartList = (ArrayList<String>) session.getAttribute("cartList");
//判断购物车是否为空
if (cartList != null) {
//从集合中取出商品
//遍历商品
for (String name:cartList) {
string = string + name + "<br>";
}
}
return string;
}
}
向购物车添加商品
启动服务器,打开网页输入:
localhost:1314/add?name=mate10
localhost:1314/add?name=mate20
localhost:1314/add?name=mate30
查看购物车
然后打开集合:
localhost:1314/list
查看cookie
在服务器使用session后,服务器会自动向浏览器写入JSESSIONID cookie,值是一个随机数,每个用户都不一样。
//获取cooke用request
Cookie[] cookies=request.getCookies();
if(cookies != null) {
for(Cookie cookie:cookies) {
String name=cookie.getName();
String value=cookie.getValue();
string=string+name+":"+value+"<br>";
}
}
完整代码:
package com.tedu.webDemo.controller;
import java.util.ArrayList;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//需求:商城购物车
@RestController
public class CartController {
//把商品放到session中
@RequestMapping("/add")
//localhost:1314/add?mate=10
public String add(String name,HttpSession session) {
ArrayList<String> cartList = (ArrayList<String>)session.getAttribute("cartList");
//第一次执行add(),cartList == null
if (cartList == null) {
cartList = new ArrayList<String>();
//把集合保存到session当中
session.setAttribute("cartList", cartList);
}
//把商品放到集合中
cartList.add(name);
return "将商品添加到session";
}
//从session中取出商品
@RequestMapping("/list")
public String list(HttpServletRequest request,HttpSession session) {
String string = "";
//获取cooke用request
Cookie[] cookies=request.getCookies();
if(cookies != null) {
for(Cookie cookie:cookies) {
String name=cookie.getName();
String value=cookie.getValue();
string=string+name+":"+value+"<br>";
}
}
//从session中找打集合
ArrayList<String> cartList = (ArrayList<String>) session.getAttribute("cartList");
if (cartList != null) {
//从集合中取出商品
for (String name:cartList) {
string = string + name + "<br>";
}
}
return string;
}
}
分析
使用chrome,360分别访问会发现每个用户的jsessionId是不一样的
Cookie与sessoin的关系
Session的数据是存在服务器内存中,服务器重启数据就没了。
Session是用临时cookie实现的,浏览器一关数据就没有了。如何实现在浏览器中添加购物车,在手机端查看呢?
解决思路:
把购物商品放到数据库中,通过用户名从数据库查找购物商品。
Cookie的数据是存在浏览器中的
删除cookie,禁用cookie
Chrome设置高级下载内容隐私设置和安全性Cookie 及其他网站数据选择“仅将本地数据保留到您退出浏览器为止”或者“阻止网站设置任何数据”
禁用后,无法通过session获取数据。
开启后,可通过session获取数据。
如果禁用cookie后,如何使用session?
创建控制器controller返回json
浏览器使用ajax或vue访问服务器。
查看项目依赖了spring webmvc和jackson如下图
练习:
创建一个Item.java 类
package com.tedu.webDemo.controller;
public class Item {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建一个ItemController .java 类
package com.tedu.webDemo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ItemController {
@RequestMapping("/find")
public Item find() {
Item item=new Item(); //打上断点
item.setId(90);
item.setName("mate30");
//springmvc框架会自动调用jackson
return item;
//把item转成json字符串
}
}
DeBUG启动:
http://localhost:1314/find
如果执行中他变绿了,就按F8或者点击他
JSP
是什么呢?
java server page :老技术,10年前用,为什么还要学呢?(一些官方比如银行会使用这种)
新项目的page是用vue来写的:Vue联网取到json,用数据绑定把json中的数据显示在网页上
怎么用?
创建.jsp文件
详细设计(思路)
webDemo,下载链接:
链接:https://pan.baidu.com/s/1Fce0wIyk6jGHhO2QFQtr5Q
提取码:s2ss
1.拷贝webDemo,直接解压,改文件名springmvc03jsp,改pom.xml中的antifactid和name
—
2.然后在ecipse中导入import > maven >existing maven projects
3.在pom.xml添加jsp依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
4.创建com.tedu.webDemo.controller包,然后创建Item
创建Item.java类
package com.tedu.webDemo.controller;
//商品
public class Item {
//编号
Integer id;
//名称
String name;
//创建构造方法
public Item(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
//创建get、set方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.创建WEB-INF文件夹,再创建jsp/Item.jsp
选中jsp文件夹 ctrl+N搜索jsp
然后把以下内容复制粘贴进去
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
jsp
</body>
</html>
6.修改application.properties增加配置
设置jsp的前缀和后缀。强制把jsp放在/WEB-INF/jsp文件夹中。
设置后在controller通过文件名list就可以访问/WEB-INF/jsp/list.jsp。
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
7.创建controller
@RestController返回json :返回json(新项目基本上都是用这个)
@Controller :可以返回jsp
思路:
public ModelAndView list(){
在服务器端把数据放到jsp中,把html和数据一起返回给浏览器
new ModelAndView("item.jsp") //展现jsp的
modelAndView.addObject("itemList",list<item>) //model:展现数据,把数据展示在jsp上
}
创建一个ItemController 类
package com.tedu.webDemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
//@RestController 返回json
@Controller //返回jsp
public class ItemController {
//把几个商品显示在浏览器上
public ModelAndView list() {
//创建modelAndView
//显示WEB-INF/jsp/item.jsp
//applicaiton.properties中已经配置WEB-INF/jsp
//和.jsp了
String viewName="item";
ModelAndView modelAndView=new ModelAndView(viewName);
return modelAndView;
}
}
打开main类然后DeBUG AS执行
案例:使用jsp显示商品列表
浏览器调试窗口中查看返回为html
8.item.jsp
用到了jstl taglibrary,像Vue中的v-for
jstl提供一个类似v-for的foreach
package com.tedu.webDemo.controller;
import java.util.ArrayList;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//@RestController 返回json
@Controller //返回jsp
public class ItemController {
//把几个商品显示在浏览器上
@RequestMapping("/list")
public ModelAndView list() {
//创建modelAndView
//显示WEB-INF/jsp/item.jsp
//applicaiton.properties中已经配置WEB-INF/jsp
//和.jsp了
String viewName="item";
ModelAndView modelAndView=new ModelAndView(viewName);
//创建集合
ArrayList<Item> itemList=new ArrayList<Item>();
//创建两个商品
Item item1=new Item(80, "魅族17");
Item item2=new Item(90, "华为mate30");
Item item3=new Item(90, "小米12pro");
//把商品放入到集合中
itemList.add(item1);
itemList.add(item2);
itemList.add(item3);
modelAndView.addObject("list", itemList);
return modelAndView;
}
}
把下面这句话导入jsp中
JSTL(Java server pages standarded tag library,即JSP标准标签库),使用jstl可以很方便的在jsp中显示java数据,拷贝taglib标签。Jsp修改后要重启服务器,才生效
<!-- 相当于import -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
然后对jsp进行创建,调用Vue
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>jsp</h1>
<table border="2">
<!-- 调用Vue:
Vue用v-for显示集合
遍历list,取出来每个数据,每个数据叫item
-->
<c:forEach items="${list}" var="item">
<tr>
<td>${item.id}</td>
<td>${item.name}</td>
<tr>
</c:forEach>
</table>
</body>
</html>
DeBUG AS运行:
http://localhost:8080/list
路径创建错了,报404
属性名写错会报500
jsp与vue区别
小结
使用vue,浏览器先请求html,网页加载完之后,再用axios发请求,得到json,用数据绑定把数据显示在网页上。
使用jsp,浏览器发一次请求,在服务器上生成html,浏览器得到的是html,直接显示在网页上。
Vue是前台web与后台数据分离。有助于专业化。后台程序员专门用java做后台开发,前台程序员用vue,js专门做前台。推荐用vue。
老项目用jsp。