JavaWeb学习Day03(狂神说Java)

7.Cookies,Session

7.1 会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为状态会话

7.2 保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在session中

常见场景:网站登录之后,第二次访问就不需要输入账号和密码

7.3 Cookie

  1. 从请求中拿到cookie信息
  2. 服务器响应客户端(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,对象关系映射

  • 表–>类
  • 字段–>属性
  • 行记录–>对象
idnameageaddress
1秦疆13西安
2秦疆220西安
3秦疆312西安
class people{
    private int id;
    private String name;
    private int id;
    peivate String address;
}
class A{
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值