Java精选笔记_JSP技术

JSP技术

什么是JSP

在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术。

在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。为了与普通HTML有所区别,JSP文件的扩展名为 .jsp。

在jsp文件中Java代码必须包含在“<%”和“%>”之间

客户端通过表单将数据提交到action指定的目的地址。在这个目的地址指向的页面,需要将数据提取出来。这就需要一个动作脚本来完成动态网页技术中的数据交互。这种动作脚本与HTML语言相结合来获取和处理表单提交的数据。

JSP容器:org.apache.jasper.servlet.JspServlet

负责把JSP源码翻译成java文件,调用程序编译class,然后加载class作为Servlet执行

JSP运行机制

虽然在web.xml文件中没有与JSP相关的配置,但Web服务器仍然可以根据URL找到对应的JSP文件。这是因为在Tomcat服务器的web.xml(D:\apache-tomcat-7.0.27\conf\web.xml)文件中实现了JSP的相关配置

从配置信息可以看出,以.jsp为扩展名的URL访问请求都是由org.apache.jasper.servlet.JspServlet处理,所以,Tomcat中的JSP引擎就是这个Servlet程序,该Servlet程序实现了对所有JSP页面的解析。

JSP文件也可以像Servlet程序一样,在web.xml文件中进行注册和映射虚拟路径。注册JSP页面的方式与Servlet类似,只需将<servlet-class>元素修改为<jsp-file>元素即可。

服务器管理JSP页面分为两个阶段

(1)当有一个JSP请求到来时,服务器会首先检验JSP页面的语法是否正确,将JSP转换成Servlet(Servlet就是用Java语言实现的CGI程序,后面章节将详细介绍)源文件,然后调用javac工具类编译Servlet源文件生成.class文件,这就是转化阶段。

(2)Servlet容器加载转化后的Servlet类,实例化一个对象处理客户端的请求。在请求处理完成后,响应对象被服务器接受,服务器将HTML的格式的响应信息发送给客户端,这一阶段便是执行阶段。

分析JSP所生成的Servlet代码

当用户第一次访问JSP页面时,该页面都会被JspServlet翻译成一个Servlet源文件,然后将源文件编译为.class文件。Servlet源文件和.class文件都放在“Tomcat安装目录/work/Catalina/localhost/应用名/”目录下。由JSP文件翻译成的Servlet类带有包名,包名为org.apache.jsp

JSP和HTML的区别

HTML:只能展示静态WEB资源,不能写JAVA代码,浏览器直接解析

HTML在静态WEB资源展示效率极高,所以如果仅仅展示静态WEB资源,建议HTML

JSP: 可以展示动态和静态的WEB资源,可以写JAVA代码。先翻译成java,再编译成class,再执行class,再写响应体,再发送响应体,浏览器接收响应体翻译成html代码,然后再解析执行

JSP因为可以写JAVA代码,可以轻松展示动态WEB资源,需要展示动态的WEB资源,JSP

JSP基本语法

JSP网页主要分为脚本和网页数据两部分。网页数据就是JSP服务器不需要处理的部分。例如,HTML的内容会直接送到客户端执行。脚本是必须经由JSP处理的部分,大部分脚本都以XML作为语法基础,其可以分为四种类型:JSP脚本、编译指令、动作标签和表达式语言

JSP模板元素

JSP页面可以按照编写HTML页面的方式来编写,其中可以包含HTML文件的所有静态内容,在静态的HTML内容之中可以嵌套JSP的其他各种元素来产生动态内容和执行业务逻辑。

JSP页面中的静态HTML内容称之为JSP模版元素。JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

JSP表达式

JSP表达式(expression)用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在“<%” 开头和以“%>”结尾的标记中

<%= expression %>

JSP表达式中的变量或表达式后面不能有分号(;)

翻译成:out.print(表达式);

<% out.print(a+b) %> 等价于 <%=a+b %>

由于表达式的书写格式比较繁琐,而且完全可以由JSP中的内置对象out(在后面章节中会作介绍)来替代,因此在实际开发中,JSP表达式很少被用到。

JSP脚本片段

<% Java代码 %>JSP脚本片断是指嵌套在<% 和 %>之中的一条或多条Java程序代码,这些Java代码必须严格遵守Java语法规范,否则编译会报错。

