文章目录
7.Cookies,Session
7.1 会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为状态会话
7.2 保存会话的两种技术
cookie:
- 客户端技术(响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在session中
常见场景:网站登录之后,第二次访问就不需要输入账号和密码
7.3 Cookie
- 从请求中拿到cookie信息
- 服务器响应客户端(cookie)
Cookie[] cookies=req.getCookies();//获得Cookie
cookie.getName()//获取cookie中的值
cookie.getValue()//获得cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"")//新建一个cookie
resp.addCookie(cookie);//响应给客户端
cookie:一般会保存在本地的用户目录下appdata;
一个网站cookie是否存在上限,聊聊细节问题
- 一个cookie只保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制4kb
- 300个cookie浏览器上限
删除cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
编码和解码:
URLDecoder.decode(cookie.getValue(),"utf-8")
URLEncoder.encode("秦疆","utf-8")
7.4 Session
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站他都可以访问–>保存用户的信息;保存购物车的信息
Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存
- Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建
使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
使用Session:
package com.kuang.servlet;
import com.kuang.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-16");
req.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session=req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("qinjiang",1));
//获取Session的id
String sessionId=session.getId();
//判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,ID"+sessionId);
}else{
resp.getWriter().write("session以及在服务器中存在了,ID"+sessionId);
}
//Session创建的时候做了什么事情
// Cookie cookie=new Cookie("JSESSION",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kuang.servlet;
import com.kuang.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-16");
req.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
Person person=(Person) session.getAttribute("name");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession();
session.removeAttribute("name");
//手动注销
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
会话自动过期:
<!-- 设置Session默认的失效时间-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
8.JSP
8.1 什么是JSP
Java Server Pages:Java服务端页面,也和Servlet一样,用于动态web技术!
最大的特点:
- 写JSP就像在写HTML
- 区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入Java代码,为用户提供动态数据
8.2 JSP原理
思路:JSP到底怎么执行的
-
代码层面没有任何问题
-
服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换成为一个java类
JSP本质上就是一个Servlet
在JSP页面中
- 只要是Java代码就会原封不动的输出
- 如果是HTML代码,就会被转换为:
out.write("<html>\r\n");
这样的格式,输出到前端
8.3 JSP基础语法
任何语言都有自己的语法,Java有,Jsp作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可),Java所有语法都支持!
JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%=new java.util.Date()%>
JSP脚本片段
<hr>
<%--jsp脚本片段--%>
<%
int sum=0;
for(int i=0;i<=100;i++){
sum+=i;
}
out.println("<h1>sum="+sum+"<h1>");
%>
脚本片段的再实现
<%
int x=10;
out.println(x);
%>
<p>这是一个jsp文档</p>
<hr>
<%--在代码中嵌入HTML元素--%>
<%
for(int i=0;i<5;i++){
%>
<h1>hello word <%=i%></h1>
<%
}
%>
JSP声明
<hr>
<%!
static{
System.out.println("Loading Servlet");
}
private int globalVar=0;
public void kuang(){
System.out.println("进入了该方法");
}
%>
JSP声明:会被编译到JSP生成Java的类中,其他的,就会被生成_jspServlet方法中
在jsp,嵌入java代码即可!
<%%>
<%=%>
<%!%>
<%--注释--%>
jsp的注释,不会再客户端显示,HTML就会显示
8.4 JSP指令
<%--
Created by IntelliJ IDEA.
User: 24805
Date: 2022/4/13
Time: 20:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%
int i=10;
%>
<%
<%@include file="common/foot.jsp"%>
%>
<hr>
<%--JSP标签
jsp:include:拼接页面,本质还是三个
--%>
<jsp:include page="common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="common/foot.jsp"/>
</body>
</html>
8.6 九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application(ServletContext) 存东西
- Config(ServletConfig)
- out
- page
- exception
<%
pageContext.setAttribute("name1","秦疆1");//保存的数据只在一个页面中有效
request.setAttribute("name2","秦疆2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
request:客户端向服务器发送请求产生的数据用户看完就没用了,比如:新闻,用户看完就没用了
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能用,比如:聊天记录
8.7 JSP标签,JSTL标签,EL表达式
<!-- JSTL表达式的依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- Standard标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuangshen"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
JSTL表达式:
JSTL标签库的使用就是为了弥补HTML标签的不足,他可以自定义许多标签,供我们使用,标签的功能和java代码一样!
核心标签(掌握部分)
JSTL标签库使用步骤
- 引入对应的taglib
- 使用其中方法
- 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库,我们才能使用JSTL标签core--%>
<%@ taglib prefix="c" uri='http://java.sun.com/jsp/jstl/core'%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<form action="coreif.jsp" method="get">
<%--
EL表达式获取表单中的数据
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登陆成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎你"/>
</c:if>
<c:out value="S{isAdmin}"/>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 24805
Date: 2022/4/14
Time: 18:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库,我们才能使用JSTL标签core--%>
<%@ taglib prefix="c" uri='http://java.sun.com/jsp/jstl/core'%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个变量score,值为85--%>
<c:set var="score" value="85"/>
<c:choose>
<c:when test="${score>=90}">
你得成绩为优秀
</c:when>
<c:when test="${score>=80}">
你得成绩为一般
</c:when>
<c:when test="${score>=70}">
你得成绩为良好
</c:when>
<c:when test="${score<=60}">
你得成绩为不及格
</c:when>
</c:choose>
</body>
</html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> people=new ArrayList<>();
people.add(0,"李艾");
people.add(1,"李艾");
people.add(2,"李艾");
people.add(3,"李艾");
people.add(4,"李艾");
request.setAttribute("list",people);
%>
<%--var每一次遍历出来的变量
items,要遍历的对象
begin:从哪里开始
end,到哪里
step:步长--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/><br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="3">
<c:out value="${people}"/> <br>
</c:forEach>
</body>
</html>
9.JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM
ORM,对象关系映射
- 表–>类
- 字段–>属性
- 行记录–>对象
id | name | age | address |
---|---|---|---|
1 | 秦疆1 | 3 | 西安 |
2 | 秦疆2 | 20 | 西安 |
3 | 秦疆3 | 12 | 西安 |
class people{
private int id;
private String name;
private int id;
peivate String address;
}
class A{
}