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

目录
相关文章
|
26天前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
92 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
18天前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
54 12
|
18天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
24 5
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
334 37
|
18天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
15 1
|
19天前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
29 2
|
18天前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
32 1
|
18天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
66 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
26天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
29 5
|
26天前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
178 1