<% 和 %>之间的代码 就是一个JSP脚本片段,该脚本片段中的Java代码必须严格遵守Java语法规范,在每个执行语句后都使用分号(;)结束。

在一个JSP页面中,可以出现多个脚本片段,在两个或者多个脚本片段之间可以嵌套文本、HTML标记或其它JSP元素,并且这些脚本片段中的代码可以互相访问。

JSP声明

<%! 声明方法、声明类、声明变量 %>

会把代码翻译到 成员变量的位置上

在一个JSP页面中可以有多个JSP声明,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句。

注意:JSP脚本与JSP的本质区别在于,两者翻译的位置不同。前者在方法内部,所以不能声明方法,

后者在成员变量位置所以只能用于声明变量或方法。

JSP注释

JSP注释:<%-- JSP注释 --%>

通常用来编写JSP说明文档

1、HTML页面不会显示

2、HTML源码中不可见

3、翻译后的java代码中不可见

Java注释

<%/* Java注释 */%> 多行注释

<%// Java注释 %> 单行注释

1、HTML页面不会显示

2、HTML源码中不可见

3、翻译后的java代码中就是java注释

HTML注释:<!-- HTML注释 -->

1、HTML页面不会显示

2、HTML源码中可见

3、翻译后的java代码中以字符流输出

JSP编译指令

它不向客户端输出任何内容,是用来设置全局变量、声明类、方法和输出内容的类型的指令。

page页面指令

<%@ page pageEncoding="utf-8" %>

在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这时,可以通过page指令来实现。

用来定义JSP文件中的全局属性,这些全局属性都是影响整个页面的重要属性。一个JSP文件中可以有多个页面指令,在JSP文件被解析为Java代码时,这些页面指令也被解析为对应的Java代码。

page指令可以在一个JSP文件中多次、多处使用,但是其中的属性却只能使用一次(import除外),重复的属性设置将会覆盖掉先前的设置。无论用户将page指令放在JSP程序的任何地方,它的作用范围都是整个JSP页面。

属性 描述 默认值 例子

language 指定使用的脚本语言,目前只能为“Java” “Java” language=”Java”

import 和Java代码中import的作用一样,如果有多个包,用“,”隔开 默认忽略该属性 import=”Java.io.*,Java.utils.*”

session 这个页面是否参与一个指定的HTTP会话true session=”true”

buffer 指定客户端输出流的缓冲模式,可以为一个数值或none 不小于8kb buffer=”32kb”

autoFlash 设置当缓冲区满时,是否实现自动刷新 true autoFlush=”true”

Info 指定关于该JSP文件的信息 默认忽略该属性 info=”第一个JSP页面”

isErrorPage 表明当前页是否为其他页的errorPage,由此决定当前页是否可以使用exception对象false isErrorPage=”false”

errorPage 定义当前页运行出现异常时调用的页面 默认忽略该属性 errorPage=”error.jsp”

isThreadSafe 指定该JSP文件是否能多线程使用,由此判断是否可以处理多个用户的请求true isThreadSafe=”true”

contentType 定义JSP字符编码和页面响应的MIME类型 TYPE=text/html

指令响应体字符集并指定浏览器解码字符集

例如:contentType="text/html; charset=UTF-8"

翻译后的java代码:response.setContentType("text/html;charset=UTF-8");

如果设置了contentType,pageEncoding就会被覆盖

CHARSET=iso8859-1 contentType=”text/html;charset=UTF-8”

pageEncoding 指定该JSP文件的字符编码 pageEncoding=”iso-8859-1” pageEncoding=”UTF-8”

isELIgnored 指定EL(表达式语言)是否被忽略,如果为true,则容器忽略“${}”表达式的计算 Servlet2.3之前的版本忽略该属性 isELIgnored=”true”

taglib指令

<%@ taglib prefix="tagPrefixL" uri="taglibURL" %>

当JSP页面中引用了用户自定义标签时,用来声明这些用户自定义的标签的。

JSP引擎使用taglib指令以确定在JSP中遇到用户自定义标签时应该怎样去做

include指令

<%@ include file="header.jsp" %>

静态包含指令:本质包含 JSP源码。 把两个JSP源码合并成一个

<%@include file="/WEB17/include/part.jsp" %>

作用: 提高代码扩展性。

动态包含:<jsp:include page="relativeURL" />

本质:包含响应体 包含的是结果

开发几乎不用,因为很难进行代码扩展

