JavaWeb 2021-11-04

基本概念

1.1 前言

web:

  1. 静态web:

    • html,css
    • 提供给所有人看的数据始终不会发生变化
  2. 动态web:

    • 几乎所有的网站

    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!

    • 技术栈:Servlet/JSP,ASP,PHP

    在Java中,动态web资源开发的技术统称为JavaWeb;

1.2 web应用程序

web应用程序,可以提供游览器访问的程序

  • a.html,b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务
  • 我们能访问的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上
  • URL:
  • 这个统一的web资源会被放在同一个文件夹下,web应用程序—>Tomcat:服务器
  • 一个web应用由多部分组成(静态web,动态web)
    • html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)

web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理

1.3 静态web

  • *.html,网页的后缀,如果服务器上一直存在这些东西,我们就可以一直读取,通络。
  • 缺点:
    • web页面无法动态更新,所有的用户看到的都是同一个页面
    • 无法和数据库交互(数据无法持久化,用户无法交互)

1.4 动态web

  • 页面会动态展示:“web的页面展示的效果因人而异”
  • 缺点:
    • 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布(停机维护);
  • 优点
    • Web页面可以动态更新,所有用户看到的都不是同一个页面
    • 可以与数据库交互(数据持久化)

web服务器

2.1 技术讲解

ASP:

  • 微软:国内最早流行的就是ASP;
  • 在html中嵌入VB的脚本,ASP+COM;
  • 在ASP开发中,基于一个页面都有几千行代码,页面及其紊乱;
  • 维护成本高;
  • C#
  • IIS

PHP:

  • PHP开发速度很快,功能很强大,跨平台,代码简单(国内70%,WP)
  • 缺点:
    • 无法承载大访问量的情况(局限性)

JSP/Servlt:

B/S:游览和服务器

C/S:客户端和服务器

  • sun公司主推的B/S架构
  • 基于Java语言的(所有的大公司,或者一些开源的组件,都是Java写的)
  • 可以承载三高问题带来的影响(三高:高并发,高性能,高可用)
  • 语法像ASP,ASP–>JSP,加强市场强度

2.2 web服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些相应信息;

IIS:

  • 微软的,Windows自带的;

Tomcat:


  • 服务器:安装了服务器软件的计算机
  • 服务器软件:接受用户的请求,处理请求,做出相应
  • web服务器软件:接受用户的请求,做出相应
    • 在web服务器软件中,可以部署web项目,让用户通过游览器来访问这些项目

面试题

请你谈谈网站如何进行访问的?

  1. 输入一个域名,回车;

  2. 检查本机的‪C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

    1. 有:直接返回对应的ip地址,这个地址中,有我们需要的web程序,可以直接访问

      ​ 127.0.0.1 localhost

    2. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到

      (DNS:全世界的域名都在这里管理)


HTTP

3.1 什么是HTTP

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:HTTP,字符串
  • 超文本:图片,音乐,定位,地图…
  • 默认端口(80)

HTTPS

  • 默认端口(443)

3.2 两个时代

  • HTTP1.0

    • HTTP/1.0:客户端可以与web服务器连接,只能获得一个web资源,断开连接
  • HTTP2.0

    • HTTPS/1.1:客户端可以与web服务器连接,只能获得多个web资源。

3.3 HTTP请求

  • 客户端—发请求(Request)----服务器

百度:

请求网址: https://www.baidu.com/
请求方法: GET
状态代码: 200 OK
远程地址: 110.242.68.3:443
引荐来源网址政策: strict-origin-when-cross-origin
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive

3.3.1. 请求行

  • 请求行中的请求方式:GET
  • 请求方式:Get,Post,HEAD,DELETE
    • get:请求能够携带的参数比较少,大小有限制,会在游览器的URL地址栏显示的数据内容,不安全,但高效
    • post:请求能够携带的参数没有限制,大小没有限制,不会在游览器的URL地址栏显示的数据内容,安全,但不高效

3.3.2. 消息头

