[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpGuc48i-1586259937835)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407103852083.png)]
用户通过浏览器访问web服务器的时候 web服务器会创建一个session
然后将这个session的ID传回给用户
服务器中存储Session中的所有信息,由于要节省服务器资源,所以Session中只存储重要信息
存储之后用户再在网页中的其他页面中浏览时Session中的信息都不会改变
例如:登录账号、购物车、在整个网页中经常存储的信息。。。。
先获取浏览器中的Session
//取出浏览器中的Session
HttpSession session = req.getSession();
判断Session是否是最新的
if (session.isNew()) {
resp.getWriter().write("创建Session成功,ID" + session.getId());
} else {
resp.getWriter().write("服务器中已存在Session,ID" + session.getId());
}
此时检查网页源码抓包发现session是以cookie的形式发送的
所以等同于
//在浏览器中看到Session被当作Cookie来存储和创建了
// Cookie cookie = new Cookie("JSSESSIONID","sessionID");
// resp.addCookie(cookie);
//取出浏览器中的Session
HttpSession session = req.getSession();
//给Session中存储东西
session.setAttribute("name", new Person("游",1));
Person对象的创建
package com.you.pojo;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然后我们再创建一个类去获取刚刚传输进去的Person对象
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//取出浏览器中的Session
HttpSession session = req.getSession();
//获取SessionDemo01中创建的Session
Person person = (Person) session.getAttribute("name");
System.out.println("获取到的id是"+person);
}
这样从控制台输出了person的变量“name+age”
由此说明session是可以用来存储一个共有数据,给任何新的页面都可以读取
用户登录和购物车的实现就是这样的原理
手动注销
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();//手动注销 session.invalidate
}
会话自动过期:web.xml中配置
<session-config>
<session-timeout>1440session-timeout>
session-config>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znU2Qbno-1586259937838)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407104110318.png)]
JSP实际上也是一种servlet,如何理解呢?
其实在我们创建web工程并访问一个JSP页面的时候Tomcat自动生成了jsp.java和jsp.class文件在
C:\Users\你的用户名.IntelliJIdea2018.2\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp 之中
打开jsp.java去阅读源码会发现它实际上就是一个Servlet
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
其中有一个方法将html代码按照sevrlet输出方式输出到浏览器中(就这样实现了HTML代码的书写)
out.write("\n");
out.write("\n");
out.write("Hello World!
\n");
out.write("\n");
out.write("\n");
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP其实就是Servlet
详细图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXY1LVxI-1586259937840)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407111336531.png)]
而对于java代码JSP则会原封不动的输出。
<% %><%--脚本片段用于书写java代码--%>
<%! %>//)<%--JSP声明标签 这之中填写的java代码是直接在最大的java类之中(作用域很广 整个JSP页面都可以获取到声明的对象或者变量--%>
${}<%--用于输出变量或者对象例如:${i}--%>
<%@ page args....%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--格式(一般在最开始的时候去声明)--%>
<%@ page/include>
例子:显示将所有网页中共有的元素
<%--<%@include file>是将两个页面合二为一--%>
<%@include file="commen/header.jsp"%>
网页主体
<%@include file="commen/footer.jsp"%>
另一种写法
<%--
网页主体
下面这种更灵活,可以随意在其他共有部分去做修改而不会影响到主体内容
PageContext 存东西
Request 存东西
Respones
Session 存东西
Application(ServletContext)存东西
config(ServletConfig)
out
page,几乎不用
exception、
作用域从低到高:page->request->session–>application
例子:
在一个A.jsp页面设定了几个存储数据的方式并存储了数据
pageContext.setAttribute("name1","游1");//保存的数据只在一个页面中有效
request.setAttribute("name2","游2");//保存的数据只在一个请求中有效,请求转发也会携带
session.setAttribute("name3","游3"); //在一次会话中有效 (从打开浏览器到关闭)
application.setAttribute("name4","游4"); //在服务器中有效,从打开服务器到关闭服务器
在其他的B.jsp页面中试图打印这些方法的数值时
游1 2无法打印
butt why?
因为pageContext只能在一个页面中有效,request只在一次请求中有效
而如果此时我在A.JSP中设置一个请求转发
pageContext.forward("/B.jsp");
这时候就只有游1无法打印了
要用jstl需要导入jar包 搜索JSTl maven下载JSTL-api
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2-rev-1version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
EL表达式${}
Jsp的一些标签
<%--localhost:8080/jsptag.jsp?name=you&age=23--%>
<%--相当于转发之后携带了参数--%>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足:它自定义许多标签,可以供我们使用,标签的功能和java代码一样!
同样在jsp页面中使用JSTL标签库也需要声明并导入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--引入JSTL核心标签库--%>
此处可能会报错 因为jsp实在web服务器中运行的 但是tomcat服务器没有包含JSTL的jar包 此时需要我们手动导入
核心标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOpElA4T-1586259937841)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407153004096.png)]
c:if
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--引入JSTL核心标签库--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
if测试
<%--判断如果提交的用户名是管理员,则登录成功--%>
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>
c:when
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%--定义一个标签叫score 并且给它赋值--%>
你的成绩良好
你的成绩一般 ${score}
你的成绩良好
你的成绩一般 ${score}
类似于switch
c:foreach
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%--定义一个字符串数组存储数据--%>
<%
ArrayList people = new ArrayList<>();
people.add("张三");
people.add("李四");
people.add("王五");
people.add("赵六");
//然后存放到request中
request.setAttribute("list",people);
%>
<%--
var,每一次遍历出来的变量,相当于
for (String person : people) {
}
items,要遍历的变量
begin=""从哪里开始遍历 0默认
end=""在哪里结束 last 默认
step="" 遍历步长 1 默认
--%>
<%--
var,每一次遍历出来的变量,相当于
for (String person : people) {
}
items,要遍历的变量
begin=""从哪里开始遍历 0默认
end=""在哪里结束 last 默认
step="" 遍历步长 1 默认
--%>
JavaBean有特定的写法:
一般用来和数据库的字端作映射 ORM;
ORM:对象关系映射
id | name | age | address |
---|---|---|---|
1 | 游1 | 3 | 湖北 |
2 | 游2 | 2 | 湖北 |
3 | 游3 | 100 | 湖北 |
public class people{
private int id;
private String name;
private int age;
private String address;
}
class A{
new people(1,"游1",3,”湖北)
}