学习笔记day03
1、Session
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpGuc48i-1586259937835)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407103852083.png)]
1.1、理解
用户通过浏览器访问web服务器的时候 web服务器会创建一个session
然后将这个session的ID传回给用户
服务器中存储Session中的所有信息,由于要节省服务器资源,所以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);
1.2、session的作用域和传输object
//取出浏览器中的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是可以用来存储一个共有数据,给任何新的页面都可以读取
用户登录和购物车的实现就是这样的原理
1.3、注销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默认失效时间,单位时分钟-->
<session-config>
<session-timeout>1440</session-timeout>
</session-config>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znU2Qbno-1586259937838)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407104110318.png)]
2、JSP
2.1、理解
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("<html>\n");
out.write("<body>\n");
out.write("<h2>Hello World!</h2>\n");
out.write("</body>\n");
out.write("</html>\n");
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP其实就是Servlet
详细图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXY1LVxI-1586259937840)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407111336531.png)]
而对于java代码JSP则会原封不动的输出。
2.2、JSP的一些基础语法
<% %><%--脚本片段用于书写java代码--%>
<%! %>//)<%--JSP声明标签 这之中填写的java代码是直接在最大的java类之中(作用域很广 整个JSP页面都可以获取到声明的对象或者变量--%>
${}<%--用于输出变量或者对象例如:${i}--%>
2.3、JSP的指令
<%@ page args....%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--格式(一般在最开始的时候去声明)--%>
<%@ page/include>
例子:显示将所有网页中共有的元素
<%--<%@include file>是将两个页面合二为一--%>
<%@include file="commen/header.jsp"%>
<h1>网页主体</h1>
<%@include file="commen/footer.jsp"%>
<hr>
另一种写法
<%--<jsp:include page则是拼接页面,本质他们还是三个页面--%>
<jsp:include page="commen/header.jsp"></jsp:include>
<h1>网页主体</h1>
<jsp:include page="commen/footer.jsp"></jsp:include>
下面这种更灵活,可以随意在其他共有部分去做修改而不会影响到主体内容
2.4、9大内置对象
-
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无法打印了
2.5、JSP标签、JSTL标签、EL表达式
要用jstl需要导入jar包 搜索JSTl maven下载JSTL-api
<!-- jstl的依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2-rev-1</version>
</dependency>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式${}
- 可以输出变量或者对象
- 可以执行运算
- 获取web开发中的对象
Jsp的一些标签
<%--localhost:8080/jsptag.jsp?name=you&age=23--%>
<%--相当于转发之后携带了参数--%>
<jsp:forward page="jsptag2.jsp">
<jsp:param name="name" value="you"></jsp:param>
<jsp:param name="age" value="23"></jsp:param>
</jsp:forward>
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" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
<%--
EL表达式获取表单的数据
${parm.参数名}
--%>
<input type="text"name="username"value="${param.username}">
<input type="submit"value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>
<c:out value="管理员欢迎你"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
<c:if test="${param.username=='admin'}" var="isAdmin">
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>
c:when
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个标签叫score 并且给它赋值--%>
<c:set var="score" value="85"></c:set>
<c:choose>
<c:when test="${score >= 90}">
你的成绩良好
</c:when>
<c:when test="${score >= 80}">
你的成绩一般 ${score}
</c:when>
</c:choose>
</body>
</html>
<c:choose>
<c:when test="${score >= 90}">
你的成绩良好
</c:when>
<c:when test="${score >= 80}">
你的成绩一般 ${score}
</c:when>
</c:choose>
类似于switch
c:foreach
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个字符串数组存储数据--%>
<%
ArrayList<String> 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 默认
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
<c:out value="${people}"></c:out>
</c:forEach>
</body>
</html>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
<c:out value="${people}"></c:out>
</c:forEach>
<%--
var,每一次遍历出来的变量,相当于
for (String person : people) {
}
items,要遍历的变量
begin=""从哪里开始遍历 0默认
end=""在哪里结束 last 默认
step="" 遍历步长 1 默认
--%>
3、JavaBean实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字端作映射 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,”湖北)
}