用来将指定位置上的资源包含在当前JSP文件中。在JSP文件被编译为Java文件时,这些被包含的资源会被作为JSP文件的一部分被翻译为Java文件。所以这些资源可以看作是JSP文件的一部分

有时候,需要在JSP页面静态包含一个文件,例如HTML文件,文本文件等,

file属性用于指定被引入文件的相对路径。

(1)被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。

(2)除了指令元素之外,被引入的文件中的其它元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。

(3)file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录。

标准动作标记

JSP引擎的行为,影响JSP运行时的功能,并返回客户端的响应。

<jsp:include>动作指令

用于在客户端请求时间内把静态或者动态的资源包含在JSP页面内。包含的静态或动态的资源在page属性中用URL的形式指定

include动作指令可以在JSP页面中动态包含一个文件,这与include指令不同,前者可以动态包含一个文件,文件的内容可以是静态的文件也可以是动态的脚本,而且当包含的动态文件被修改的时候JSP引擎可以动态对其进行编译更新。而include指令仅仅是把一个文件简单的包含在一个JSP页面中,从而组合成一个文件,仅仅是简答的组合的作用。

<jsp:include page="fileName" flush="true"/>

<jsp:forward>动作指令

可以用来控制网页的重定向。即将请求转发到其他的JSP页面、HTML页面或者Servlet类。

<jsp:forward page="url"/>

只要指明page的值,当JSP执行到这行代码的时候就可以直接跳转到对应的页面。

<jsp:param>动作指令

主要用于传递参数,为其他动作指令提供附加信息,它必须和<jsp:include>、<jsp:forward>等动作指令一起使用,可以将<jsp:param>动作指令中的值传递到其他动作指令所要加载的文件中去,从而实现向所加载的页面动态传递参数的功能。

<jsp:param name="paramName" value="paramValue"/>

通过<jsp:param/>可以给请求的页面传输一个或多个参数。如果要传输多个参数,可以使用多个<jsp:param/>标签。当给一个页面传输参数时,该页面肯定是动态页面。

<jsp:forward page=""/>

<jsp:param name="" value=""/>

<jsp:include page=""/>

<jsp:param name="" value=""/>

<jsp:useBean />

<jsp:setProperty property="" name="" value=""/>

<jsp:getProperty property="" name=""/>

JSP隐式对象

隐式对象

JSP提供了9个隐式对象,它们是JSP默认创建的,可以直接在JSP页面使用。

out对象

在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。

out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。

pageContext对象

在JSP页面中,要想获取JSP的另外八个隐式对象,可以使用pageContext对象。

pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。

pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。pageContext对象存储数据是通过操作属性来实现的

pageContext对象的作用范围有四个值,具体如下:

pageContext.PAGE_SCOPE:表示页面范围

pageContext.REQUEST_SCOPE:表示请求范围

pageContext.SESSION_SCOPE:表示会话范围

pageContext.APPLICATION_SCOPE:表示Web应用程序范围

需要注意的是,当使用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。

exception对象

在JSP页面中,经常需要处理一些异常信息,这时,可以通过exception对象来实现。

exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。

需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=”true”%>的页面。

JSP四大作用域

PageScope 当前页面中有效 pageContext PageContext

RequestScope 一次请求范围 request HttpServletRequest

SessionScope 一次会话范围 session HttpSession

ApplicationScope 应用范围 application ServletContext

不去向pageContext作用域中直接存放数据,因为不如直接创建一个变量。

JSP的四大作用域,从request开始进行考虑----》session----》application

JSP标签

<jsp:include>标签

在JSP页面中,为了把其它资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供了<jsp:include>标签

<jsp:include page="relativeURL" flush="true|false" />

page属性用于指定被引入资源的相对路径,flush属性用于指定是否将当前页面的输出内容刷新到客户端,默认情况下,flush属性的值为false。

include指令和<jsp:include>标签的比较

<jsp:include>标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。

<jsp:include>标签中引入的资源是在运行时才包含,而且只包含运行结果。而include指令引入的资源是在编译时期包含,包含的是源代码。

<jsp:include>标签运行原理与RequestDispatcher.include方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制。

<jsp:forward> 标签

在JSP页面中,经常需要将请求转发给另外一个资源,这时,除了RequestDispatcher接口的forward()方法可以实现外,还可以通过<jsp:forward>标签来实现。

<jsp:forward page="relativeURL" />

