Java后端进阶之路: JavaWeb(三)

简介: Java后端进阶之路: JavaWeb

Java后端进阶之路: JavaWeb(二)https://developer.aliyun.com/article/1469548


7.cookie,session

7.1会话

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

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

如何证明你是学生?

对象: 你   学校

  1. 发票  学校给你的发票
  2. 学校登记   学校标记你来过了

一个网站怎么证明你来过?

客户端    服务器

  1. 服务器给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
  2. 服务器登记你来过了,下次你来的时候匹配你;session

7.2保存会话的两种技术

cookie

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

session

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

常见场景:网站登录之后你下次不用在登录了,第二次访问直接就上去了

7.3Cookie

  1. 从请求中拿到cookie信息,
  2. 服务器响应给客户端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)
  1. 判断请求
  2. 内置一些对象
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//响应


  1. 输出页面前增加的代码
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;


  1. 以上这些对象可以直接在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

目录
相关文章
|
19天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
33 0
|
1月前
|
Web App开发 SQL Java
javaweb实现分页(二)
javaweb实现分页(二)
19 1
|
21天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
3天前
|
Java API 调度
[AIGC] 深入理解Java并发编程:从入门到进阶
[AIGC] 深入理解Java并发编程:从入门到进阶
|
30天前
|
SQL 前端开发 Java
Java后端进阶之路: JavaWeb(四)
Java后端进阶之路: JavaWeb
33 1
|
18天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
1月前
|
JSON 前端开发 Java
layui上传图片,前端直接拷代码,后端……
layui上传图片,前端直接拷代码,后端……
30 0
|
1月前
|
前端开发
前端接受后端文件流并下载到本地的方法
前端接受后端文件流并下载到本地的方法
60 0
|
1月前
|
存储 前端开发 JavaScript
从前端到后端,探索现代Web开发技术
本文探索了现代Web开发技术的各个方面,包括前端和后端开发以及多种编程语言的应用。通过对JavaScript、Java、Python、C、PHP和Go等语言的介绍,深入探讨了前端和后端开发的基本原理和常用工具。同时,还涵盖了数据库技术在Web开发中的重要性和应用场景。无论你是初学者还是有经验的开发者,本文都能为你提供全面的视角和实用的知识,帮助你在Web开发领域取得更好的成果。
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。