JSP详解

JSP三大指令

JSP 指令是为 JSP 引擎(比如 Tomcat)而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理 JSP 页面中的其余部分,JSP 引擎会根据 JSP 的指令信息来编译 JSP,生成 Java 文件。在生成的 Java 文件中,指令就不存在了。
一般都会把 JSP 指令放到 JSP 文件的最上方,但这不是必须的

JSP指令的通用格式如下:

<%@  指令名称  属性1="属性值1"  属性2="属性值2" ... 属性n="属性值n" %>
指 明说 明
pagepage 指令用于定义 JSP 页面的各种属性。page 是最复杂的一个指令,它的属性很多,常用的属性有 import、language、pageEncoding 等。
include静态包含指令,用于引入其它 JSP 文件。使用 include 指令引入的其它 JSP 文件,JSP 引擎将把这两个 JSP 文件翻译成一个 servlet,所以将 include 称为静态包含。
taglib用于在 JSP 页面中导入标签库(JSP 标准标签库、第三方标签库、自定义标签库)
  •  page 指令是页面指令,可以定义在整个 JSP 页面范围有效的属性和相关的功能。利用 page 指令,可以指定脚本语言,导入需要的类,指明输出内容的类型,指定处理异常的错误页面,以及指定页面输出缓存的大小,还可以一次设置多个属性 
  •  include 指令用于通知 JSP 引擎在翻译当前 JSP 页面时,将其他文件中的内容合并进当前 JSP 页面转换成的 Servlet 源文件中,这种在源文件级别进行引入的方式,称为静态引入,当前 JSP 页面与静态引入的文件紧密结合为一个 Servlet。这些文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码

JSP七大动作

JSP 动作利用 XML 语法格式的标记来控制服务器的行为,完成各种通用的 JSP 页面功能,也可以实现一些处理复杂业务逻辑的专用功能,主要是为了简化Java代码

JSP 动作与 JSP指令的不同之处是,JSP 页面被执行时首先进入翻译阶段,程序会先查找页面中的 JSP 指令标识;并将它们转换成 Servlet,所以,这些指令标识会首先被执行,从而设置了整个 JSP 页面,所以,JSP 指令是在页面转换时期被编译执行的,且编译一次;而 JSP 动作是在客户端请求时按照在页面中出现的顺序被执行的,它们只有被执行的时候才会去实现自己所具有的功能,且基本上是客户每请求一次,动作标识就会执行一次

JSP 动作的通用格式如下:

<jsp:动作名 属生1="属性值1"...属性n="属性值n" />

<jsp:include>动作

include 动作用于把另外一个文件的输出内容插入当前 JSP 页面的输出内容中,这种在 JSP 页面执行时引入的方式称为动态引入,这样,主页面程序与被包含文件是彼此独立的互不影响。被包含的文件可以是一个动态文件(JSP 文件)也可以是一个静态文件(如文本文件)

其语法格式如下:

<jsp:include page="relativeURL | <%=expressicry%>" />

说明:page 属性指定了被包含文件的路径,其值可以是一个代表相对路径的表达式。当路径以“/”开头时,将在当前应用程序的根目录下查找文件;如果是以文件名或文件夹名开头,将在当前页面的目录下查找文件

include 动作对包含的动态文件和静态文件的处理方式是不同的

  • 如果包含的是一个静态文件,被包含文件的内容将直接嵌入 JSP 文件中存放 <jsp:include> 动作的位置,而且当静态文件改变时,必须将 JSP 文件重新保存(重新转译),然后才能访问变化了的文件。
  • 如果包含的是一个动态文件,则由 Web 服务器负责执行,把执行后的结果传回包含它的 JSP 页面中,若动态文件被修改,则重新运行 JSP 文件时就会同步发生变化

