Java后端进阶之路: JavaWeb(二)https://developer.aliyun.com/article/1469548
7.cookie,session
7.1会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个同学来过教室,下次再来教师,我们会知道这个同学之前来过教师,称之为有状态会话
如何证明你是学生?
对象: 你 学校
- 发票 学校给你的发票
- 学校登记 学校标记你来过了
一个网站怎么证明你来过?
客户端 服务器
- 服务器给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
- 服务器登记你来过了,下次你来的时候匹配你;session
7.2保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务器技术利用这个技术,我们呢可以保存用户的会话信息,我们可以把信息或者数据放在session中
常见场景:网站登录之后你下次不用在登录了,第二次访问直接就上去了
7.3Cookie
- 从请求中拿到cookie信息,
- 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//返回数组说明cookie存在多个 cookie.getName()//获取cookie的名字 cookie.getValue()//获得cookie中的value new Cookie()//设置cookie的有效期 cookie.setMaxAge(24*60*60);//设置有效期 resp.addCookie(cookie)//响应给客户端一个cookie
cookie:一般会存在本地的用户目录下appdata:
一个网站的cookie是否存在上线,细节问题
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器多个cookie,最多存放20个cookie
- Cookie的大小有限制
- 300个cookie浏览器上限
删除cookie
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效时间为0
编码解码:
URLDecoder.decode(cookie.getValue(),"utf-8")//解码 URLEncoder.encode("请将","utf-8")//编码
7.4session(重点)
什么是session:
- 服务器会给每一个用户(浏览器)创建一个session
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登陆之后,整个网站都可以访问 -->保存用户信息,保存购物车信息
<!-- 设置session默认的失效时间--> <session-config> <!--15分钟后session自动失效--> <session-timeout>15</session-timeout> </session-config>
session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占的session中,服务器端保存(保存重要的消息,减少服务器资源的浪费)
- session对象由服务器创建
使用场景:
- 保存一个用户登陆的信息
- 购物车信息;
- 在整个网站中经常会使用的数据
//创建session package com.hyc.servlet; import com.hyc.pojo.persion; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; public class sessionDemo extends HttpServlet { @Override 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"); HttpSession session = req.getSession(); session.setAttribute("name",new persion("hyc",12)) ; String id = session.getId(); if (session.isNew()) { resp.getWriter().write("session创建成功:"+ id); }else { resp.getWriter().write("session已经在服务器存在了:"+id); } //session的创建的时做了什么事情 Cookie cookie = new Cookie("JSESSIONID",id); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } //拿到session package com.hyc.servlet; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; import com.hyc.pojo.persion; public class sessionDemo02 extends HttpServlet { @Override 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"); HttpSession session = req.getSession(); persion name = (persion) session.getAttribute("name"); System.out.println(name.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } //删除和注销session package com.hyc.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 doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name"); //手动注销session session.invalidate(); } }
8.JSP
8.1 什么是jsp
java Server pages:java服务器端页面,也和servlet一样,用于开发动态web
最大的特点:
- 写jsp就像是写html
- 区别:
- HTML只给用户提供静态的数据
- jsp页面中可以嵌入java代码,为用户提供动态数据
- jsp九个内置对象
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web应用的配置对象;
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象。
8.2jsp原理
思路:jsp到底如何执行
- 代码层面没有任何问题
- 服务器内部工作
tomcat中有一个work目录
idea中使用tomcat的话会在idea的tomcat生成一个work目录
C:\Users\doomwstcher\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\javaweb_session_cookie_war\org\apache\jsp
发现页面转变成了java程序
浏览器向服务器发送请求。不管访问什么资源,其实都是在访问servlet!
jsp最终也会被转换成为一个jsp类
jsp本质是一个servlet
//初始化 public void _jspInit() { } //销毁 public void _jspDestroy() { } //jsp的service public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
- 判断请求
- 内置一些对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文 javax.servlet.http.HttpSession session = null;//session final javax.servlet.ServletContext application;//applicationcontext final javax.servlet.ServletConfig config;//配置 javax.servlet.jsp.JspWriter out = null;//out final java.lang.Object page = this;//当前 javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; HttpServletRequest//请求 HttpServletResponse//响应
- 输出页面前增加的代码
response.setContentType("text/html");//设置相应页面类型 pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
- 以上这些对象可以直接在jsp中使用
在jsp页面中:
只要是java代码就会原封不动的输出,
如果是html代码就会被转换为 out.write("\r\n");这样的格式输出到前端
8.3JSP基础语法
任何语言都有自己的语法,java中有。。,jsp作为java技术的一种应用,他拥有一些自己的扩充的语法(了解,知道即可),java的所有语法他都支持!
JSP表达式
<%-- JSP表达式 作用:用来将程序的输出结果,输出到客户端 <%=变量或者表达式%> --%>
JSP脚本片段
<% int sun=0; for (int i = 0; i <5 ; i++) { sun+=i; } out.print("<h1>sun="+sun+"</h1>"); %>
脚本片段的再实现
<%-- 在代码中嵌入html元素--%> <% for (int i = 0; i <5 ; i++) { %> <h1>狂神<%= i%></h1> <% } %>
jsp声明
<%! static { System.out.println("loading Servlet!"); } private int var = 0; public void hu(){ System.out.println("进入了方法hu"); } %>
JSP声明:会变一到JSP生成java的类中!其他的,就会被生成到 _jspService方法中,在jsp中嵌入java代码即可!
<%%>片段 <=%%>表达式 <%!%>定义全局方法 <%--注释--%>
JSP的注释,不会在客户端显示,html就会!
8.4JSP指令
<%@%> <%@include file=""%>包含文件
JSP标签
<%@ include file="common/HEADER.jsp"%> <h1>我是主题页面</h1> <%@ include file="common/footer.jsp"%> <%--jsp标签--%> <jsp:include page="common/HEADER.jsp"/> <h1>我是第二个</h1> <jsp:include page="common/footer.jsp"/>
<%--@ include会将两个页面合二为一--%> <%@ include file="common/HEADER.jsp"%> <h1>我是主题页面</h1> <%@ include file="common/footer.jsp"%> <%--jsp标签 jsp:include;拼接页面,本质是三个页面 --%> <jsp:include page="common/HEADER.jsp"/> <h1>我是第二个</h1> <jsp:include page="common/footer.jsp"/>
8.5九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【ServletContext】存东西
- config 【ServletConfig】
- page 几乎不用
- execption 和java异常一样
pageContext.setAttribute("name1","h1");//保存的数据只在一个页面中有效 request.setAttribute("name2","h2");//保存的数据在一次请求中有效,请求转发会携带这个数据 session.setAttribute("name3","h3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name4","h4");//保存数据只在服务器中有效,从打开服务器到关闭服务器 %>
request : 客户端向服务器发送请求,产生的数据,用户看完就没用管理,比如:新闻、用户看完就没用的
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
8.6、JSP标签,JSTL标签,EL表达式
<!-- 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> <!-- https://mvnrepository.com/artifact/taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
**EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
- 调用java方法
JSP标签
<%--<jsp:include>--%> <jsp:forward page="/jsptag2.jsp"> <jsp:param name="name" value="kuangshen"/> <jsp:param name="age" value="18"/> </jsp:forward>
JSTL标签
JSTL标签库的使用就是为了弥补HTML标签的不足;
它自定义了许多的标签,可以供我们使用,标签的功能和java代码的一样
核心标签(要求掌握部分即可)
JSTL标签使用步骤:
- 引入对应的taglib
- 使用其中的方法
- 在tomcat中也需要引入jstl的包否则会报错,jstl解析错误
c:if
<h4> if测试 </h4> <hr> <form action="coreif.jsp" method="get"> <%-- el表达式获取表单中的数据 ${parom.参数} --%> <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="${param.username}"></c:out>
c:choose
<c:set var="score" value="91"/> <c:choose> <c:when test="${score>90}">你的成绩还行</c:when> <c:when test="${score>80}">你的成绩不行</c:when> <c:when test="${score>60}">你退学吧</c:when> </c:choose>
c:foreach
<c:forEach var="people" items="${list}" > <c:out value="${people}"></c:out><br> </c:forEach> <hr> <c:forEach var="people" items="${list}" begin="1" end="3" step="2"> <c:out value="${people}"></c:out><br> </c:forEach>
格式化标签
SQL标签
XML 标签
9.0、javaBean
实体类
javaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
一般用来和数据库的字段做映射 ORM
ORM:对象关系映射
- 表-->类
- 字段-->属性
- 行记录 ---->对象
people表
id |
name |
age |
address |
1 |
laozi1 |
3 |
深圳 |
2 |
laozi2 |
14 |
深圳 |
3 |
laozi3 |
14 |
深圳 |
class Perple{ private int id; private String name; private int age; private String address; } class a{ new Perple(1,"laozi1",3,"深圳"); new Perple(2,"laozi2",14,"深圳"); new Perple(3,"laozi3",14,"深圳"); }
- 过滤器
- 文件上传
- 邮件发送
- 复习jdbc:如何使用jdbc,增删改查,事务
Java后端进阶之路: JavaWeb(四)https://developer.aliyun.com/article/1469550