文章目录
- Web 的概念
- Web 组成
- 用户通过浏览器请求资源的过程:
- HTML 超文本标记语言
- CSS
- 插入样式表的方法有三种:
- 对象,类,实例
- 一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:
- JavaScript 用法
- 什么是 Java Server Pages?
- JSP 注释
- JSP 的 Java 代码块
- JSP 的声明语句块
- JSP 的表达式块
- JSP 内置对象
- JSP 指令(directive)
- JSP 动作(Action)
- 1、<jsp:include>动作
- forward 动作
- EL 表达式
- JavaBean 规范
- JavaBean 作用
- EL 内置对象
- URI 和 URL 之间的区别
- URI
- URL
- URI 和 URL 之间的区别。
- JSTL
- JSP Standard Tag Library,
- Servlet 生命周期是指,
- Servlet 生命周期方法的执行流程:
- 当 Servlet 实例被创建好后被放在了哪里?web.xml 中 URI 与 Servlet 的映射关系反映到 内存中是以什么形式存在呢?
- 什么是 ServletConfig?
- 什么是 ServletContext?
- 2.1 GenericServlet
- 2.1.2 版本 2-获取 ServletConfig
Web 的概念
Web 是 Internet 上的一种服务,使用超文本技术(Hyper text)将 Internet 上 的资源(文字、图片、声音、视频)以页面的形式表示出来。 Web 是一种分布式的应用框架,基于 Web 的应用典型的是 B/S 架构。
Web 组成
服务器:物理方面指的是存放用户访问的信息资源的远程计算机;软件方面指的是能根据用 户的请求将信息资源传递给用户的应用程序。
客户端:物理设备方面指的是客户所使用的本地计算机;软件方面是指能接收并显示服务器 上传递过来信息资源的应用程序。
用户通过浏览器请求资源的过程:
(1)用户打开 IE 浏览器(FireFox、Chrome、IE、Edge 等浏览器),输入需要请求的 Web 服 务器的 URL 地址。
(2)浏览器会根据 URL 地址找到指定的 Web 服务器,并向其发出请求(request)。
(3)Web 服务器接收到请求,就会做出相应的处理,并生成处理结果。 (4)Web 服务器会把处理后生成的响应结果返回给发出请求的浏览器。 (5)浏览器接收到响应结果后,就会对其结果进行解释,最终将结果以网页的形式展示给 用户。
HTML 超文本标记语言
CSS
CSS(Cascading Style Sheets)称做样式表,或称做层叠样式表。它是一种用来表现 HTML(标准 通用标记语言的一个应用)或 XML(标准通用标记语言的一个子集)等文件样式的计算机语言。 在 HTML 页面中采用 CSS 技术,可以对全站页面有共同属性的布局、字体、颜色、背景和其 他属性实现更加精确的控制。
CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明:
选择器通常是需要改变样式的 HTML 元素。
每条声明由一个属性和一个值组成。
**属性(property)**是设置的样式属性(style attribute)。
每个属性有一个值。属性和值被冒号分开。
插入样式表的方法有三种:
外部样式表(External style sheet)
内部样式表(Internal style sheet)
内联样式(Inline style)
对象,类,实例
对象:编程语言中的对象是一个泛指,万物皆对象(我们所要研究学习以及使用的都是对象)
类:对象的具体细分(按照属性或者特性细分为一些类别)
实例:某一类中具体的事物
一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:
核心(ECMAScript):描述了 JS 的语法和基本对象;
文档对象模型(DOM):处理网页内容的方法和接口;
浏览器对象模型(BOM):与浏览器交互的方法和接口;
JavaScript 用法
HTML 中的脚本必须位于
什么是 Java Server Pages?
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在 HTML 网页中插入 Java 代码。标签通常以<%开头以%>结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。网页开发者们通 过结合 HTML 代码、XHTML 代码、XML 元素以及嵌入 JSP 操作和命令来编写 JSP。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP 标签有多种功能,比如访问数据库、记录用户选择信息、访问 JavaBeans 组件等,还可 以在不同的网页中传递控制信息和共享信息。
JSP 注释
在 JSP 页面中使用注释,可以将要注释的内容使用<%-- --%>
括起来。 当然,在 JSP 页面中也可以使用 HTML 的注释<!-- -->
。 但它们的使用效果是不同的。
(1)HTML 注释会被 JSP 翻译引擎翻译到 Servlet 的 out.write()中;而 JSP 注释则会被 JSP 翻译引擎忽略,在 Servlet 中是看不到的。
(2)在客户端浏览器查看源码时,HTML 注释是可以查看到的;但 JSP 注释在客户端是查 看不到的。
JSP 的 Java 代码块
也称为 JSP 小脚本,是以<% %>
括起来的部分,其中可以编写 Java 代码。 编写在 Java 代码块中的代码,会被 JSP 翻译引擎将其置入到 Servlet 的_jspService()
方法中 作为方法中的 Java 语句出现。所以,其中存放的必须是以分号结尾的 Java 语句。 需要注意的是,JSP 代码块可以放置在 JSP 页面的任意位置,可以放置任意数量。
JSP 的声明语句块
在 JSP 页面中使用<%! %>
括起来的部分,称为声明语句块。声明语句块中的内容,将被 JSP 引擎翻译到 Servlet 的类体中,没有包含到哪个方法体中。
在 JSP 的声明语句块中就可声明实例变量、实例方法、静态方法、静态代码块等内容。 并且,这些内容均可被 JSP 的 Java 代码块中代码访问。因为它们原本就是一个 Servlet 类 中的代码。
需要注意的是,在 JSP 的声明语句块中,是不能编写普通的 Java 语句的。否则的话,这些 语句将会直接出现在 Servlet 的类体中。
声明语句块也可以定义在 JSP 页面的任意位置,且可以定义任意多个。
JSP 的表达式块
在 JSP 页面中使用<%= %>
括起来的部分,称为表达式块。其可在 JSP 页面 中输出变量、常量,及它们组成的各种表达式的值。 注意,是表达式,而不是语句,是没有分号的。
JSP 内置对象
这九个对象在 JSP 的 Java 代码块、表达式块中可以直接使用,它们的用法与 Servlet 的 用法相同。只不过是直接使用在了 JSP 页面中了。
JSP 指令(directive)
1、page 指令 page 指令用于设置当前 JSP 页面的相关信息。一个 JSP 文件中可以包含多个 page 指令。 常用的 page 指令的属性意义及用法如下:
(1) pageEncoding 属性
pageEncoding 属性用于设置当前 JSP 页面所使用的字符编码格式。即,用户在浏览器中通 过右击查看编码所看到的编码格式。
(2) contentType 属性
contentType 属性用于设置当前 JSP 页面呈现于用户浏览器中的内容类型,通常 为”text/html”类型,即 html 格式的文本。若在 JSP 页面中设置如下:
(3)import 属性
import 属性,用于完成在 JSP 页面中导入指定的类。其被 JSP 引擎翻译为 Servlet 中的 import 语句。例如,
(4)errorPage 属性
errorPage 属性用于指定,当前页面运行过程中发生异常时所要跳转到的页面。
(5)isErrorPage 属性
若一个页面中指定了发生异常后所要跳转的页面,将会出现一个问题:异常信息被隐藏了。 在控制台看不到异常信息,在所跳转的页面中也看不到异常信息。此时,一般是希望当异常 发生后,在所要跳转的页面中能够给出相应的异常信息。而异常信息是封装在异常对象 exception 中的。也就是说,我们需要在所要跳转的页面中能够获取到异常对象。此时,就 需要将这个所要跳转的页面指定为“错误处理页面”。
当一个页面的 page 指令中设置 isErrorPage 的值为 true 时,表明当前页面为一个“错误 处理页面”。默认 isErrorPage 的值为 false。
(6)session 属性 session 属性用于指定当前页面中是否可以直接使用内置对象 session。默认为 true,可以 使用。查看 JSP 翻译为的 Servlet,可以看到 session 的创建,使用的是无参方法 getSession()。
<%@ page session="false"%>
该方法的功能是,若当前具有 session,则使用当前的 session;
若当前没有 session,则会新建一个 session。即 session 对象肯定不为 null。
2、include 指令,即包含指令,用于将指定的文件包含到当前的 JSP 文件中。该指令只有 一个属性 file,用于指定要包含的文件。 用法: 被 include 指定包含的文件,可以是 JSP 动态页面文件,也可以是 HTML 静态页面文件。
JSP 动作(Action)
JSP 动作是指使用系统定义好的标签来完成本应由 Java 代码来完成的功能。 JSP 动作的语法格式为:
JSP 动作很多,一共有十三个动作:
<jsp:include>
、<jsp:forward>
、<jsp:plugin>
、<jsp:param>
、
<jsp:useBean>
、<jsp:getProperty>
、<jsp:setProperty>
、
<jsp:output>
、 <jsp:attribute>
、<jsp:element>
、<jsp:body>
、
<jsp:params>
、<jsp:fallback>
。
其中<jsp:include>
和<jsp:forward>
用的比较的多。
<jsp:useBean>
、<jsp:getProperty>
和<jsp:setProperty>
与 JavaBean
相互结合。
常用的就两个:转发动作与包含动作。
这两个动作的完成,底层使用的是 RequestDispatcher 的 forward()
与 include()
方法实现的。
这两种请求转发方式的本质区别是,标准输出流的开启时间不同。
1、forward()方式的标准输出流是在目标资源中开启的标准输出流
2、include()方式的标准输出流是在当前发出包含运作的页面中开启的。
3、forward()动作的发起页面中是无法向标准输出流中写入数据的;
4、include()动作的发起页面及目标页面中均可向标准输出流中写入数据。 这两个动作都具有一个 page 属性,用于指定要转向的页面。
1、<jsp:include>动作
<jsp: include>
动作和 include 指令非常的像,他们的作用都是引入文件到目标页面。
<jsp: include>
语法格式如下:
<jsp: include page="relative URL" flush="true" />
其中 page 属性是<jsp: include>
动作的一个必须属性,他指明了需要包含文件的路径,该 路径可以是相对的,也可以是绝对的。
flush 属性用于指定输出缓存是否转入被导入文件中。
如果指定为 true,则包含在被导入文件中,如果为 false,则包含在原文件中。
注意:
<jsp: include>
动作与 include 指令还是有些不同的。
首先,<jsp:include>动作是在页面访问时被导入,而 include 指令是在 JSP 引擎编译时导入 的;其次,include 指令中,被包含的文件会和主页面一块被编译成为一个 Servlet 类页面; <jsp:include>动作包含的文件是相对独立的文件,在编译时会被编译两个 Servlet 文件,因此,<jsp:include>在效率上会慢些。
include 动作对包含的动态文件和静态文件的处理方式是不同的。
如果包含的是一个静态文件,被包含文件的内容将直接嵌入 JSP 文件中存放 <jsp:include>
动作的位置,而且当静态文件改变时,必须将 JSP 文件重新保存(重新转译),然后才能访 问变化了的文件。
如果包含的是一个动态文件,则由 Web 服务器负责执行,把执行后的结果传回包含它的 JSP 页面中,若动态文件被修改,则重新运行 JSP 文件时就会同步发生变化。
forward 动作
1、jsp:forward
转发,必须配合 jsp:param 动作指令使用
<jsp:forward page="/b.jsp">
<jsp:param name="username" value="admin"/>
</jsp:forward>
2、jsp:param
用 于 传 递 参 数 , 必 须 与 其 他 支 持 参 数 的 标 签 一 起 使 用 到 达 跳 转 页 面 可 以 通 过request.getParameter(“参数名”)
方式取出参数值,在另一页面来获取增加的请求参数值 。
EL 表达式
EL,Expression Language,表达式语言,是一种在 JSP 页面中获取数据的简单方式。EL 表达 式是从 JSP2.0 版本开始才引入的概念。
EL 表达式的基本语法形式很简单:在 JSP 页面的任何静态部分均可通过${expression}的形 式获取到指定表达式的值。
(1) 从四大域中依次查找数据,获取数据
EL 只能从 pageConext、request、session、ServletContext(application) 四大域属性空间中获 取数据。以下方式是无法获取到指定数据的。因为这个数据没有存放在四大域属性空间中。
(2) 从指定域中获取数据 从 pageContext 依次查找到 application 域空间,会降低执行效率。若某属性确定存放在某 个域属性空间,则可指定直接从该空间中查找。此时需要借助 EL 的四个域属性空间相关的 内置对象。
(3) 访问 Bean 的属性
EL 可以通过${key.属性}
的方式获取到指定对象的指定属性值。其底层实际调用的 是该对象的相应属性的 get 方法。
当然,也可以使用${key[‘属性’]
或${key[“属性”]
的方式获取。该方式不常用。
JavaBean 规范
1.JavaBean 类必须是一个公共类,并将其访问属性(方法)设置为 public。
2.JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器 也应该通过调用各个特性的设置方法来设置特性的缺省值。
3.一个 JavaBean 类不应有公共实例变量,类变量都为 private。
4.持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带 匹配公用 getter 和 setter 方法的专用实例变量。若是布尔值,可以用 isXxx 来代替 getXxx。
5.成员变量的第二个字母最好不要大写, 像 rCategory, hFilename 之类,生成 getter 和 setter 会有问题。
JavaBean 作用
在 jsp 页面中,包含 html 代码、css 代码、java 代码、以及业务逻辑处理代码等。javabean 的作用就是将 html 代码与 java 代码分离,javabean 将 java 代码单独封装成一个处理某种业 务逻辑的类,然后在 jsp 中调用该类,实现降低耦合多和简化页面的作用。
javabean 是特殊的 java 类,具有以下特征
(1)提供一个默认的无参构造函数。
(2)需要被序列化并且实现了 Serializable 接口。
(3)可能有一系列的 getter 或 setter 方法,决定了读、写属性。
(4)用途:实现一些业务逻辑或封装一些业务对象。例如:字符串处理、数据库操作等。
EL 内置对象
就像 JSP 的 Java 代码块及表达式块中可以使用九个内置对象一样,EL 表达式中,同样也 存在有内置对象,并且存在 11 个内置对象。常用的内置对象,除了前面使用过的四个域属 性空间相关的内置对象外,还有如下几个。
(1) pageContext
该 pageContext 与 JSP 内置对象中的 pageContext 是同一个对象。通过该对象,可以 获取到 request、response、session、servletContext、servletConfig 等对象。
注意,这些对象在 EL 中不是内置对象。这些对象只能通过 pageContext 获取。
在 EL 中直接${pageContext.request}
即可获取 request 对象。当然,其底层实际调用的是pageContext.getRequest()
方法。同理,也可以通过类似方式获取到其它对象。
在这些获取的对象中,有一个是实际工程中最常用的: ${pageContext.request.contextPath}
,用于获取当前项目的发布到服务器的名称。一般会用 在 JSP 页面的路径前。
在 EL 的 11 个内置对象中,除了 pageContext 外,其它 10 个内置对象,其类型均为 java.util.Map
类型。
(2) param
在 EL 中通过 ${param.参数名}
可获取到请求中指定参数名的值。
(3) paramValues
若提交的请求中同一参数具有多个值,则可通过 ${paramValues.参数名[索引]}
获取到指定 索引号的该参数值。
(4) initParam
在 EL 中通过使用 ${initParam.初始化参数名}
可以获取到指定的初始化参数的值。
URI 和 URL 之间的区别
URI
1.什么是 URI
URI:统一资源标识符,表示 Web 上每一种可用的资源,如 HTML 文档,图像,视频片段,程 序等都是由一个 URI 进行标识的。
2.URI 的组成
通常由三部分组成:
(1) 资源的命名机制;
(2)存放资源的主机名;
(3)资源自身的名称。
注:以上三点是对实例的解释,并不是 URI 的必要条件,URI 只是一种概念,怎样实现无所 谓,只要它唯一标识一个资源就可以了。
URL
1.什么是 URL
URL 是 URI 的一个子集,统一资源定位符,URL 可以用一种统一的格式来描述各种信息资源, 包括文件、服务器的地址和目录等。URL 是 URI 概念的一种实现方式。
2.URL 的组成
(1)协议(或称为服务方式)
(2)存有该资源的主机的 IP 地址
(3)主机资源的具体地址,比如目录和文件名等。
第一部分和第二部分用"/“符号隔开,
第二部分和第三部分用”/"符号隔开,
第一部分和第二部分是不可缺少的,第三部分可以省略。
URI 和 URL 之间的区别。
URI 和 URL 都定义了资源是什么,但 URL 还定义了该如何访问资源。URL 是一种具体的 URI, 它是 URI 的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种 语义上的抽象概念,可以是绝对的,也可以是相对的,而 URL 则必须提供足够的信息来定 位,是绝对的。
通俗理解
URI:身份证号
URL:身份证住址+姓名
只要能唯一表示资源的就是 URI,在 URI 的基础上给出其资源的访问方式的就是 URL。
JSTL
Apache 已经定义好了一套标准的标签库规范,称为 JSTL,JSP Standard Tag Library,即 JSP 标准标签库。该规范已通过 JCP 审核认定。
在 JSTL 中,已经定义好了一套对于字符串进行处理的函数标签库,这个函数标签库中定义 了 16 个对于字符串进行处理的函数。
JSP Standard Tag Library,
即 JSP 标准标签库。JSTL 中定义了五个标签库:
核心标签库:主要用于完成基本的逻辑运算。
格式化标签库:主要用于完成日期、数字的格式化显示。
EL 函数标签库:定义了若干 EL 函数。
SQL 操作标签库:完成 SQL 操作。不使用了。对于 SQL 操作,已经完全由 Java 代码 完成。
XML 操作标签库:完成 XML 操作。不使用了。对于 XML 操作,已经完全由 Java 代 码完成
JSTL SQL 标签库提供了与关系型数据库(Oracle,MySQL,SQL Server 等等)进行交互的标签。
引用 SQL 标签库的语法如下:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
Servlet 是连接 Web 服务器与服务端 Java 程序的协议,是一种通信规范。这个规范是以一 套接口的形式体现的。
Servlet 是 Servlet 接口实现类的一个实例对象,是运行在服务器上的一段 Java 小程序, 即 Server Applet,也就是 Servlet 这个单词的来历。
Servlet 的主要功能是根据客户端提交的请求,调用服务器端相关 Java 代码,完成对请 求的处理与运算。
Servlet 生命周期是指,
Servlet 对象的创建、Servlet 对象的初始化、Servlet 对象服务的执 行,及最终 Servlet 对象被销毁的整个过程。
Servlet 的整个生命周期过程的执行,均由 Web 服务器负责管理。即 Servlet 从创建到服务 到销毁的整个过程中方法的调用,都是由 Web 服务器负责调用执行,程序员无法控制其执行流程。
Servlet 生命周期方法的执行流程:
(1)当请求发送到 Web 容器后,Web 容器会解析请求 URL,并从中分离出 Servlet 对应 的 URI。
(2)根据分离出的 URI,通过 web.xml 中配置的 URI 与 Servlet 的映射关系,找到要执 行的 Servlet,即找到用于处理该请求的 Servlet。
(3)若该 Servlet 不存在,则调用该 Servlet 的无参构造器、init()方法,实例化该 Servlet, 然后执行 service()方法。
(4)若该 Servlet 已经被创建,则直接调用 service()方法。
(5)当 Web 容器被关闭,或该应用被关闭,则调用执行 destroy()方法,销毁 Servlet 实 例。
当 Servlet 实例被创建好后被放在了哪里?web.xml 中 URI 与 Servlet 的映射关系反映到 内存中是以什么形式存在呢?
当 Servlet 实例被创建好后,会将该 Servlet 实例的引用存放到一个 Map 集合中。该Map 集合的 key 为 URI,而 value 则为 Servlet 实例的引用,即 Map<String, Servlet>。当 Web 容器从用户请求中分离出 URI 后,会首先到这个 Map 中查找是否存在其所对应的 value。
什么是 ServletConfig?
在 Servlet 接口的 init()方法中具有唯一的一个参数 ServletConfig。ServletConfig 是个 接口,顾名思义,就是 Servlet 配置,即在 web.xml 中对当前 Servlet 类的配置信息。Servlet 规范将 Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。
在 Web 容器调用 init()方法时,Web 容器首先会将 web.xml 中当前 Servlet 类的配置 信息封装为一个对象。这个对象的类型实现了 ServletConfig 接口,Web 容器会将这个对象 传递给 init()方法中的 ServletConfig 参数。
什么是 ServletContext?
ServletContext,即 Servlet 上下文,是个接口,是 Web 应用中所有 Servlet 在 Web 容 器中的运行时环境。这个运行时环境随着 Web 应用的启动而创建,随着 Web 应用的关闭 而销毁。也就是说,一个 Web 应用,就一个 Servlet 运行时环境,即一个 Servlet 上下文, 即一个 ServletContext 对象。
这个 Servlet 运行环境中都包含哪些具体的“环境”呢?即 ServletContext 对象中都包 含哪些具体的信息呢?
不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有 Servlet 可以共享的 数据。可以这么说,ServeltContext 可以代表整个应用。所以 ServletConetxt 有另外一个名称: application。
2.1 GenericServlet
在通过实现 Servlet 接口来定义 Servlet 时存在一个很不方便的问题:有太多不需要的 方法必须要实现。通常我们只关心 service()方法,在 service()方法中完成业务逻辑,但由于 Servlet 接口中还存在另外四个方法,所以也要必须实现。
2.1.1 版本 1-方法空实现
由于 Servlet 中通常只使用 service()方法,其它四个方法基本不用,但也需要实现,于 是,能否定义一个通用的抽象类,让其实现 Service 接口,并以简单方式对 service()以外的 其它方法进行实现,即要么是空方法体,要么返回 null,而将 service()方法声明为抽象方法。 这样,以后再定义 Servlet 时就只需要继承自这个通用的抽象类即可,无需再实现了 Service 接口了。
2.1.2 版本 2-获取 ServletConfig
上面的 GenericServlet 定义存在一个问题:将来子类实现 GenericServlet 的 service()方法 后,无法获取到 ServletConfig 对象,当然,也就无法获取到 Servlet 的初始化参数,无法 获取到 ServletContext 对象,及上下文参数了。所以,需要修改这个类的定义。