<jsp:indude> 动作与前面讲解的 include 指令作用类似,现将它们之间的差异总结如下:

  • 属性不同
  1. include 指令通过 file 属性来指定被包含的页面,该属性不支持任何表达式。如果在 file 属性值中应用了 JSP 表达式,会拋出异常:File "/<%=fpath%>" not fount
  2. <jsp:include> 动作是通过 page 属性来指定被包含页面的,该属性支持 JSP 表达式
  • 处理方式不同
  1. 使用 include 指令包含文件时,被包含文件的内容会原封不动地插入到包含页中使用该指令的位置,然后 JSP 编译器再对这个合成的文件进行翻译,所以最终编译后的文件只有一个
  2. 使用 <jsp:include> 动作包含文件时,只有当该标记被执行时,程序才会将请求转发到(注意是转发,而不是请求重定向)被包含的页面,再将其执行结果输出到浏览器中,然后重新返回到包含页来继续执行后面的代码。因为服务器执行的是两个文件,所以 JSP 编器将对这两个文件分别进行编译
  • 包含方式不同
  1. include 指令的包含过程为静态包含,因为在使用 include 指令包含文件时,服务器最终执行的是将两个文件合成后由 JSP 编译器编译成的一个 Class 文件,所以被包含文件的内容应是固定不变的,若改变了被包含的文件,则主文件的代码就发生了改变,因此服务器会重新编译主文件。
  2. <jsp:include> 动作的包含过程为动态包含,通常用来包含那些经常需要改动的文件。
  3. 因为服务器执行的是两个文件,被包含文件的改动不会影响主文件,因此服务器不会对主文件重新编译,而只须重新编译被包含的文件即可。并且对被包含文件的编译是在执行时才进行的,也就是说,只有当 <jsp:include> 动作被执行时,使用该标记包含的目标文件才会被编译,否则,被包含的文件不会被编译
  • 对被包含文件的约定不同
  1. 使用 include 指令包含文件时,因为 JSP 编译器是对主文件和被包含文件进行合成后再翻译,所以对被包含文件有约定。例如,被包含的文件中不能使用 <html></html>、<body></body> 标记;被包含文件要避免变量和方法在命名上与主文件冲突的问题。
  2. 提示:如果在 JSP 页面中需要显示大量的文本文字,可以将文字写入静态文件中(如记事本),然后通过 include 指令或动作标记包含进来,以提高代码的可读性

<jsp:param>动作

当使用 <jsp:include> 动作标记引入的是一个能动态执行的程序时,如 Servlet 或 JSP 页面,可以通过使用 <jsp:param> 动作标记向这个程序传递参数信息

<jsp:include page="relativeURL | <%=expression%>">
    <jsp:param name="pName1" value="pValue1 | <%=expression1%>" />
    <jsp:param name="pName2" value="pValue2 | <%=expression2%>" />
    ...
</jsp:include>

//在relativeURL,jsp中通过request.getParameter("pName1")取得

说明:<jsp:param> 动作的 name 属性用于指定参数名,value 属性用于指定参数值。在 <jsp:include> 动作标记中,可以使用多个 <jsp:param> 传递参数。另外,<jsp:forward> 和 <jsp:plugin> 动作标记中也都可以利用 <jsp:param> 传递参数

<jsp:forward>动作

在大多数的网络应用程序中,都有这样的情况:在用户成功登录后转向欢迎页面,此处的“转向”,就是跳转。<jsp:forward> 动作标记就可以实现页面的跳转,用来将请求转到另外一个 JSP、HTML 或相关的资源文件中b

其语法格式如下:

<jsp:forward page="relativeURL" | "<%=expression %>" />

如果转向的目标是一个动态文件,还可以向该文件传递参数,使用格式如下:

<jsp:forward page="relativeURL" | "<%=expression %>">
    <jsp:param name="pName1" value="pValue1 | <%=expression1 %>" />
    <jsp:param name="pName2" value="pValue2 | <%=expression2 %>" />
</jsp:forward>

说明如下:

  1. page 属性用于指定要跳转到的目标文件的相对路径,也可以通过执行一个表达式来获得。如果该值以“/”开头,表示在当前应用的根目录下查找目标文件,否则,就在当前路径下查找目标文件。请求被转向到的目标文件必须是内部的资源,即当前应用中的资源。如果想通过 forward 动作转发到外部的文件中,将出现资源不存在的错误信息。
  2. forward 动作执行后,当前页面将不再被执行,而是去执行指定的目标页面
  3. 转向到的文件可以是 HTML 文件、JSP 文件、程序段,或者其他能够处理 request 对象的文件。
  4. forward 动作实现的是请求的转发操作,而不是请求重定向。它们之间的一个区别就是:进行请求转发时,存储在 request 对象中的信息会被保留并被带到目标页面中;而请求重定向是重新生成一个 request 请求,然后将该请求重定向到指定的 URL,所以,事先储存在 request 对象中的信息都不存在了

     

 


以下4个JSP动作与JavaBean有关

<jsp:plugin>动作

<jsp:useBean>动作

<jsp:setProperty>动作

<jsp:getProperty>动作

JSP九大内置对象

JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,由于JSP使用Java作为脚本语言,所以JSP将具有强大的对象处理能力,并且可以动态创建Web页面内容。但Java语法在使用一个对象前,需要先实例化这个对象,这其实是一件比较烦琐的事情。JSP为了简化开发,提供了一些内置对象,用来实现很多JSP应用。在使用JSP内置对象时,不需要先定义这些对象,直接使用即可

application对象

用于保存应用程序的公用数据,服务器启动并自动创建 application 对象后,只要没有关闭服务器,它就一直存在,所有用户共享 application 对象

  • 查找 Servlet 有关的属性信息:
  1. JSP application 对象是 javax.servlet.ServletContext 类的实例,这有助于查找有关 Servlet 引擎和 Servlet 环境的信息
  2. JSP(SERVLET)引擎名及版本号:
    <%=application.getServerInfo()%><br>
    
    服务器支持的 Server API 的最大版本号:
    <%=application.getMajorVersion ()%><br>
    
    服务器支持的 Server API 的最小版本号:
    <%=application.getMinorVersion ()%><br>
    
    指定资源(文件及目录)的 URL 路径:
    <%=application.getResource("Test.jsp")%><br>
    
    返回 Test.jsp 虚拟路径的真实路径:
    <%=application.getRealPath("Test.jsp")%>

     

  • 管理应用程序属性:
  1. application 对象与 session 对象相同,都可以设置属性。但是,两个属性的有效范围是不同的
  2. 在 session 对象中,设置的属性只在当前客户的会话范围(session scope)有效,客户超过预期时间不发送请求时,session 对象将被回收
  3. 在 application 对象中设置的属性在整个应用程序范围(application scope)都有效。即使所有的用户都不发送请求,只要不关闭应用服务器,在其中设置的属性也是有效的
  4. 书上常常会说JSP的内置对象application就起到“全局变量”的作用,那么application与全局变量主要就是生命周期的区别:application在服务器启动后生成,服务器关闭后销毁; 全局变量则只对当前page有效。这也就是网站的计数器用到application而不用全局变量的原因

  • application对象的常用方法:
方法说明

getAttribute( String arg)

获取 application 对象中含有关键字的对象
setAttribute(String key,Object obj)将参数 Object 指定的对象 obj 添加到 application 对象中,并
为添加的对象指定一个索引关键字
getAttributeNames()获取 application 对象的所有参数名字
removeAttribute(java.lang.String name)根据名字删除 application 对象的参数

out对象

作用:向客户端输出数据

  • out 对象是一个输出流,用来向客户端输出数据,可以是各种数据类型的内容,同时,它还可以管理应用服务器上的输出缓冲区,缓冲区的默认值是 8KB,可以通过页面指令 page 来改变默认大小
  • out 对象是一个继承自抽象类 javax.servlet.jsp.JspWriter 的实例,在实际应用中,out 对象会通过 JSP 容器变换为 java.io.PrintWriter 类的对象
  • 在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。数据输出完毕后要及时关闭输出流
out对象常用的方法
方法说明
void print(各种数据类型)将指定类型的数据输出到 HTTP 流,不换行
void println(各种数据类型)将指定类型的数据输出到 HTTP 流,并输出一个换行符
void newline输出换行字符
getBufferSize()获取当前缓冲区大小
getRemaining()获取当前使用后剩余缓冲区剩余大小
flush()、clear()、clearBuffer()清除缓冲区
isAutoFlush()缓冲区是否自动刷新

应用: 

  • 向客户端输出数据

        在使用 print() 或 println() 方法向客户端输出时,由于客户端是浏览器,因此可以使用 HTML 中的一些标记控制输出格式。例如:

out.println("<font color=red>Hello </font>");
  • 管理输出缓冲区

        默认情况下,服务端要输出到客户端的内容不直接写到客户端,而是先写到一个输出缓冲区中。使用 out 对象的 getBufferSize() 方            法取得当前缓冲区的大小(单位是 KB),用 getRemaining() 方法取得当前使用后还剩余的缓冲区的大小(单位是 KB)

        JSP 只有在下面三种情况下,才会把缓冲区的内容输出到客户端。

  1. 该 JSP 网页已完成信息的输出
  2. 输出缓冲区己满
  3. JSP 中调用了 out.flush() 或 response.flushBuffer()

        另外,调用 out 对象的 clear() 方法,可以清除缓冲区的内容,类似于重置响应流,以便重新开始操作。如果响应已经提交,则会产            生IOException 异常。此外,clearBuffer() 可以清除缓冲区“当前”内容,而且即使内容已经提交给客户端,也能够访问该方法