Accept:	告诉游览器所支持的数据类型
Accept-Encoding:	支持哪种编码格式	GBK	UTF-8	GB2312	ISO-8859-1
Accept-Language:	告诉游览器的语言环境
Cache-Control:	控制缓存控制
Connection:	告诉游览器,请求是断开还是保持连接
Host:	主机

3.4 HTTP响应

  • 服务器—相应—客户端
Cache-Control: private	//缓存控制
Connection: keep-alive	//连接
Content-Encoding: gzip	//编码
Content-Type: text/html;	//类型

3.4.1 响应体

Accept:	告诉游览器所支持的数据类型
Accept-Encoding:	支持哪种编码格式	GBK	UTF-8	GB2312	ISO-8859-1
Accept-Language:	告诉游览器的语言环境
Cache-Control:	控制缓存控制
Connection:	告诉游览器,请求是断开还是保持连接
Host:	主机
Refrush:	告诉客户端,多久刷新一次
Location:	让网页重新定位

3.4.2 响应状态码

200:响应成功

3***:请求重定向

  • 重定向:重新到我给你的新位置去;

4.4:找不到资源 404

  • 资源不存在

5**:服务器代码错误 500 502:网关错误

面试题:

当你的游览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?

部署项目的方式

  1. 直接将项目放到webapps目录下即可

    简化部署:将项目打成一个war包,将war包放置到webapps目录下,war包会自动解压

  2. 配置conf/server.xml文件

    在标签体中配置

    dacBase:项目存放的路径

    path:虚拟目录


Maven

  1. 在Javaweb开发中,需要大量的jar包,我们手动去导入
  2. Maven能自动帮助导入 和配置jar包

4.1 Maven项目架构管理工具

Maven的核心思想:约定大于配置

  • 有约束,不要去违反。

Maven会规定好如何去编写我们的Java代码,必须按照这个归档来。


Servlet

  • servlet(接口),如果想开发一个servlet程序,只需完成两个步骤
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器中

把实现了Servlet接口的Java程序叫做Servlet叫做Servlet

基本实现关系

Servlet接口

​ ⬇

GenercServlet类:通用的Servlet,是一个与协议无关的Servlet

​ ⬇

HttpServlet类: Http专用的Servlet

关系实现的概述

​ HttpServlet是一个与协议相关的Servlet,是专门用来处理HTTP协议的请求。通常编写一个Servlet一般都会让这个Servlet继承HttpServlet重写service方法

在service方法内部根据请求方式不同执行 不同的doXXX的方法(get请求执行deGet方法,如果是post请求就会执行doPost方法)

所以往往继承HttpServlet之后就不需要重写service方法,只需要重写doGet和doPost方法。往往请求需要处理的内容的代码是一致的,所以需要让doGet和doPost相互调用,可以简化编程。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Demo03</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置Servlet -->
  <servlet>
    <!-- 配置Servlet的名称 -->
    <servlet-name>DemoServlet</servlet-name>
    <!-- 配置Servlet类的全路径 -->
    <servlet-class>com.imnu.servlet.DemoServlet</servlet-class>
  </servlet>
  <!-- 配置Servlet的映射 -->
  <servlet-mapping>
    <!-- 配置Servlet的名称 -->
    <servlet-name>DemoServlet</servlet-name>
      <!-- 配置访问路径 -->
    <url-pattern>/DemoServlet.html</url-pattern>
  </servlet-mapping>
</web-app>
public class DemoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public DemoServlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().print("XXXXXX");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

生命周期

​ 一个对象从创建到销毁的过程。

Servlet的生命周期

​ servle对象从创建到销毁的过程

  • servlet从何时创建又是核实销毁的?
    • Servlet中有init,service,destroy方法,这几个方法称为Servlet生命周期相关的方法。
    • Servle是在第一次被访问的时候会被实例化,只要Servlet已被实例化,那么Servlet中的init方法就会执行(init只会被执行一次)。任何一次从客户端发送来的请求,那么Servlet中的Service方法就会被执行(在service方法的内部根据请求方式的不同调用不同doXXX方法)。当servlet从服务器移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾就会将其回收掉。

