JSP学习笔记(小结)

文章目录

一、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

ServletJSP
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指令相关属性:

属 性取 值说 明举 例
buffernone、缓冲区大小(默认值为 8kb)指定输出流是否有缓冲区<%@ page buffer=“16kb” %>
autoFlushtrue(默认值)、false指定缓冲区是否自动清除<%@ page autoFlush=“true” %>
contentTypetext/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
isErrorPagetrue、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=“这里是编程帮的页面信息”%>
isThreadSafetrue(默认值)、false是否允许多线程使用<%@ page isThreadSafe=“false” %>
language脚本语言指定页面中使用的脚本语言<%@ page language= “java” %>
sessiontrue(默认值)、false指定页面是否使用 session<%@ page session=“false” %>
isELIgnoredtrue(默认值)、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有九个内置对象

对 象类型说 明
requestjavax.servlet.http.HttpServletRequest获取用户请求信息
responsejavax.servlet.http.HttpServletResponse响应客户端请求,并将处理信息返回到客户端
outjavax.servlet.jsp.JspWriter输出内容到 HTML 中
sessionjavax.servlet.http.HttpSession用来保存用户信息
applicationjavax.servlet.ServletContext所有用户共享信息
configjavax.servlet.ServletConfig这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数
pageContextjavax.servlet.jsp.PageContextJSP 的页面容器,用于访问 page、request、application 和 session 的属性
pagejavax.servlet.jsp.HttpJspPage类似于 Java 类的 this 关键字,表示当前 JSP 页面
exceptionjava.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 由服务器生成并发送给浏览器(客户端),浏览器会将其以文本文件的形式存储在某个目录下。

识别用户通常有以下步骤:

  1. 服务器把 cookie 信息发送到浏览器,例如:用户 ID、用户名称等信息。
  2. 浏览器在本地存储这些信息。
  3. 浏览器再次向服务器发送请求时,它会同时将本地存储的 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 页面和业务逻辑分开,增加了程序的可维护性
  • 可重复调用相同的业务逻辑,增加了程序的可重用性

使用自定义标签步骤如下:

  1. 自定义标签实现类
  2. 编写 tld 标签库描述文件
  3. 在 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-versionJSP版本号
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 个值:

  1. application/x-www-form-urlencoded:默认值,用于处理少量文本数据的传递。向服务器发送大量的文件或二进制数据时,效率很低。
  2. multipart/form-data:上传二进制数据,只有使用了 multipart/form-data 才能完整的传递文件数据,进行上传操作。
  3. 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>
  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值