随堂笔记
随堂笔记
1.作业
1.搭建环境
【1】执行sql
create table dish (
id int primary key auto_increment,
name varchar(32) comment '菜品名称',
price double comment '菜品价格',
description varchar(200) comment '描述信息'
);
依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima.sh.heima153</groupId>
<artifactId>day17_zuoye</artifactId>
<version>1.0-SNAPSHOT</version>
<name>day17_zuoye</name>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--mybatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!--logback日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
2.response对象
1.响应字符数据
package com.itheima.sh.a_response_01;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responseDemo01Servlet")
public class ResponseDemo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
TODO:向浏览器输出字符数据,使用的对象是response的方法:PrintWriter getWriter();
*/
//1.获取响应字符数据的字符输出流对象
// PrintWriter pw = response.getWriter();
//2.响应数据
// pw.print("itcast");
// response.getWriter().print(65);
/*
注意:如果响应给浏览器是中文,会出现中文乱码问题。
原因:tomcat传输中文对中文使用默认编码表ISO-8859-1对中文进行编码,将编码的数据响应给浏览器。
浏览器默认码表是UTF-8进行解码出现乱码
解决:将响应的中文使用UTF-8编码,同时告知浏览器使用UTF-8解码
*/
//处理响应乱码
//响应头:content-type 告知浏览器当前响应数据的MIME类型,就是文件在tomcat服务器的类型
// 普通文本text/plain
// 超文本text/html
//"text/html;charset=utf-8" ===>告知浏览器响应的数据是超文本类型,并且使用的码表是UTF-8
// response.setHeader("content-type","text/html;charset=utf-8");
// response.setHeader("content-type","text/plain;charset=utf-8");
//使用简写:底层是response.setHeader("content-type","text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("<h1>锁哥</h1>");
}
}
2.响应字节数据
package com.itheima.sh.a_response_01;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/responseDemo02Servlet")
public class ResponseDemo02Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
TODO:向浏览器输出字节数据,使用的对象是response的方法:ServletOutputStream getOutputStream();
*/
//需求:将本地的图片D:\abc\柳岩.jpg输出到浏览器
/*
TODO:
分析:
数据源文件:D:\abc\柳岩.jpg 使用字节输入流关联数据源文件
目的地文件: 浏览器 使用字节输出流关联目的地即浏览器
*/
//1.创建字节输入流关联数据源文件 D:\abc\柳岩.jpg
FileInputStream fis = new FileInputStream("D:\\abc\\柳岩.jpg");
//2.根据response对象调用方法获取关联浏览器的字节输出流对象
ServletOutputStream os = response.getOutputStream();
//3.将数据源文件读取到内存中
byte[] buf=new byte[1024];//保存每次读取的字节数据
int len=0;//保存每次读取字节的个数
while((len=fis.read(buf))!=-1){
//4.将内存中的数据写到浏览器端
os.write(buf,0,len);
}
//5.释放资源
fis.close();
}
}
3.登录注册案例(课下必须实现)
1.环境搭建
【1】mybatis核心配置文件名是什么在工具类中就书写什么
【2】修改连接数据库的参数信息
【3】将前端项目放到vscode工作空间
【4】执行命令 cnpm i 安装前端项目中的依赖(在终端中必须切换到当前项目的目录)
【5】启动前端项目命令:npm run dev
2.登录案例代码实现
1.web层
package com.itheima.sh.web;
import com.itheima.sh.pojo.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.解决post请求的中文乱码问题
request.setCharacterEncoding("utf-8");
//2.接收前端提交的请求参数
/*
username: zhangsan
pwd: 1234
*/
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
//3.将请求参数封装到User实体类对象中===》user
User user = new User();
user.setUsername(username);
user.setPassword(pwd);
//4.创建业务层即service层的对象
UserServiceImpl userService = new UserServiceImpl();
//5.使用业务层对象调用业务层的登录方法将user对象传递到业务层
User u =userService.login(user);
//6.判断u是否等于null
if(u==null){
//7.如果u等于null,说明没有查到用户,登录失败,响应给前端一个false
response.getWriter().print(false);
}else {
//8.如果u不等于null,说明查到用户了,登录成功,响应给前端一个true
response.getWriter().print(true);
}
}
}
2.service层
package com.itheima.sh.service;
import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.User;
import com.itheima.sh.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class UserServiceImpl {
//1.定义登录方法接收web层传递的user对象,并返回给web层用户对象
public User login(User user) {
//2.在登录方法体中根据mybatis工具类获取mybatis会话对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
//3.使用会话对象调用方法获取dao层的接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4.使用接口代理对象调用接口中的登录方法,user作为参数传递
User u = mapper.login(user);//u是dao层返回的对象
//5.释放资源
sqlSession.close();
//6.直接返回User对象
return u;
}
}
3.dao层
package com.itheima.sh.dao;
import com.itheima.sh.pojo.User;
import org.apache.ibatis.annotations.Select;
//1创建接口
public interface UserMapper {
//2在接口中定义登录方法
//3在方法上使用注解查询数据
/*
select * from 表名 where 字段名=字段值 and ....
username=#{username} :等号左边的username是数据表字段名。等号右边即大括号中的username
是login方法形参类型User中的成员变量名 private String username;
*/
@Select("select * from user where username=#{username} and password=#{password}")
User login(User user);
}
4.前端代码
<template>
<el-form
:model="ruleForm"
:rules="rules"
ref="ruleForm"
class="demo-ruleForm"
>
<el-row type="flex" justify="center">
<!-- v-model="ruleForm.username" 双向数据绑定。数据改变,视图改变。视图改变,数据改变 -->
<el-col :span="5">
<el-form-item prop="username">
<el-input
type="text"
placeholder="请输入用户名"
required="required"
v-model="ruleForm.username"
prefix-icon="el-icon-user-solid"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="5">
<el-form-item prop="password">
<el-input
type="password"
placeholder="请输入密码"
prefix-icon="el-icon-lock"
v-model="ruleForm.password"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="5">
<el-form-item>
<!--@click="submitForm('ruleForm')" 绑定一个单击事件,点击调用函数submitForm,将整个表单传递该函数中 -->
<el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
ruleForm: {
username: '',
password: ''
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
//表单校验通过,valid的值是true,校验失败,valid值是false
if (valid) {
//TODO:向后台发送异步请求,携带请求数据完成登录
/*
ruleForm: {
username: '',
password: ''
}
*/
/*
1.定义变量保存后端服务器的地址 注意:由于我们在config/index.js中已经配置了后端服务器三要素
proxyTable: {
"/": {
target: "http://localhost:8080",
changeOrigin: true
}
},
因此我们这里只需要书写不含三要素的地址即可
*/
let url="/user/loginServlet";
//2.定义变量保存向后端发送的请求数据
let params=`username=${this.ruleForm.username}&pwd=${this.ruleForm.password}`;
//3.发送异步请求
axios.post(url,params)
.then(resp=>{
/**
* TODO:前端处理响应:
* 1.如果后端响应true,表示登录成功,跳转到主页
* 2.如果后端响应false,表示登录失败,在当前登录页面提示用户名或者密码错误
*/
//4.判断
if(resp.data){
//如果后端响应true,表示登录成功,跳转到主页
//#/success==>router/index.js===>path: '/success',===> component: success
//====>import success from '@/views/user/success'===>
//src/views/user/success.vue组件
location.href="#/success";
}else{
//如果后端响应false,表示登录失败,在当前登录页面提示用户名或者密码错误
this.$message.error('用户名或者密码错误');
}
});
} else {
//表单校验失败
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>
<style>
</style>
3.注册代码实现
1.web层
package com.itheima.sh.web;
import com.itheima.sh.pojo.User;
import com.itheima.sh.service.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.处理请求乱码
request.setCharacterEncoding("utf-8");
//2.获取页面的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//3.创建User对象
User user = new User();
//4.将获取的数据封装到User对象中
user.setUsername(username);
user.setPassword(password);
//5.创建业务层对象
UserServiceImpl userService = new UserServiceImpl();
//6.使用业务层对象调用注册方法,将User对象作为参数传递到业务层
boolean result = userService.register(user);
//7.将返回值返回给前端服务器
response.getWriter().print(result);
}
}
2.业务层
//1.定义注册的方法接收web层传递的user对象
public boolean register(User user) {
SqlSession sqlSession=null;
try {
//2.获取会话对象
sqlSession = SqlSessionUtil.getSqlSession();
//3.获取接口代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4.使用接口代理对象调用接口中的根据用户名查询的方法
// String username = user.getUsername();
User u = mapper.queryUserByUserName(user.getUsername());
//5.判断返回的User对象是否等于null
if(u == null){
//6.如果等于null,说明没有查到,可以注册,使用接口代理对象调用注册方法
mapper.register(user);
//7.提交事务 工具类自动提交了
//8.返回给web层true
return true;
}else{
//9.如果查询的用户对象不等于null,说明用户存在,不能注册,返回给web层false
return false;
}
} finally {
//10.释放资源
//防止空指针异常
if(sqlSession!=null){
sqlSession.close();
}
}
}
3.dao层
//根据用户名查询方法
/*
TODO:关于mybatis入参:
1.如果方法只有一个非pojo Map类型,myabtis底层是没有处理,我们在 #{}的大括号中获取数据随便书写。建议
使用注解@Param("标识符")修饰参数,那么此时#{}的大括号中只能书写@Param("标识符")注解的标识符
*/
@Select("select * from user where username=#{username}")
User queryUserByUserName(@Param("username") String username);
@Insert("insert into user values(null,#{username},#{password})")
void register(User user);
4.前端代码
<template>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-row type="flex" justify="center">
<el-col :span="5">
<el-form-item prop="username">
<el-input type="text" placeholder="用户名" required="required" v-model="ruleForm.username" prefix-icon="el-icon-user-solid"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="5">
<el-form-item prop="password">
<el-input type="password" placeholder="请输入密码" v-model="ruleForm.password" prefix-icon="el-icon-lock"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="5">
<el-form-item class="btn-form">
<el-button type="primary" @click="submitForm('ruleForm')">注册</el-button>
<!-- <el-button @click="resetForm('ruleForm')">重置</el-button> -->
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
ruleForm: {
username: '',
password: ''
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
//TODO:向后台发送异步请求,携带请求数据完成注册
//1.定义变量保存地址
let url=`/user/registerServlet`;
//2.定义变量保存请求参数
let params=`username=${this.ruleForm.username}&password=${this.ruleForm.password}`;
//3.发送异步请求
axios.post(url,params)
.then(resp=>{
//console.log(resp.data);
/**
* TODO:注册处理响应
* 1.如果后端响应true,表示注册成功,跳转到登录页面
* 2.如果后端响应false,表示注册失败,提示用户名已经存在,重新输入
*/
//4.判断
if(resp.data){
//如果后端响应true,表示注册成功,跳转到登录页面
//提示成功信息
this.$message({
message: '恭喜你,注册成功,登录吧,欧耶',
type: 'success'
});
//跳转到登录页面
setTimeout(function(){
location.href="#/login";
},3000);
}else{
//如果后端响应false,表示注册失败,提示用户名已经存在,重新输入
this.$message.error('用户名已经存在,重新输入用户名');
}
});
} else {
//表单校验失败
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>
<style>
</style>
4.创建cookie并响应给浏览器(掌握)
package com.itheima.sh.b_cookie_02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo01Servlet")
public class CookieDemo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建cookie对象,向cookie中存储数据Cookie(String name, String value)
//TODO:name值是唯一的,如果name值一致,后出现的value会覆盖之前的value
Cookie cookie = new Cookie("msg", "杨幂");
//2.将cookie响应给浏览器客户端
response.addCookie(cookie);
}
}
5.获取cookie(掌握)
package com.itheima.sh.b_cookie_02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo02Servlet")
public class CookieDemo02Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
获取浏览器请求的cookie
*/
//1.取出请求中的cookie
Cookie[] cookies = request.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
//3.获取cookie的name Cookie cookie = new Cookie("msg", "杨幂");
String name = cookie.getName();
//4.获取cookie的value
String value = cookie.getValue();
System.out.println(name+"---"+value);
}
}
}
6.cookie的原理(掌握)
7.Cookie使用细节(掌握)
1.持久化cookie
cookie默认是会话级别的,会话结束,cookie消失。打开浏览器cookie已经不存在了。在开发中会话级别的cookie无法达到长时间共享数据。
持久化cookie就是使用Cookie类中的方法:
void setMaxAge(int expiry) 单位是秒
package com.itheima.sh.b_cookie_02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo03Servlet")
public class CookieDemo03Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
持久化cookie
*/
//1.创建cookie
Cookie cookie = new Cookie("username", "锁哥");
//2.设置最大存活时间即持久化cookie void setMaxAge(int expiry) 单位是秒
cookie.setMaxAge(60*60*24*7);//一周
//3.响应给浏览器
response.addCookie(cookie);
}
}
小结:
按照存活时间cookie有两种:
1.会话级别的cookie,默认的,浏览器关闭,cookie消失
2.持久化的cookie,可以通过Cookie类的方法设置cookie存活时间更长:
void setMaxAge(int expiry) 单位是秒
2.关于cookie中存储特殊字符问题 (理解原理即可)
编码
package com.itheima.sh.b_cookie_02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet("/cookieDemo04Servlet")
public class CookieDemo04Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
向cookie中存储特殊符号
TODO:
1.cookie中不能存放特殊符号,如果存放就会报错:An invalid character [32] was present in the Cookie value
2.如果想向cookie中存储特殊符号需要对特殊符号进行编码和解码
*/
//创建cookie
String value = "12 34";//空格属于特殊符号
//编码
String encode = URLEncoder.encode(value, "utf-8");
Cookie cookie = new Cookie("msg", encode);
//响应给浏览器
response.addCookie(cookie);
}
}
解码
package com.itheima.sh.b_cookie_02;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
@WebServlet("/cookieDemo05Servlet")
public class CookieDemo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
向cookie中存储特殊符号
TODO:
1.cookie中不能存放特殊符号,如果存放就会报错:An invalid character [32] was present in the Cookie value
2.如果想向cookie中存储特殊符号需要对特殊符号进行编码和解码
*/
//1.获取请求的cookie对象
Cookie[] cookies = request.getCookies();
//2.遍历
for (Cookie cookie : cookies) {
//3.获取cookie的name
String name = cookie.getName();
//4.判断
if("msg".equals(name)){
//5.获取值
String value = cookie.getValue();
//6.解码
String decode = URLDecoder.decode(value, "utf-8");
System.out.println("decode = " + decode);
}
}
}
}
8.session介绍(理解)
1.创建服务器端,存在服务器中。
2.好处:安全
3.弊端:服务器压力大。
9.session的基本使用(掌握)
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemo01Servlet")
public class SessionDemo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建session
HttpSession session = request.getSession();//有则获取session对象;没有则创建session对象
//2.向session中存储数据
session.setAttribute("msg","session入门");
}
}
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemo02Servlet")
public class SessionDemo02Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();//有则获取session对象;没有则创建session对象
//2.从session中取出数据 session.setAttribute("msg","session入门");
Object value = session.getAttribute("msg");//参数msg是setAttribute("msg","session入门");方法的第一个参数
//3.输出
System.out.println("value = " + value);
}
}
10.session的原理(掌握)
小结:
1.第一次访问服务器的时候,tomcat服务器会为每个浏览器创建session容器,同时创建会话级别的cookie,存放session容器的唯一标识JSESSIONID.tomcat将cookie响应给浏览器,存放到浏览器端
2.当下次访问服务器的时候携带保存浏览器端的cookie到tomcat服务器中,在tomcat服务器中取出cookie中的JSESSIONID的值,进行比较查找,来查找自己的session容器然后取出session容器中的数据。
3.session是基于cookie的。
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemo03Servlet")
public class SessionDemo03Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
TODO:session原理验证
*/
//1.创建session
HttpSession session = request.getSession();
//2.获取session的唯一标识JSESSIONID
String sessionId = session.getId();
System.out.println("sessionId = " + sessionId);
}
}
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemo04Servlet")
public class SessionDemo04Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
TODO:session原理验证
*/
//1.获取session
HttpSession session = request.getSession();
//2.获取session的唯一标识JSESSIONID
String sessionId = session.getId();
System.out.println("sessionId = " + sessionId);
}
}
11.Session的使用细节
1.持久化session
由于之前tomact默认创建的是会话级别的cookie,浏览器关闭,cookie消失,导致cookie中存储的JSESSIONID也消失了,下次打开浏览器无法找到之前的session容器了,注意,session容器还存在服务器中。那么tomcat会根据当前请求重新创建一个新的session容器。这样多次关闭浏览器操作就会造成tomcat服务器中有过多不能使用的session容器。因此我们需要解决----》持久化session其实就是持久化cookie。
持久化session步骤:
1.创建session
2.获取session的唯一标识JSESSIONID
3.创建Cookie对象,将获取的JSESSIONID存储到Cookie中
4.持久化cookie
5.将cookie响应给浏览器
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/sessionDemo05Servlet")
public class SessionDemo05Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
持久化session
*/
//1.创建session
HttpSession session = request.getSession();
//2.获取session的唯一标识JSESSIONID
String id = session.getId();
//3.创建Cookie对象,将获取的JSESSIONID存储到Cookie中
Cookie cookie = new Cookie("JSESSIONID", id);
//4.持久化cookie
cookie.setMaxAge(60*60*24);
//5.将cookie响应给浏览器
response.addCookie(cookie);
}
}
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/sessionDemo06Servlet")
public class SessionDemo06Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
持久化session
*/
//1.创建session
HttpSession session = request.getSession();
//2.获取session的唯一标识JSESSIONID
String id = session.getId();
System.out.println("id = " + id);
}
}
2.销毁session
package com.itheima.sh.c_session_03;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/sessionDemo09Servlet")
public class SessionDemo09Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
session的销毁;
1.默认存活时间是30min
2.通过HttpSession中的方法 invalidate()
*/
//1.创建session
HttpSession session = request.getSession();
//2.输出id
System.out.println(session.getId());
//3.销毁
session.invalidate();//报错setAttribute: Session [C77B62CBA78B9448A25DAB0163A3261D] has already been invalidated
//4.向session中存储数据
session.setAttribute("msg","吴亦凡");
}
}
小结:
1.何时创建session
第一次访问服务器执行代码: HttpSession session = request.getSession();
2.销毁:
1 默认存活时间30min到自动销毁
2使用函数session.invalidate();销毁
今日反馈和作业
能够使用Response对象响应字节和字符数据
响应字符数据:response.getWriter().print()
响应字节数据:response.getOutputStream();
能够解决响应字符数据中文乱码问题
response.setContentType("text/html;charset=urf-8");
能够发送Cookie、获取Cookie
发送Cookie: response.addCookie(cookie对象);
获取Cookie: Cookie[] arr= request.getCookies();
能够设置Cookie的存活时间
cookie对象.setMaxAge(存活时间);
能够使用Session设置数据、获取数据
Session设置数据:session对象.setAttribute(String name,Object value)
获取数据::session对象.getAttribute(name)
作业:
1.登录注册案例 必须完成
2.选做:作业题编程题一 二(推荐做二)