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

目录
相关文章
|
20小时前
|
存储 Java Spring
<Java EE 进阶> 1.Spring核心思想
<Java EE 进阶> 1.Spring核心思想
3 0
|
3天前
|
存储 Java 数据库
学妹哭着找你教的Javaweb的文件上传与下载
该内容主要介绍了JavaWeb中的文件上传和下载操作。首先,通过一个JSP表单接收用户输入的图书信息和封面照片,表单数据提交给`AddBookServlet`。在Servlet中,使用SmartUpload库处理上传的图片,将图片以书号命名并保存至服务器,同时将图书信息存储到数据库。之后,请求转发到`ShowBook.jsp`展示所添加图书的详细信息。文件下载部分,通过`downServlet`完成,用户点击链接触发下载,Servlet设置响应头以附件形式提供文件下载。
12 1
|
3天前
|
SQL Java 关系型数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
7 0
|
3天前
|
Java
JAVA数据结构刷题 -- 二叉树进阶
JAVA数据结构刷题 -- 二叉树进阶
11 0
|
6天前
|
存储 算法 安全
Java高级进阶面试总结(全面,实时更新)
Java高级进阶面试总结(全面,实时更新)
|
10天前
|
安全 Java API
Java进阶-Java Stream API详解与使用
效、更易于维护的代码,同时享受到函数式编程带来的好处。
24 2
|
11天前
|
Dubbo Java 应用服务中间件
Java外包是如何进入阿里的熬夜整理出Java后端学习路线
Java外包是如何进入阿里的熬夜整理出Java后端学习路线
|
13天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
17 0
|
13天前
|
Java 程序员 应用服务中间件
JavaWeb之过滤器(Filter)与监听器(Listener)
本文介绍了JavaWeb中的过滤器(Filter)和监听器(Listener)概念及其使用。过滤器主要用于拦截和处理Web资源请求,如进行编码设置、权限验证等,它在Servlet之前和之后执行。监听器则监听域对象(如ServletRequest、HttpSession、ServletContext)状态变化,分为创建/销毁监听和属性变化监听。监听器在Web.xml中注册后会在相应事件发生时自动执行,例如用于统计网站访问人数或初始化配置。
|
13天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。