page属性用于指定请求转发到的资源的相对路径,该路径是相对于当前JSP页面的URL。

注意:如果在JSP页面中直接调用pageContext.forward()方法,当forward()方法后还有语句需要执行时,程序会发生IllegalStateException异常。但是,如果在JSP页面中使用<jsp:forward>标签,由于<jsp:forward>标签翻译的Servlet程序会使用return语句终止执行后面的语句,因此,程序会避免报错。

内置对象

为了简化JSP页面开发而建立的一些内部对象。这些对象不需要声明,可以在程序中直接使用。

内置对象本质:翻译后java代码中的_jspService()方法内部的变量

out - javax.servlet.JspWriter

用来向客户端浏览器输出信息的数据流

动态的向JSP页面输出字符流,从而把动态的内容转化成HTML形式来展示。这个对象在任何JSP页面中都可以任意访问。

方法

clear() 清除缓冲区的数据,但是仅仅是清除,并不向用户输出

clearBuffer() 清除缓冲区的数据,同时把这些数据向用户输出

close() 关闭out输出流

flush() 输出缓冲区的内容

isAutoFlush() 判断是否为自动刷新

print(String str) 输出带HTML格式的各种类型的数据,下一个输出语句不换行

println(String str) 输出带HTML格式的各种类型的数据,下一个输出语句换行

request - HttpServletRequest

包含客户端请求所有信息

获取用户提交的表单信息

getParameter(Sting name) 获取客户端传给服务器的参数值,name指定表单中参数的名字

getParameterNames() 获取客户端传给服务器的所有参数的名字,返回的结果是一个枚举实例

getParameterValues(Sting name) 获得某一个参数的所有的值,name指定参数名字

获取服务器端和客户端信息

getCookies() 返回客户端所有的Cookie对象,结果是一个Cookie数组

getCharacterEncoding() 返回客户端请求中字符的编码方式

getContentLength 返回客户端请求的body的长度

getMethod() 返回客户端向服务器传输数据的方法,如get、post、header、trace等

getRequestURL() 获取发送请求的客户端地址

getRemoteAddr() 获取客户端的IP地址

getServerName() 获取服务器的名字

getServerPort() 获取服务器的端口号

getServletPath() 获取客户端所请求的脚本文件的文件路径

request中保存和读取共享数据

getAttribute(Sting name) 获得request对象中某一个属性的值,name为属性名,如果该属性不存在,则返回null

setAttribute(Sting name,Java.long.Object.objt) 给request对象设置一个名字为name的属性值,该值有objt设置

removeAttribute(String name) 移除request对象中名字为name的属性

getAttributeNames() 返回request对象中所有属性的名字,结果是一个枚举类型

response - HttpServletResponse

页面传回给用户端的相应信息

页面转向

sendRedirect(String location) 发响应发送到另一个位置去处理

<jsp:forward>动作指令也能够实现页面的转向,区别

<jsp:forword>:1、JSP引擎控制权的转向,地址栏中不会显示转向后地址2、转向地址必须是相对路径,转向页面与转向页面必须位于一个Web应用中

sendRedirect():1、完全跳转,浏览器将会得到跳转后地址,并重新发送链接2、sendRedirect()方法中location用来指定转向地址,既可以是相对路径,也可以是一个合法的URL

方法

addCookie(Cookie cookie) 添加一个Cookie对象,用来保存客户端信息

addHeader(Sting name, String value) 添加HTTP文件头信息,如果已有同名的Header,则覆盖它

containHeader(String name) 判断名字为name的HTTP文件头是否已存在

flushBuffer() 强制将当前缓冲区的内容发送到客户端

getBufferSize() 返回缓冲区的大小

getOutputStream() 获取到客户端的输出流对象

sendError(int) 向客户端发送错误信息

setHeader(String name, String value) 设置名字为name的HTTP文件头的值,新设置的值可以覆盖旧值

动态设置页面返回的MIME类型

setContentType(Sting contentType) 设置响应的MIME类型(多功能Internet邮件扩充服务,即文件的类型)

session - HttpSession

为发送请求的客户建立会话

用来保存每个用户的信息。例如,登录名、密码、上次访问时间等,从而可以跟踪每个用户的操作状态。

当用户首次登录系统时,Web容器就会给该用户创建一个唯一用来标识该用户会话的session id。为了跟踪用户的操作状态,在多个页面之间保存共享信息,JSP中提供了session对象。当该用户退出系统时,这个session自动消失