Servlet启动时加载

为什么使用启动时加载?

​ Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?

什么是启动时加载?

​ Servlet默认是在第一次访问的时候创建对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet对象)。如果现在这样做,那么之前我们花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1E42zWi-1636039100994)(C:\Users\Z\AppData\Roaming\Typora\typora-user-images\image-20211022201737227.png)]


Servlet的访问路径的配置

Servlet中的urlPattern的配置

配置方式

  • 完全路径匹配

    • 以/开始
      • 比如:/ServletDemo,/aaa
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpGTVoPf-1636039100996)(C:\Users\Z\AppData\Roaming\Typora\typora-user-images\image-20211022202742320.png)]

  • 目录匹配

    • 以/开始,以/*结束
      • 比如:/aaa/*
  • <url-pattern>/aaa/*</url-pattern>
    //以aaa开头
    
  • 拓展名匹配

    • 不能以/开始,以*开始
      • 比如:*.do
  • <url-pattern>*.abc</url-pattern>
    //以abc结尾访问优先级
    

访问优先级

​ 完全路径匹配 > 目录匹配 > 扩展名匹配


ServletConfig对象

​ 用来获得Servlet相关的配置的对象。

获得ServletConfig对象

getServletContext():

方法

实现

ServletConfig config=this.getServletConfig();
		//1.获得初始化参数:
		String username=config.getInitParameter("username");
		String password=config.getInitParameter("password");
		System.out.println("用户名:"+username);
		System.out.println("密码:"+password);
		//2.获得所有初始化参数的名称:
		Enumeration<String> names = config.getInitParameterNames();
		while(names.hasMoreElements()){	//判断是否有值;
			String name=names.nextElement();	
			String value=config.getInitParameter(name);
			System.out.println(name+":"+value);
		}
		//3.获得Servlet的名称
		String servletName = config.getServletName();
		System.out.println(servletName);

配置

<servlet>
		<servlet-name>DemoServlet01</servlet-name>
		<servlet-class>com.imnu.servlet.DemoServlet</servlet-class>
		<init-param>
			<param-name>username</param-name>
			<param-value>Lu</param-value>
		</init-param>
		<init-param>
			<param-name>password</param-name>
			<param-value>123</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>DemoServlet01</servlet-name>
		<url-pattern>/No</url-pattern>
	</servlet-mapping>

ServletContext对象

ServletContext对象概述

什么是ServletContext对象?

​ ServletContext:Servlet的上下文对象。ServletContext对象对Servlet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为 每个web项目创建单独的ServletContext对象。

作用

①:用来获取web项目信息

​ 因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的。

方法
  • 获取文件的MIME类型:(文件上传或者下载时)
    • 测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2D0uez8u-1636039100998)(C:\Users\Z\AppData\Roaming\Typora\typora-user-images\image-20211023001139314.png)]

  • 获取web项目请求的工程名:
    • 测试
  • 获取web项目的初始化参数
    • 测试
    • 配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>Demo05</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 全局初始化参数的配置 -->
  <context-param>
  	<param-name>LLLL</param-name>
  	<param-value>789</param-value>
  </context-param>
  <context-param>
  	<param-name>UUU</param-name>
  	<param-value>456</param-value>
  </context-param>
  <servlet>
		<servlet-name>DemoServlet</servlet-name>
		<servlet-class>com.imnu.servlet.TestServlet</servlet-class>
		<init-param>
			<param-name>zzz</param-name>
			<param-value>123</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>DemoServlet</servlet-name>
		<url-pattern>/No</url-pattern>
	</servlet-mapping>
</web-app>

②:读取web项目下的文件

​ 之前使用IO流读取文件(Java项目)。现在是一个web项目,web项目需要发布到tomcat下才能访问。获取web项目下的文件如果使用传统的IO就会出现问题(原因:路径中使用的是相对路径,相对的是dre的环境)。

String path=this.getServletContext().getRealPath("文件的位置");
InputStream is =new FileInputStream(path);
properties.load(is);

③:作为域对象存储数据

域对象:是将数据存入到域对象中,这个数据将会有一定的作用范围

​ (域:指的是有一定的作用范围)

方法
  • 存入数据的方法
image-20211023205535557
  • 获取数据的方法
image-20211023205647842
  • 移除数据的方法
image-20211023205721375
作为域对象的作用范围

​ ServletContext实在服务器启动的时候为每个web项目单独创建ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。向ServletContext中保存的数据会一直存在(当服务器关闭的时候ServletContext对象会被销毁,然后里面的数据才会失效)。

范围:整个web应用

代码演示
public class DemoServlet07 extends HttpServlet {
	@Override
	public void init() throws ServletException {
		this.getServletContext().setAttribute("name", "张三");
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name=(String) this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
public class DemoServlety071 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = (String)this.getServletContext().getAttribute("name");
		System.out.println("姓名:"+name);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

请求:游览器→服务器

响应:服务器→游览器


Response

什么是Response?

​ 开发的软件是B/S结构的软件,可以通过游览器访问服务器的软件,从游览器输入一个网址访问服务器(这个过程称为是请求)。服务器接收到请求,需要进行处理,处理以后需要将处理结果显示回游览器端(将这个过程称为是响应)。

Response对象的API

关于响应行的方法

  • 设置相应的状态码:
    • 200:成功
    • 302:重定向
    • 304:查找本地缓存
    • 404:请求资源不存在
    • 500:服务器内部错误

关于响应头的方法

  • set开头的方法:针对一个key对应一个value的情况。
    • 举例:比如有一个头 content-Type:text/html setHeader(“content-Type”,“text/plain”);
    • 最终得到头的结果:content-Type:text/plain
  • add开头的方法:针对一个key对应多个value的情况。
    • 举例:比如有一个头 content-Type:text/html addHeader(“content-Type”,“text/plain”);
    • 最终得到头的结果:content-Type:text/plain,text/plain

关于响应体的方法

关于Sesponse其他API

  • 重定向的方法
  • 设置游览器打开页面时采用的字符集
  • 服务器向游览器回写Cookie

API代码演示

完成重定向

重定向:302状态码和Location响应头结合使用的结果。

  • 实际开发中可以使用Response.sendRedirect(“路径”);

    (替换重定向两句写法)

完成定时刷新
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;	charset=utf-8");	//设置字符集;
		response.getWriter().print("5s后跳转百度!!!!");
		//定时刷新
		response.setHeader("Refresh", "5;url=http://www.baidu.com");
	}

页面定时跳转的拓展

在html中完成页面跳转
使用JS完成读秒效果

(了解)

向页面响应中文

使用字节流响应中文

  • 编写代码

​ 使用上述代码向页面输出中文是否会有乱码 ?

  • 不确定

    • 其实乱码的产生与中文转成字节数组以及游览器打开的方式(打开的时候采用的默认字符集)有关
  • 解决:

    • 将中文转成字节数组的时候和游览器默认打开的时候采用的字符集一致即可。
public class Demo03 extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//使用字节流的方式输出中文
		ServletOutputStream outputStream = response.getOutputStream();
		//设置游览器默认打开的时候采用的字符集
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		//设置中文 转成字节数组字符集编码
		outputStream.write("中文".getBytes("UTF-8"));	
	}

使用字符流响应中文

  • 编写代码

​ 使用上述代码向页面输出中文是否会有乱码 ?

  • 一定会产生乱码
    • 原因:字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。这个字符集不支持中文。
  • 解决:
    • 设置response获得字符流缓冲区的编码和设置游览器默认打开时侯采用的字符集一直即可。
private void test02(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
		//设置游览器默认打开的时候采用的字符集
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		//设置response获得字符流缓冲区的编码
		response.setCharacterEncoding("UTF-8");
		response.getWriter().print("中文");
	}
  • 简化方法
private void test02(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
		response.setContentType("text/html;	charset=utf-8");
		response.getWriter().print("中文");
	}

Request

什么是Request对象?

​ 开发的软件是B/S结构的软,可以通过游览器提交一些数据,将这些内容进行封装,就封装成了一个请求对象(Request对象)。

Request对象的API

获得客户端的信息

  • 获得请求的方式
  • 获得请求路径后的提交参数的字符串
  • 获得请求路径的URI
  • 获得客户端的IP地址

获得请求头的方法

  • 获得一个key对应一个value的请求。
  • 获得一个key对应多个value的请求。

获得请求参数的方法

  • 获得提交的参数(一个name对应一个value)。
  • 获得提交的参数(一个name对应多个value)。
getParameterMap();
  • 获得提交的参数,将提交的参数的名称和对应的值存入到一个Map集合中。

Request作为域对象存储数据的方法

  • 向request域中存数据
  • 从request域中获取数据
  • 从request域中删除数据

API代码演示

Request对象获得客户机信息
Request对象获得请求头信息

接受表单请求参数

  • 编写静态页面

  • <body>
    <h1>表单接受参数</h1>
    <form action="/Demo10/Demo01" method="get">
    	用户名:<input type="text" name="username"/><br/>
    	密码:<input type="password" name="password"/><br/>
    	性别:<input type="radio" name="sex" value="man"/><input type="radio" name="sex" value="woman"/><br/>
    	籍贯:<select name="city">
    		 <option value="beijing">北京市</option>
    		 <option value="shanghai">上海市</option>
    		 <option value="shenzhen">深圳市</option>
    	</select><br/>
    	爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
    		 <input type="checkbox" name="hobby" value="football"/>足球
    		 <input type="checkbox" name="hobby" value="volleyball"/>排球<br/>
    	自我介绍:<textarea name="info" rows="" cols=""></textarea><br/>
    	<input type="submit" value="提交">
    </form>
    </body>
    
  • 编写代码

  • public class Demo01 extends HttpServlet {
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		// String username = request.getParameter("username");
    		// String password = request.getParameter("password");
    		// System.out.println("用户名:"+username+"---密码:"+password);
    		// String sex = request.getParameter("sex");
    		// String city = request.getParameter("city");
    		// System.out.println("性别:"+sex+"---籍贯:"+city);
    		// String[] hobbys = request.getParameterValues("hobby");
    		// System.out.println("爱好:"+Arrays.toString(hobbys));
    		// String info=request.getParameter("info");
    		// System.out.println("自我介绍:"+info);
    
    		// 使用getParameterMap()接收数据
    		Map<String, String[]> map = request.getParameterMap();
    		for (String key : map.keySet()) {
    			String[] value = map.get(key);
    			System.out.println(key + "-" + Arrays.toString(value));
    		}
    	}
    

使用Request接受中文数据

Post方式接受中文

  • 原因:

    • post方式提交的数据是在请求体中,request对象接收到数据之后,放入request的缓冲区中。
    • 缓冲器有默认编码(默认ISO-8859-1):不支持中文
  • 解决方案:

    • 将request的缓冲区的编码修改
  • 代码:

  • request.setCharacterEncoding("UTF-8");
    String name=request.getParameter("name");
    System.out.println("姓名:"+name);
    

Get方式接受中文

  • 原因

    • get方式提交的数据在请求行中的url后面,在地址栏上其实就已将进行了一次URL的编码了。
  • 解决方案:

    • 将存入到request缓冲区中的值以ISO-8859-1的方式获取到,以UTF-8的方式进行编码。
  • 代码:

  • String name=request.getParameter("name");
    String value = new String(name.getBytes("ISO-8859-1"),"UTF-8");
    System.out.println("姓名:"+value);
    

会话技术

什么是会话:

​ 会话简单理解为:用户打开一个游览器,点击多个超链接访问服务器的web资源,然后关闭游览器,整个过程称为一次会话。

为什么要学会话:

​ 每个用户与服务器进行交互的过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。

image-20211029172429792

分类

1.Cookie技术

Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自的游览器中。当用户使用游览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。

image-20211029172504080
  1. 从请求中拿到cookie的信息
  2. 从服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();    //获得cookie
cookie.getName()//获得cookie中的key
cookie.getValue()//获得cookie中的value
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");	//新建一个cookie
cookie.setMaxAge(24*60*60);		//设置cookie的有效期
resp.addCookie(cookie);		//响应给客户端
    1. 一个cookie只能保存一个信息
    1. 一个web站点可以给游览器发送多个cookie,最多存放20个cookie
    1. cookie大小有限制,数量也有限制
删除cookie:
  • 不设置有效期,关闭游览器,自动失效
  • 设置有效时间为0
编码解码:
URLEncoder.encode("xxx","UTF-8")
URLEncoder.encode(cookie.getValue(), "UTF-8")
Cookie的简单使用
获得从游览器带过来的Cookie

​ 通过HttpServletRequest对象中的方法:

image-20211029174525263
向游览器回写Cookie

​ 通过HttpServletResponse对象中的方法:

image-20211029174705719
Cookie的构造
image-20211029174816077

2.Session技术(重点)

Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的游览器创建一个独享的session对象。由于session为用户游览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他的web资源再从用户各自的session中取出数据为用户服务。

image-20211029172538982

Session和Cookie的区别

  • Cookie是把用户的数据写给用户的游览器,游览器保存。(可以保存多个)

  • Session把用户的数据写到用户独占的Session中,服务器端保存。(保存重要的信息,减少服务器资源的浪费)

  • Session对象由服务创建

使用场景:
  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将他保存在Session中

JSP

​ Java服务端页面,也和Servlet一样,用于动态Web技术!

最大的特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

JSP原理

游览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!

//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPServier
public abstract void _jspService(HttpServletRequest var1, HttpServletResponse var2) 

  1. 判断请求

  2. 内置一些对象

    • 页面上下文
    • session
    • applicationContext
    • config
    • out
    • page:当前页
    • 请求和相应
  3. 输出页面前增加的代码

  4. .以上的这些对象,我们可以在JSP页面直接使用!

JSP基础语法

​ 任何语言都有自己的语法,Java有。JSP作为Java技术的一种应用,他拥有一些自己扩充的语法。(了解)Java所有语法都支持。

JSP表达式

<%--JSP表达式
    作用:用来将程序的输出,输出到客户端
    <%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>

JSP脚本片段

<%--jsp脚本片段--%>
<%
int sum=0;
for (int i = 1; i <=1000; i++) {
    sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>

JSP声明

<%!
    static {
        System.out.println("Loading Servlet!");
    }
    
    private int globalVar=0;
    
    public void Lu(){
        System.out.println("进入方法LU!");
    }
%>

JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生到_jspService方法中!

在JSP嵌入Java即可。

JSP指令

指令描述
<%@ page … %>定义网页依赖属性,比如error页面
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义
Page指令
<%@ page attribute="value" %>

等价的XML格式:

<jsp:directive.page attribute="value" />

相关属性:

属性描述
buffer指定out对象使用缓冲区的大小
autoFlush控制out对象的 缓存区
contentType指定当前JSP页面的MIME类型和字符编码
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends指定servlet从哪一个类继承
import导入要使用的Java类
info定义JSP页面的描述信息
isThreadSafe指定对JSP页面的访问是否为线程安全
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session
isELIgnored指定是否执行EL表达式
isScriptingEnabled确定脚本元素能否被使用
Include指令
<%@ include file="文件相对 url 地址" %>

等价的XML语法:

<jsp:directive.include file="文件相对 url 地址" />
Taglib指令
<%@ taglib uri="uri" prefix="prefixOfTag" %>

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:

<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值