文章目录
一、JSP简介
- JSP是一种动态网页开发技术,JSP文件就是在传统的HTML中嵌入java代码和jsp标签。
- JSP运行在服务端中。通常返回给客户端的就是一个 HTML 文件,因此只要有浏览器就能查看 JSP 页面。
- JSP 使用 JSP 标签在 HTML 网页中插入 Java 代码,标签通常以
<%
开头,以%>
结束。JSP 标签有多种功能,比如访问数据库和 JavaBean 组件等,还可以在不同的网页之间传递和共享信息。 - JSP 是 Servlet 的扩展,我们可以在 JSP 中使用 Servlet 的所有功能
- JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,以字符串的形式向外输出 HTML 代码。所以,JSP 只是在 Servlet 的基础上做了进一步封装。
1.1 jsp的特点
- JSP 具有 Servlet 的所有优点,例如 JSP 文件跨平台,即一次编写,处处运行。
- JSP 比 CGI 性能更加优越,因为 JSP 可以直接在 HTML 中嵌入标签,而 CGI 需要单独引用 CGI 文件。
- JSP 比 Servlet 更易于维护,JSP 将业务逻辑与网页设计分离,使其更加灵活。
- 使用 JSP,Web 开发人员可以更注重于网页设计,Java 开发人员可以更注重于逻辑处理。
1.2 JSP对比Servlet
Servlet | JSP |
---|---|
Servlet在java中添加HTML代码 | JSP在HTML内添加java代码 |
Servlet是一个java程序,支持HTML标签 | JSP是一种HTML代码,支持Java语句 |
Servlet一般用于开发程序的业务层(做一些复杂的逻辑处理) | JSP一般用于开发程序的表示层(显示数据) |
Servlet由Java开发人员创建和维护 | JSP常用于页面设计,由Web开发人员使用 |
二、JSP生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mI7RUxDH-1632662392629)(img/JSP生命周期.png)]
2.1 JSP编译
- 当浏览器请求 JSP 时,JSP 容器会首先检查是否需要编译页面。如果该页面从未被编译过,或者自上次编译以来对其进行了修改,则编译该页面
编译过程包括 3 个步骤:
- 解析 JSP:JSP 容器解析 JSP 文件,查看是否有语法错误
- 翻译 JSP:JSP 容器把 JSP 文件翻译为 Servlet 类
- 编译 Servlet
2.2 JSP初始化
- 当容器加载 JSP 时,它将在处理任何请求之前调用 jspInit() 方法。如果您需要自定义 JSP 的初始化内容,可以重写 jspInit() 方法。
2.3 JSP执行
- JSP 页面完成初始化后,JSP 将会调用 _jspService() 方法。
2.4 JSP销毁
- 调用jspDestory()方法
- jspDestroy() 方法等效于 Servlet 中的 destroy() 方法。如果您需要自定义 JSP 的销毁内容,可以重写 jspDestroy() 方法。
三、 JSP脚本
- JSP 脚本可以包含任意数量的 Java 语句,变量、方法和表达式。JSP 脚本会把包含的内容插入到 Servlet 的 service() 方法中
语法格式:
<%
java代码
%>
四、JSP声明语句
语法格式:
<%! 声明语句 %>
jsp脚本和jsp声明语句的区别:
- JSP 脚本只能声明变量,不能声明方法。JSP 声明语句可以声明变量和方法。
- JSP 脚本会把包含的内容转译插入到 Servlet 的 service() 方法中,也就是
<% %>
中定义的变量是局部变量。这也是 JSP 脚本不能声明方法的原因,因为 Java 不允许方法中嵌套方法。 - JSP 声明会把包含的内容添加到 Servlet 类中(在任何方法之外),也就是
<%! %>
中定义的变量是成员变量,方法是成员方法。
五、JSP表达式
- JSP 表达式可以把变量或者表达式输出到网页上,不需要 out.print() 就能输出数据。通常用于打印变量和方法的值。
语法格式:
<%= 表达式 %>
六、JSP指令
- JSP 指令(directive)用来告诉 Web 服务器如何处理 JSP 页面的请求和响应
语法格式:
<%@ directive attribute = "value" [attribute2 = "value2" ...]%>
指令分以下几种类型:
指 令 | 说 明 |
---|---|
<%@ page … %> | 定义与页面相关的属性,例如脚本语言、错误页面和缓冲要求 |
<%@ include … %> | 引入其它 JSP 文件 |
<%@ taglib … %> | 声明并导入标签库 |
6.1 Page指令
- page指令通常放在jsp文件的顶部,也可以是任意的位置
page指令相关属性:
属 性 | 取 值 | 说 明 | 举 例 |
---|---|---|---|
buffer | none、缓冲区大小(默认值为 8kb) | 指定输出流是否有缓冲区 | <%@ page buffer=“16kb” %> |
autoFlush | true(默认值)、false | 指定缓冲区是否自动清除 | <%@ page autoFlush=“true” %> |
contentType | text/html; charset = ISO-8859-1、 text/xml;charset = UTF-8 等 | 指定 MIME 类型和字符编码 | <%@ page contentType=“text/html;charset=UTF-8” %> |
errorpage | 页面路径 | 指定当前 JSP 页面发生异常时,需要重定向的错误页面 | <%@ page errorPage=“myerrorpage.jsp” %> 注意:myerrorpage.jsp 的 isErrorpage 值必须为 true |
isErrorPage | true、false(默认值) | 指定当前页面为错误页面 | <%@ page isErrorPage=“true” %> |
extends | 包名.类名 | 指定当前页面继承的父类,一般很少使用 | <%@ page extends=“mypackage.SampleClass”%> |
import | 类名、接口名、包名 | 导入类、接口、包,类似于 Java 的 import 关键字 | <%@ page import = " java.util.Date" %> <%@ page import=“java.io., java.lang.”%> |
info | 页面的描述信息 | 定义 JSP 页面的描述信息,可以使用 getServletInfo() 方法获取 | <%@ page info=“这里是编程帮的页面信息”%> |
isThreadSafe | true(默认值)、false | 是否允许多线程使用 | <%@ page isThreadSafe=“false” %> |
language | 脚本语言 | 指定页面中使用的脚本语言 | <%@ page language= “java” %> |
session | true(默认值)、false | 指定页面是否使用 session | <%@ page session=“false” %> |
isELIgnored | true(默认值)、false | 指定页面是否忽略 JSP 中的 EL | <%@ page isELIgnored=“false” %> |
以上属性除了import可以出现多次,其他属性都只能出现一次。
6.2 include指令
- include 指令用于在 JSP 页面引入其它内容,可以是 JSP 文件、html 文件和文本文件等,相当于把文件的内容复制到 JSP 页面。引入的文件和 JSP 页面同时编译运行。
语法格式:
<%@ include file="URL" %>
- 如果引入的文件与当前文件在同一目录下,则使用相对路径(URL=文件名),如果不在同一目录下,则需要写绝对路径
6.3 taglib指令
- 在 JSP 中,我们可以使用 taglib 指令声明并引入标签库。Java API 允许在页面中自定义标签,标签库就是自定义标签的集合
语法格式:
<%@ taglib uri="tagliburl" prefix="tagPre" %>
- prefix 指定标签库的前缀
例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.biancheng.net/tags" prefix="mytag"%>
<!DOCTYPE html>
<html>
<body>
<mytag:currentDate />
</body>
</html>
七、JSP动作
- JSP 动作使用 XML 语法格式的标签来控制服务器的行为。利用 JSP 动作可以动态地插入文件、重用 JavaBean 组件、把用户重定向到另一个页面、为 Java 插件生成 HTML 代码等。
7.1 JSP动作与JSP指令的区别
JSP 动作与 JSP 指令的不同之处如下:
- JSP 指令在翻译阶段执行,从而设置整个 JSP 页面的属性。JSP 页面被执行时首先进入翻译阶段,程序会先查找页面中的 JSP 指令,并将它们转换成 Servlet。所以,JSP 指令是在页面转换时期被编译执行的,且编译一次。
- JSP 动作在请求处理阶段执行,它们只有执行时才实现自己的功能。通常用户每请求一次,动作标识就会执行一次。
语法格式:
<jsp:action_name attribute="value"/>
或者
<jsp:action_name attribute="value"></jsp:action_name>
7.2 常用的JSP动作
动作 | 说明 |
---|---|
jsp:include | 页面被请求时引入一个文件 |
jsp:userBean | 实例化JavaBean |
jsp:setProperty | 设置 JavaBean 的属性 |
jsp:getProperty | 获取 JavaBean 的属性 |
jsp:forward | 将请求转发到另一个页面 |
jsp:plugin | 根据浏览器类型替换成 或者 标签 |
jsp:element | 定义动态 XML 元素 |
jsp:attribute | 设置动态 XML 元素的属性 |
jsp:body | 设置动态 XML 元素的内容 |
7.2.1 include动作
语法格式
<jsp:include page="relativeURL | <%=expression%>" flush="true" />
7.2.2 forward动作
-
使用forwar可以将请求转发给另一个页面,请求的参数数据会被一起转发
-
转发后,浏览器地址栏显示的仍是当前页面的地址,具有很好的隐蔽性
语法格式:
<jsp:forward page="URL" />
7.2.3 param动作
- param动作用来传递参数,通常搭配其他动作如include,forward使用
语法格式:
<jsp:param name="name" value="value" />
八、useBean动作
- jsp:useBean 用于获取 Bean 对象。jsp:useBean 首先会在指定范围内查找 Bean 对象,如果 Bean 对象不存在,则创建 Bean 对象
语法格式:
<jsp:useBean id = "name" class = "package.class" scope= "page | request | session | application" />
- id:表示Bean实例化对象的变量名,可以在指定范围内使用
- class:表示需要实例化Bean的类路径,指定的类必须包含public且无参的构造方法
- scope:指定Bean的作用域
- Page:只能在当前页面使用该Bean对象
- request:只能在一次请求范围内使用该Bean对象
- session:只能在一次会话范围内使用
- application:可以在整个应用范围内使用
九、setProperty和getProperty动作
- jsp:getProperty 动作用于获取 Bean 的属性值,jsp:setProperty 动作用于设置 Bean 的属性值。
9.1 setProperty
语法格式:
<jsp:setProperty name="BeanName" property="attributeName" vanlue="attributeValue" />
**使用:**经常和useBean搭配使用
例如:
<jsp:useBean id = "User" ...>
...
<jsp:setProperty name = "User" property = "attributeName" value = "attributeValue"/>
</jsp:useBean>
以上:只有 jsp:useBean 实例化了 User 对象,jsp:setProperty 才会执行。
<jsp:useBean id="User" />
<jsp:setProperty name="User" property="attributeName" value="attributeValue" />
以上:无论 jsp:useBean 是否实例化了 User 对象,jsp:setProperty 都会执行。
9.2 getProperty
语法格式:
<jsp:getProperty name="beanName" property="attributeName" />
注:jsp:setProperty 和 jsp:getProperty 动作都会按照 page、request、session 和 application 的顺序依次查找指定 Bean 的实例对象,直到第一个实例被找到。如果任何范围内都不存在这个 Bean 实例,则会拋出异常。
注:要重写类的get和set方法
十、JSP内置对象
jsp有九个内置对象
对 象 | 类型 | 说 明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 获取用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 响应客户端请求,并将处理信息返回到客户端 |
out | javax.servlet.jsp.JspWriter | 输出内容到 HTML 中 |
session | javax.servlet.http.HttpSession | 用来保存用户信息 |
application | javax.servlet.ServletContext | 所有用户共享信息 |
config | javax.servlet.ServletConfig | 这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数 |
pageContext | javax.servlet.jsp.PageContext | JSP 的页面容器,用于访问 page、request、application 和 session 的属性 |
page | javax.servlet.jsp.HttpJspPage | 类似于 Java 类的 this 关键字,表示当前 JSP 页面 |
exception | java.lang.Throwable | 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象。 |
四个域对象
pageContext、request、session、application
- 四个域对象对比
作用域 | 描述 | 作用范围 |
---|---|---|
page | 如果把属性保存到 pageContext 中,则它的作用域是 page。 | 该作用域中的属性只在当前 JSP 页面有效,跳转页面后失效。 |
request | 如果把属性保存到 request 中,则它的作用域是 request。 | 该作用域中的属性只在当前请求范围内有效。服务器跳转页面后有效,例如jsp:forward;客户端跳转页面后无效,例如超链接。 |
session | 如果把属性保存到 session 中,则它的作用域是 session。 | 该作用域中的属性只在当前会话范围内有效,网页关闭后失效。 |
application | 如果把属性保存到 application 中,则它的作用域是 application。 | 该作用域中的属性在整个应用范围内有效,服务器重启后失效。 |
10.1 JSP request域对象
- 主要用来获取客户端提交的数据。
常用方法:
方法 | 说明 |
---|---|
String getParameter(String name) | 获取请求参数 name 的值 |
Enumeration getParameterNames() | 获取所有参数名称 |
String[] getParameterValues(String name) | 获取请求参数 name 的所有值 |
Object getAttribute(String name) | 获取 name 属性的值 |
Enumeration getAttributeNames() | 返回所有属性的名称集合 |
void setAttribute(String key, Object value) | 给 key 对象赋 value 值 |
void removeAttribute(String name) | 删除指定的 name 属性 |
cookie[] getCookies() | 获取所有的 cookie 对象 |
HttpSession getSession() | 返回 request 对应的 session 对象,如果没有则创建一个 session 对象 |
HttpSession getSession(boolean create) | 返回 request 对应的 session 对象,如果没有,且 create 值为 true,则创建一个 session 对象 |
Enumeration getHeaderNames() | 返回 HTTP 头信息的名称集合 |
String getHeader(String name) | 获取 name 指定的 HTTP 头信息 |
String getMethod() | 获取 HTTP 请求方法/客户提交信息方式 |
10.2 JSP Response对象
- response 对象和 request 对象相对应,主要用于响应客户端请求,将处理信息返回到客户端。
response常用方法:
方 法 | 说 明 |
---|---|
void addHeader(String name, String value) | 添加头信息(参数名称和对应值) |
void addCookie(Cookie cookie) | 添加 cookie 信息 |
void sendRedirect(String location) | 实现页面重定向 |
void setStatus(int sc) | 实现页面的响应状态代码 |
void setContentType(String type) | 设置页面的 MIME 类型和字符集 |
void setCharacterEncoding(String charset) | 设定页面响应的编码类型 |
10.3 JSP out对象
- out 对象包含了很多 IO 流中的方法和特性,最常用的就是输出内容到 HTML 中。
常用方法:
方法 | 说明 |
---|---|
void print() | 将内容直接打印在 HTML 标签中 |
void println() | 类似于 print,唯一区别是 println 方法添加了换行符 |
void newLine() | 输出换行字符 |
void clear() | 清除页面缓冲区 |
boolean isAutoFlush() | 检查页面是否自动清除缓冲区 |
10.4 JSP session对象
- 主要用来访问用户数据,记录客户的连接信息
常用方法:
方法 | 说明 |
---|---|
void setAttribute(String name, Object value) | 将参数名和参数值存放在 session 对象中 |
Object getAttribute(String name) | 通过 name 返回获取相应的 value 值,如果 name 没有相应的 value 值,则返回 null |
void removeAttribute(String name) | 删除指定的 name 参数 |
Enumeration getAttributeNames() | 获取 session 对象中存储的所有参数 |
long getCreationTime() | 返回 session 对象创建的时间 |
String getId() | 获取 session 对象的 ID 值 |
boolean isNew() | 用于检查 session 对象是不是新对象,如果客户端禁用了 cookie ,则 session.isNew() 始终返回 true |
void invalidate() | 终止 session,即指定 session 对象失效 |
void setMaxInactiveInterval() | 设置 session 对象的有效时间,单位:秒 |
int getMaxInactiveInterval() | 获取 session 对象的有效时间,单位:秒 |
long getLastAccessedTime() | 获取上次访问 session 对象的时间 |
10.5 JSP application对象
- 在服务器部署应用和项目时,Web 容器仅创建一次 ServletContext 实例,也就是说 application 设置的任何属性和值可以用于整个应用(所有 JSP 页面)。可以将 application 对象看作 Web 应用的全局变量。一般用于保存应用程序的公用数据。
常用方法:
方 法 | 说 明 |
---|---|
Object getAttribute(String attributeName) | 获取 attributeName(属性名称)对应的 object |
void setAttribute(String attributeName, Object object) | 设置 attributeName 对应的属性值 |
Enumeration getAttributeNames() | 返回 application 对象中所有的 attributeName |
void removeAttribute(String objectName) | 删除 application 对象中指定 attributeName 的属性 |
String getServerInfo() | 获取当前 Servlet 的版本信息 |
String getRealPath(String value) | 获取指定文件的实际路径 |
10.6 JSP config对象
- 一般用于获取页面和 Servlet 的初始化参数。
常用方法:
方法 | 说明 |
---|---|
String getInitParameter(String paramname) | 获取指定的初始化参数值 |
Enumeration getInitParameterNames() | 获取当前页面所有的初始化参数值 |
ServletContext getServletContext() | 获取当前执行 Servlet 的 servletContext(Servlet 上下文)的值 |
String getServletName() | 获取当前执行 Servlet 的名称 |
10.7 pageContext对象
- pageContext 对象表示整个 JSP 页面,可以获取或删除request、page、session、application对象的任意属性
常用方法:
方 法 | 说 明 |
---|---|
Object findAttribute (String AttributeName) | 按 page、request、session、application 的顺序查找指定的属性,并返回对应的属性值。如果没有相应的属性,则返回 NULL |
Object getAttribute (String AttributeName, int Scope) | 在指定范围内获取属性值。与 findAttribute 不同的是,getAttribute 需要指定查找范围 |
void removeAttribute(String AttributeName, int Scope) | 在指定范围内删除某属性 |
void setAttribute(String AttributeName, Object AttributeValue, int Scope) | 在指定范围内设置属性和属性值 |
Exception getException() | 返回当前页的 Exception 对象 |
ServletRequest getRequest() | 返回当前页的 request 对象 |
ServletResponse getResponse() | 返回当前页的 response 对象 |
ServletConfig getServletConfig() | 返回当前页的 ServletConfig 对象 |
HttpSession getSession() | 返回当前页的 session 对象 |
Object getPage() | 返回当前页的 page 对象 |
ServletContext getServletContext() | 返回当前页的 application 对象 |
10.8 JSP Page对象
- page 对象是指当前的 JSP 页面本身,在实际开发中并不常用。
常用方法:
方 法 | 说 明 |
---|---|
class getClass() | 返回当前页面所在类 |
int hashCode() | 返回当前页面的 hash 代码 |
String toString() | 将当前页面所在类转换成字符串 |
boolean equals(Object obj) | 比较对象和指定的对象是否相等 |
void copy (Object obj) | 把对象复制到指定的对象中 |
Object clone() | 复制对象 |
十一、JSP Cookie
-
Cookie 不是 JSP 内置对象,而是由 Netscape 公司发明,用来跟踪用户会话(session)的方式。
-
Cookie 由服务器生成并发送给浏览器(客户端),浏览器会将其以文本文件的形式存储在某个目录下。
识别用户通常有以下步骤:
- 服务器把 cookie 信息发送到浏览器,例如:用户 ID、用户名称等信息。
- 浏览器在本地存储这些信息。
- 浏览器再次向服务器发送请求时,它会同时将本地存储的 cookie 信息一同发送给服务器,然后服务器使用这些信息来识别用户或其它。
cookie 的作用表现在以下方面:
- 对特定对象的追踪,如用户的访问次数、最后访问时间等。
- 统计网页的浏览次数。
- 在 cookie 有效期内,记录用户的登录信息,简化下一次的登录过程。
- 实现各种个性化服务,如”最近浏览过的商品“。
Cookie常用方法:
方法 | 说明 |
---|---|
public void setDomain(String pattern) | 设置 cookie 的域名,如 biancheng.net |
public String getDomain() | 获取 cookie 的域名 |
public void setMaxAge(int expiry) | 设置 cookie 有效期,单位:秒 默认仅在当前会话中存在 |
public int getMaxAge() | 获取 cookie 有效期,单位:秒 默认为 -1,表示 cookie 保存到浏览器关闭为止 |
public String getName() | 返回 cookie 的名称,名称创建后将不能被修改 |
public void setValue(String newValue) | 设置 cookie 的值 |
public String getValue() | 获取 cookie 的值 |
public void setPath(String uri) | 设置 cookie 的路径 默认为当前页面目录以及子目录下的所有 URL |
public String getPath() | 获取 cookie 的路径 |
public void setSecure(boolean flag) | 设置 cookie 是否要加密传输 |
public void setComment(String purpose) | 设置 cookie 注释 |
public String getComment() | 返回 cookie 注释,如果 cookie 没有注释,则返回 null |
11.1 JSP使用cookie
11.1.1 创建cookie对象
cookie cookieName = new cookie(String name,String value);
11.1.2 写入cookie
response.add(cookieName);
11.1.3 设置cookie有效期
cookie.setMaxAge(60*60*24);
11.1.4 读取cookie
request.getCookies();
注:对cookie进行设置操作后,需要重新写入response请求头中
十二、EL表达式
- EL表达式可以简化JSP繁琐的语法,更方便阅读
12.1 语法格式
${EL表达式}
例子:
${param.name} 等同于 <%=request.getParameter(“name”)%>
12.2 EL算术运算符
EL算术运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加 | ${5+7} | 12 |
- | 减 | ${7-5} | 2 |
* | 乘 | ${2*5} | 10 |
/或div | 除 | ${10/2} | 5 |
%或mod | 取模 | ${10/3} | 1 |
注:如果+两边有字符串,EL表达式会将该字符串转换为数值进行运算,如果该字符串不能转换为数值类型,则会抛出异常
12.3 EL比较运算符
EL比较运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | ${6==6} 或 ${6 eq 6} ${“A”=“a”} 或 ${“A” eq “a”} | true false |
!= 或 ne | 不等于 | ${6!=6} 或 ${6 ne 6} ${“A"!=“a”} 或 ${“A” ne “a”} | false true |
< 或 lt | 小于 | ${3<8} 或 ${3 lt 8} ${“A”<“a”} 或 ${“A” lt “a”} | true true |
> 或 gt | 大于 | ${3>8} 或 ${3 gt 8} ${“A”>“a”} 或 ${“A” gt “a”} | false false |
<= 或 le | 小于等于 | ${3<=8} 或 ${3 le 8} ${“A”<=“a”} 或 ${“A” le “a”} | true true |
>= 或 ge | 大于等于 | ${3>=8} 或 ${3 ge 8} ${“A”>=“a”} 或 ${“A” ge “a”} | false false |
12.4 EL逻辑运算符
EL逻辑运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
&& 或 and | 与 | ${2>1&&3<4 } 或 ${2>1and3<4 } | true |
|| 或 or | 或 | ${2<1||3>4} 或 ${2<1or3>4} | false |
! 或 not | 非 | ${!(2>4)} 或 ${not (2>4)} | true |
12.5 三目、empty、.和[ ]运算符
1). 和 [ ]
.
和[ ]
是 EL 中最常用的运算符,用来访问 JavaBean 中的属性和隐式对象的数据。一般情况下,.
用来访问 JavaBean 属性或 Map 类型的值,[ ]
用来访问数组或者列表的元素。
2)empty
empty 用来判断 EL 表达式中的对象或者变量是否为空。若为空或者 null,返回 true,否则返回 false。
3)条件运算符
EL 表达式中,条件运算符的语法和 Java 的完全一致,如下:
${条件表达式?表达式1:表达式2}
其中,条件表达式用于指定一个判定条件,该表达式的结果为 boolean 类型。如果该表达式的运算结果为 true,则返回表达式 1 的值;反之,返回表达式 2 的值
12.6 运算符优先级(由高到低)
序号 | 优先级 |
---|---|
1 | [] . |
2 | () |
3 | -(负)、not、! 、empty |
4 | * 、 / 、 div 、% 、mod |
5 | +、-(减) |
6 | <、>、<=、>=、lt、gt、le、ge |
7 | ==、!-、eq、ne |
8 | &&、and |
9 | ||、or |
10 | ${A?B:C} |
12.7 EL内置对象
内置对象 | 说明 |
---|---|
pageScope | 获取 page 范围的变量 |
requestScope | 获取 request 范围的变量 |
sessionScope | 获取 session 范围的变量 |
applicationScope | 获取 application 范围的变量 |
param | 相当于 request.getParameter(String name),获取单个参数的值 |
paramValues | 相当于 request.getParameterValues(String name),获取参数集合中的变量值 |
header | 相当于 request.getHeader(String name),获取 HTTP 请求头信息 |
headerValues | 相当于 request.getHeaders(String name),获取 HTTP 请求头数组信息 |
initParam | 相当于 application.getInitParameter(String name),获取 web.xml 文件中的参数值 |
cookie | 相当于 request.getCookies(),获取 cookie 中的值 |
pageContext | 表示当前 JSP 页面的 pageContext 对象 |
十三、JavaBean
- JavaBea是一个可重复使用的组件,是遵守JavaBean API规范的一个Java类。
一般情况下,JavaBean 要满足以下要求:
- JavaBean 是一个公共类,并提供无参公有的构造方法
- 需要被序列化并且实现了 Serializable 接口
- 属性私有化
- 具有公共的访问属性的 getter 和 setter 方法
示例:
package entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L; //序列化
private int id; //属性私有,提供Getter,Setter方法供外部访问
private String name;
public User() { //必须提供一个无参的构造方法
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
十四、JSP自定义标签
- 自定义标签就是用户(开发者)自己定义的标签。自定义标签可以让 JSP 页面中不含有 Java 代码,只含有 HTML 代码和部分标签,就能实现业务逻辑的调用。
自定义标签的优点如下:
- 减少 JSP 页面对脚本的需求和依赖性
- 将 JSP 页面和业务逻辑分开,增加了程序的可维护性
- 可重复调用相同的业务逻辑,增加了程序的可重用性
使用自定义标签步骤如下:
- 自定义标签实现类
- 编写 tld 标签库描述文件
- 在 JSP 页面中使用自定义标签
14.1 自定义标签语法
使用 taglib 指令指定 tld 文件的路径:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %>
其中:prefix 指定自定义标签的前缀,uri 指定 tld 文件的路径
使用自定义标签
<prefix:tagname attr1=value1 attrn=valuen />
或
<prefix:tagname attr1=value1 attrn=valuen >
标签体
</prefix:tagname>
其中:prefix 表示自定义标签的前缀,tagname 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。
关键点:前缀:标签名、标签属性名、标签属性值
注:tld文件中只能有一对taglib标签,taglib标签下可以有多个tag子标签
14.2 taglib标签
- 常见属性
属 性 | 说 明 |
---|---|
tlib-version | 标签库版本号 |
jsp-version | JSP版本号 |
short-name | 当前标签库的前缀 |
uri | 页面引用的自定义标签的 uri 地址 |
name | 自定义标签名称 |
tag-class | 自定义标签实现类路径 |
description | 自定义标签的功能描述 |
attribute | 自定义标签的指定属性,可以有多个 |
14.3 tag标签
- 常见属性
属 性 | 说 明 |
---|---|
name | 自定义标签名称 |
tag-class | 自定义标签实现类 |
body-content | 有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理) |
description | 自定义标签的功能描述 |
attribute | 自定义标签功能的指定属性,可以有多个 |
variable | 自定义标签的变量属性 |
14.4 attribute标签
属 性 | 说 明 |
---|---|
name | 属性名称 |
description | 属性描述 |
required | 指定属性是否是必须的,默认值:false |
rtexprvalue | 属性值是否支持 JSP 表达式 |
type | 定义该属性的 Java 类型,默认值:String |
fragment | 如果声明了该属性,属性值将被视为一个 JspFragment |
注:在自定义标签中设置属性,自定义标签类中必须要有setter()方法,如下:
//为自定义标签设置了message属性
public void setter(String message){
this.message=message;
}
14.5 variable标签
属 性 | 说 明 |
---|---|
declare | 变量声明 |
description | 变量描述 |
name-from-attribute | 指定的属性名称,其值为变量,在调用 JSP 页面时可以使用的名字 |
name-given | 变量名(标签使用时的变量名) |
scope | 变量的作用范围,有 3 个值:NESTED 开始和结束标签之间、AT_BEGIN 从开始标签到页面结束、AT_END 从结束标签之后到页面结束 |
variable-class | 变量的 Java 类型,默认值:String |
14.6 自定义标签的标签体
- 也可以在自定义中设置标签体的内容,如下:
<bc:hello>
这是标签体的内容
</bc:hello>
十五、JSP文件上传
- 上传文件就是对文件进行读写操作,在JSP中我们可以使用Commons-FileUpload组件来实现文件上传。
Commons-FileUpload 组件具有以下特点:
- 使用简单:Commons-FileUpload 可以内嵌到 JSP 页面中,所以只需要编写少量的代码就可以完成文件的上传功能。
- 能够全程控制上传内容:使用 Commons-FileUpload 组件提供的对象及操作方法,可以获得上传文件的信息,即文件名称、类型和大小等。
- 能够控制上传文件的大小和类型:为了避免在上传过程中出现异常数据,Commons-FileUpload 组件提供了相应的方法来控制上传文件。
Commons-FileUpload 组件依赖于 FileUpload 和 Commons,需要 commons-fileupload-xx.jar 和 commons-io-xx.jar 文件。
- commons-fileupload-xx.jar 下载地址:https://commons.apache.org/fileupload/
- commons-io-xx.jar 下载地址:https://commons.apache.org/io/
15.1 Commons-FileUpload组件API
15.1.1 ServletFileUpload类
方 法 | 说 明 |
---|---|
public void setSizeMax(long sizeMax) | 设置上传文件总量的最大值 (包含文件和表单数据) |
public List parseRequest(HttpServletRequest req) | 解析 form 表单提交的数据,返回一个 FileItem 实例的集合 |
public static final boolean isMultipartContent(HttpServletRequest req) | 判断请求信息中的内容是否是”multipart/form-data“类型,是则返回 true,否则返回 false。 |
public void setHeaderEncoding(String encoding) | 设置转换时所使用的字符集编码 |
15.1.2 FileItem接口
- FileItem 接口用于封装单个表单字段元素的数据,一个表单字段对应一个 FileItem 实例
方 法 | 说 明 |
---|---|
public boolean isFormField() | 用于判断 FileItem 类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。 |
public String getName() | 获取文件上传的文件名 |
public String getFieldName() | 返回表单字段元素的 name 属性值 |
public long getSize() | 获取上传文件的大小 |
public String getString() | 将 FileItem 对象中保存的主体内容以一个字符串返回。其重载方法 public String getString(String encoding) 中的参数用指定的字符集编码方式 |
public void write() | 将 FileItem 对象中保存的主体内容保存到指定的文件中。 |
15.1.3 FileItemFactory接口和实现类
-
创建 ServletFileUpload 实例需要依赖 FileItemFactory 工厂接口。DiskFileItemFactory 是 FileItemFactory 接口的实现类,该类的常用方法如下:
方 法 说 明 public void setSizeThreshold(int sizeThreshold) 设置内存缓冲区的大小 public void setRepository(String path) 设置临时文件存放的目录
15.2 JSP上传文件
创建上传文件表单时,需要注意以下几点:
- 表单的 method 属性必须设置为 POST 方法,不能使用 GET 方法。
- 表单 enctype 属性应设置为 multipart/form-data。
- 表单 action 属性应设置为对应的 Servlet,用来处理文件上传的逻辑代码。
- 使用 <input…/> 标签上传单个文件,属性 type=“file”。上传多个文件需添加多个 <input …/> 标签。
拓展
表单的 enctype 属性有以下 3 个值:
- application/x-www-form-urlencoded:默认值,用于处理少量文本数据的传递。向服务器发送大量的文件或二进制数据时,效率很低。
- multipart/form-data:上传二进制数据,只有使用了 multipart/form-data 才能完整的传递文件数据,进行上传操作。
- text/plain:用于向服务器传递大量文本数据,适用于电子邮件的应用。
十六、JDBC连接数据库
- 若想使用JDBC需先导入驱动文件
注意:MySQL 8.0 及之后的版本与之前的数据库连接有所不同:
- 首先驱动 com.mysql.jdbc.Driver 更换为 com.mysql.cj.jdbc.Driver。
- MySQL 8.0 及以上版本需要显式关闭 SSL 连接和指定 CST。
16.1 加载驱动
<sql:setDataSource var="snapshot" driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
user="root" password="root"/>
16.2 插入数据
<sql:update dataSource="${snapshot}" var="result">
INSERT INTO 表名 (NAME,url,age,country) VALUES ('京东', 'https://www.jd.com/', 15, 'CN');
</sql:update> --%>
16.3 删除数据
<sql:update dataSource="${snapshot}" var="count">
DELETE FROM website WHERE id = ?
<sql:param value="${id}" />
</sql:update>--%>
16.4 修改数据
<sql:update dataSource="${snapshot}" var="count">
UPDATE website SET name="biancheng" WHERE id = ?
<sql:param value="${id}" />
</sql:update>--%>
16.5 查询数据
<sql:query dataSource="${snapshot}" var="result">
SELECT * from website;
</sql:query>
url="jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
user=“root” password=“root”/>
## 16.2 插入数据
```jsp
<sql:update dataSource="${snapshot}" var="result">
INSERT INTO 表名 (NAME,url,age,country) VALUES ('京东', 'https://www.jd.com/', 15, 'CN');
</sql:update> --%>
16.3 删除数据
<sql:update dataSource="${snapshot}" var="count">
DELETE FROM website WHERE id = ?
<sql:param value="${id}" />
</sql:update>--%>
16.4 修改数据
<sql:update dataSource="${snapshot}" var="count">
UPDATE website SET name="biancheng" WHERE id = ?
<sql:param value="${id}" />
</sql:update>--%>
16.5 查询数据
<sql:query dataSource="${snapshot}" var="result">
SELECT * from website;
</sql:query>