方法

getCreationTimes() 返回该session被创建的时间

getId() 返回唯一标识该session的ID,该ID由一个32位的十六进制字符串组成,可以保证服务器中所创建的所有session对象都不相同。

getLastAccessedTime() 返回与该session相关的客户端最后发送请求的时间

session中保存和读取共享数据

getAttribute(String name) 从session中获取名字为name的属性

getAttributeNames() 返回存储在session对象中的所有属性的名字,结果为一个枚举类型

removeAttribute(String name) 删除名字为name的属性

setAttribute(String name, Java.lang.Object value) 设置一个名字为name的属性,其值为value

session对象中保存的共享信息的范围是整个会话过程,而request对象中保存共享信息的范围则是提交和被提交的页面

session对象的生命周期

session对象的创建是由服务器完成的,当客户端第一次请求服务器时由服务器创建。如果会话过程一直存在,则session对象也将一直存在下去。只有当session过期、客户端关闭浏览器或者服务器端调用了session的invalIDate()方法时session对象才被释放掉,结束其生命周期

application - ServletContext

保存整个应用程序的共享信息

最大的域对象,针对整个项目

从Web应用开始运行开始,这个对象就会被创建。在整个Web应用运行期间可以在任何JSP页面中访问这个对象

方法

getAttribute(String name) 返回application对象中名字为name的属性的值

getAttributeNames() 返回application对象中所有属性的名字,结果为一个枚举类型

getInitParameter(String name) 返回application对象中名字为name的属性的初始值

getServletInfo() 返回Servlet编译器的当前版本的信息

setAttribute(String name,Object object) 在application对象中设置一个名字为name的属性,其值为object

config - ServletConfig

读取初始化参数,代表当前JSP页面的配置信息

但JSP页面通常无须预先进行配置,也就不存在配置信息了。

方法

getInitParameter(String name) 返回String类型的初始化参数

getInitParameterNames(String name) 返回所有初始化参数的名称

getServletName() 获得当前JSP页面名称

getServletContext() 获得当前JSP页面的服务器上下文环境

exception - Exception

获取运行时的异常

用来封装运行时出现的异常信息。该对象只能被处理错误的页面使用,一般用来处理错误的页面会在其页面指令中声明“isErrorPage=true”

方法

getMessage() 返回描述异常的消息

toString() 返回关于异常的简短描述消息

printStackTrace() 显示异常及其栈中的跟踪信息

page - Object

代表JSP网页本身

有点类似于类中的this指针,它表示当前JSP页面转换后生成的Servlet类的实例

方法

getClass() 返回当前Object的类

toString() 返回当前Object对象的字符串

hashCode() 返回当前Object的哈希代码

equals(Object o) 比较当前对象与给定的对象是否相等

copy(Object o) 把当前对象赋值到给定的对象中去

clone() 对当前对象进行克隆操作

pageContext - PageContext

保存当前JSP页面的共享信息

又被称为JSP作用域通信对象。该对象提供了访问其他内置对象的统一入口,使用户可以方便地访问页面作用域中定义的所有内置对象。

方法

getRequest() 返回当前页面的request对象

getResponse() 返回当前页面的response对象

getServletConfig() 返回当前页面的servletConfig对象

getServletContext() 返回当前页面的ServletContext对象,这个对象是所有的页面共享的

getSession() 返回当前页面的session对象

setAttribute() 设置默认页面范围或特定对象范围之中的的对象

removeAttribute() 删除默认页面对象或特定对象范围之中的已命名对象

JSP中的中文乱码问题

UTF-8、GBK、GB2312是三种支持中文显示的编码方案

JSP页面中文乱码

一种是HTML中的中文乱码,另一中是在JSP中动态输出的中文乱码

<%@page language="java" import="java.util.*" contentType="text/html;charset=gb2312" %>

表单提交中文乱码

在Tomcat中,对于以POST方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符

new String(userName.getBytes("ISO-8859-1")."gb2312")

URL传递参数中文乱码

需要修改Tomcat的conf目录下的server.xml配置文件。修改方法是在port="8080"后面添加URI编码设置URIEncoding="gb2312"即可

<Connector port="8080" URLEncoding="gb2312" protocol="HTTP/1.1" connectionTimeout="20000" redriect="8443" />