request对象

客户端可通过 HTML 表单或在网页地址后面提供参数的方法提交数据,然后通过 request 对象的相关方法来获取这些数据。request 对象封装了客户端的请求信息,包括用户提交的信息及客户端的一些信息,服务端通过 request 对象可以了解到客户端的需求然后做出响应

request 对象是 HttpServletRequest(接口)的实例。请求信息的内容包括请求的标题头(Header)信息(如浏览器的版本信息语言和编码方式等),请求的方式(如 HTTP 的 GET 方法、POST 方法等),请求的参数名称、参数值和客户端的主机名称等

表1 request对象常用的方法
方法说明
Object getAttribute(String name)用于返回由 name 指定的属性值,如果指定的属性值不存在,
则返回一个 null 值
Enumeration getAttributeNames()用于返回 request 对象的所有属性的名称集合
String getCharacterEncoding()用于返回一个 String,它包含请求正文中所使用的字符编码
int getContentLength()用于返回请求正文的长度(字节数),如果不确定,返回 -1
String getContenType()得到请求体的 MIME 类型
ServletlnputStream getInputStream()用于返回请求的输入流,用来显示请求中的数据
String getParameter(String name)用于获取客户端传送给服务器端的参数。主要由 name 指定,
通常是表单中的参数
Enumeration getParameterNames()用于获取客户端传送的所有参数的名字集合
String getParameterValues(String name)用于获得指定参数的所有值,由 name 指定
String getProtocol()用于返回客户端向服务器端传送数据所依据的协议名称
String getMethod()用于获得客户端向服务器端传送数据的参数方法,主要有两个,
分别是 get() 和 post()
String getServerName()用于获得服务器端的主机名字
int getServletPath()用于获得 JSP 文件相对于根地址的地址
String getRemoteAddr()用于获得客户端的网络地址
String getRemoteHost()用于获取发送此请求的客户端主机名
String getRealPath(String path)用于获取一虚拟路径的真实路径
cookie[] get Cookie()用于获取所有的 Cookie 对象
void setAttribute(String key,Object obj)设置属性的属性值
boolean isSecure()返回布尔类型的值,用于确定这个请求是否使用了一个安全协
议,如 HTTP
boolean isRequestedSessionldPromCookie()返回布尔类型的值,表示会话是否使用了一个 Cookie 来管理
会话 ID
boolean isRequestedSessionIdFromURL()返回布尔类型的值,表示会话是否使用了一个URL来管理会话
ID
boolean isRequestedSessionldFromVoid()检查请求的会话 ID 是否合法

应用:

  • 获取客户端信息
  • 获取请求参数(getParameter)
  • 在作用域中管理属性
  1. 在进行请求转发时,往往需要把一些数据带到转发后的页面进行处理。这时,就可以使用 request 对象的 setAttribute() 方法设置数据在 request 范围内存取(只适用于请求转发)
  2. 在页面使用 request 对象的 setAttribute(“key”,value) 方法,可以把数据 value 设定在 request 范围内。请求转发后的页面使用 getAttribute(“key”) 就可以取得数据 value
  • 获取 Cookie
  1. 通过 request 对象的 getCookies() 方法获取 Cookie 中的数据。获取 Cookie 的方法:Cookie[] cookie=request.getCookies();
  2. 通过 response 对象的 addCookie() 方法添加一个 Cookie 对象。添加 Cookie 的方法:response.addCookie(Cookie cookie)
  • 访问安全信息

    request 对象提供了访问安全属性的方法,主要包括以下 4 种:

  1. isSecure()。
  2. isRequestedSessionldFromCookie()。
  3. isRequestedSessionldFromURL()。
  4. isRequestedSessionldFromValid()。


    例如,可使用 request 对象来确定当前请求是否使用了一个类似 HTTP 的安全协议:
    用户安全信息:<%=reguest,isSecure() %>

  • 访问国际化信息

    很多 Web 应用程序都能够根据客户浏览器的设置做出国际化响应,这是因为浏览器会通过 accept-language 的 HTTP 报头向 Web 服        务器指明它所使用的本地语言,JSP 开发人员就可以利用 request 对象中的 getLocale() 和 getLocales() 方法获取这一信息,获取的信        息属于 Java.util.Local 类型

response对象

session对象

pageContext 对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值