<%
开头,以%>
结束。JSP 标签有多种功能,比如访问数据库和 JavaBean 组件等,还可以在不同的网页之间传递和共享信息。Servlet | JSP |
---|---|
Servlet在java中添加HTML代码 | JSP在HTML内添加java代码 |
Servlet是一个java程序,支持HTML标签 | JSP是一种HTML代码,支持Java语句 |
Servlet一般用于开发程序的业务层(做一些复杂的逻辑处理) | JSP一般用于开发程序的表示层(显示数据) |
Servlet由Java开发人员创建和维护 | JSP常用于页面设计,由Web开发人员使用 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mI7RUxDH-1632662392629)(img/JSP生命周期.png)]
编译过程包括 3 个步骤:
语法格式:
<%
java代码
%>
语法格式:
<%! 声明语句 %>
jsp脚本和jsp声明语句的区别:
<% %>
中定义的变量是局部变量。这也是 JSP 脚本不能声明方法的原因,因为 Java 不允许方法中嵌套方法。<%! %>
中定义的变量是成员变量,方法是成员方法。语法格式:
<%= 表达式 %>
语法格式:
<%@ directive attribute = "value" [attribute2 = "value2" ...]%>
指令分以下几种类型:
指 令 | 说 明 |
---|---|
<%@ page … %> | 定义与页面相关的属性,例如脚本语言、错误页面和缓冲要求 |
<%@ include … %> | 引入其它 JSP 文件 |
<%@ taglib … %> | 声明并导入标签库 |
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可以出现多次,其他属性都只能出现一次。
语法格式:
<%@ include file="URL" %>
语法格式:
<%@ taglib uri="tagliburl" prefix="tagPre" %>
例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.biancheng.net/tags" prefix="mytag"%>
JSP 动作与 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 元素的内容 |
语法格式
使用forwar可以将请求转发给另一个页面,请求的参数数据会被一起转发
转发后,浏览器地址栏显示的仍是当前页面的地址,具有很好的隐蔽性
语法格式:
语法格式:
语法格式:
语法格式:
**使用:**经常和useBean搭配使用
例如:
...
以上:只有 jsp:useBean 实例化了 User 对象,jsp:setProperty 才会执行。
以上:无论 jsp:useBean 是否实例化了 User 对象,jsp:setProperty 都会执行。
语法格式:
注:jsp:setProperty 和 jsp:getProperty 动作都会按照 page、request、session 和 application 的顺序依次查找指定 Bean 的实例对象,直到第一个实例被找到。如果任何范围内都不存在这个 Bean 实例,则会拋出异常。
注:要重写类的get和set方法
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。 | 该作用域中的属性在整个应用范围内有效,服务器重启后失效。 |
常用方法:
方法 | 说明 |
---|---|
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 请求方法/客户提交信息方式 |
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) | 设定页面响应的编码类型 |
常用方法:
方法 | 说明 |
---|---|
void print() | 将内容直接打印在 HTML 标签中 |
void println() | 类似于 print,唯一区别是 println 方法添加了换行符 |
void newLine() | 输出换行字符 |
void clear() | 清除页面缓冲区 |
boolean isAutoFlush() | 检查页面是否自动清除缓冲区 |
常用方法:
方法 | 说明 |
---|---|
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 对象的时间 |
常用方法:
方 法 | 说 明 |
---|---|
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) | 获取指定文件的实际路径 |
常用方法:
方法 | 说明 |
---|---|
String getInitParameter(String paramname) | 获取指定的初始化参数值 |
Enumeration getInitParameterNames() | 获取当前页面所有的初始化参数值 |
ServletContext getServletContext() | 获取当前执行 Servlet 的 servletContext(Servlet 上下文)的值 |
String getServletName() | 获取当前执行 Servlet 的名称 |
常用方法:
方 法 | 说 明 |
---|---|
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 对象 |
常用方法:
方 法 | 说 明 |
---|---|
class getClass() | 返回当前页面所在类 |
int hashCode() | 返回当前页面的 hash 代码 |
String toString() | 将当前页面所在类转换成字符串 |
boolean equals(Object obj) | 比较对象和指定的对象是否相等 |
void copy (Object obj) | 把对象复制到指定的对象中 |
Object clone() | 复制对象 |
Cookie 不是 JSP 内置对象,而是由 Netscape 公司发明,用来跟踪用户会话(session)的方式。
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 |
cookie cookieName = new cookie(String name,String value);
response.add(cookieName);
cookie.setMaxAge(60*60*24);
request.getCookies();
注:对cookie进行设置操作后,需要重新写入response请求头中
${EL表达式}
例子:
${param.name} 等同于 <%=request.getParameter(“name”)%>
EL算术运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加 | ${5+7} | 12 |
- | 减 | ${7-5} | 2 |
* | 乘 | ${2*5} | 10 |
/或div | 除 | ${10/2} | 5 |
%或mod | 取模 | ${10/3} | 1 |
注:如果+两边有字符串,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 |
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 |
1). 和 [ ]
.
和[ ]
是 EL 中最常用的运算符,用来访问 JavaBean 中的属性和隐式对象的数据。一般情况下,.
用来访问 JavaBean 属性或 Map 类型的值,[ ]
用来访问数组或者列表的元素。
2)empty
empty 用来判断 EL 表达式中的对象或者变量是否为空。若为空或者 null,返回 true,否则返回 false。
3)条件运算符
EL 表达式中,条件运算符的语法和 Java 的完全一致,如下:
${条件表达式?表达式1:表达式2}
其中,条件表达式用于指定一个判定条件,该表达式的结果为 boolean 类型。如果该表达式的运算结果为 true,则返回表达式 1 的值;反之,返回表达式 2 的值
序号 | 优先级 |
---|---|
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} |
内置对象 | 说明 |
---|---|
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 要满足以下要求:
示例:
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;
}
}
自定义标签的优点如下:
使用自定义标签步骤如下:
使用 taglib 指令指定 tld 文件的路径:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %>
其中:prefix 指定自定义标签的前缀,uri 指定 tld 文件的路径
使用自定义标签
或
标签体
其中:prefix 表示自定义标签的前缀,tagname 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。
关键点:前缀:标签名、标签属性名、标签属性值
注:tld文件中只能有一对taglib标签,taglib标签下可以有多个tag子标签
属 性 | 说 明 |
---|---|
tlib-version | 标签库版本号 |
jsp-version | JSP版本号 |
short-name | 当前标签库的前缀 |
uri | 页面引用的自定义标签的 uri 地址 |
name | 自定义标签名称 |
tag-class | 自定义标签实现类路径 |
description | 自定义标签的功能描述 |
attribute | 自定义标签的指定属性,可以有多个 |
属 性 | 说 明 |
---|---|
name | 自定义标签名称 |
tag-class | 自定义标签实现类 |
body-content | 有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理) |
description | 自定义标签的功能描述 |
attribute | 自定义标签功能的指定属性,可以有多个 |
variable | 自定义标签的变量属性 |
属 性 | 说 明 |
---|---|
name | 属性名称 |
description | 属性描述 |
required | 指定属性是否是必须的,默认值:false |
rtexprvalue | 属性值是否支持 JSP 表达式 |
type | 定义该属性的 Java 类型,默认值:String |
fragment | 如果声明了该属性,属性值将被视为一个 JspFragment |
注:在自定义标签中设置属性,自定义标签类中必须要有setter()方法,如下:
//为自定义标签设置了message属性
public void setter(String message){
this.message=message;
}
属 性 | 说 明 |
---|---|
declare | 变量声明 |
description | 变量描述 |
name-from-attribute | 指定的属性名称,其值为变量,在调用 JSP 页面时可以使用的名字 |
name-given | 变量名(标签使用时的变量名) |
scope | 变量的作用范围,有 3 个值:NESTED 开始和结束标签之间、AT_BEGIN 从开始标签到页面结束、AT_END 从结束标签之后到页面结束 |
variable-class | 变量的 Java 类型,默认值:String |
这是标签体的内容
Commons-FileUpload 组件具有以下特点:
Commons-FileUpload 组件依赖于 FileUpload 和 Commons,需要 commons-fileupload-xx.jar 和 commons-io-xx.jar 文件。
方 法 | 说 明 |
---|---|
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) | 设置转换时所使用的字符集编码 |
方 法 | 说 明 |
---|---|
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 对象中保存的主体内容保存到指定的文件中。 |
创建 ServletFileUpload 实例需要依赖 FileItemFactory 工厂接口。DiskFileItemFactory 是 FileItemFactory 接口的实现类,该类的常用方法如下:
方 法 | 说 明 |
---|---|
public void setSizeThreshold(int sizeThreshold) | 设置内存缓冲区的大小 |
public void setRepository(String path) | 设置临时文件存放的目录 |
创建上传文件表单时,需要注意以下几点:
拓展
表单的 enctype 属性有以下 3 个值:
注意:MySQL 8.0 及之后的版本与之前的数据库连接有所不同:
INSERT INTO 表名 (NAME,url,age,country) VALUES ('京东', 'https://www.jd.com/', 15, 'CN');
--%>
DELETE FROM website WHERE id = ?
--%>
UPDATE website SET name="biancheng" WHERE id = ?
--%>
SELECT * from website;
url="jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
user=“root” password=“root”/>
## 16.2 插入数据
```jsp
INSERT INTO 表名 (NAME,url,age,country) VALUES ('京东', 'https://www.jd.com/', 15, 'CN');
--%>
DELETE FROM website WHERE id = ?
--%>
UPDATE website SET name="biancheng" WHERE id = ?
--%>
SELECT * from website;