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

目录
相关文章
|
12天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
27 2
|
3天前
|
消息中间件 缓存 Java
如何优化大型Java后端系统的性能:从代码到架构
当面对大型Java后端系统时,性能优化不仅仅是简单地提高代码效率或硬件资源的投入,而是涉及到多层次的技术策略。本篇文章将从代码层面的优化到系统架构的调整,详细探讨如何通过多种方式来提升Java后端系统的性能。通过对常见问题的深入分析和实际案例的分享,我们将探索有效的性能优化策略,帮助开发者构建更高效、更可靠的后端系统。
|
7天前
|
前端开发 JavaScript Java
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
|
2月前
|
Java Perl
Java进阶之正则表达式
【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。
19 4
|
2月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
19 4
|
2月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
20 3
|
2月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
18 2
|
2月前
|
Java 编译器 API
Java进阶之标准注解
【7月更文挑战第15天】Java标准注解包括标记注解(如@Deprecated)、@Override(检查方法重写)、@SuppressWarnings(抑制警告)。多值注解如@RequestMapping在Spring中用于HTTP请求映射。元注解如@Retention控制注解保留策略,@Target指定应用位置。Java8引入类型注解(@FunctionalInterface、@SafeVarargs)和重复注解(@Repeatable)。自定义注解可通过反射读取,如示例中的MyMarkerAnnotation等。
19 2
|
2月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
29 6
|
2月前
|
Java 编译器 API
Java进阶之标准注解
Java进阶之标准注解
22 1

热门文章

最新文章

下一篇
云函数