jsp page

来源:互联网 发布:php设置redis过期时间 编辑:程序博客网 时间:2024/06/08 08:02

JSP 起源

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

如果使用 Servlet 程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用 Java 程序代码产生,整个 Servlet 程序的代码将非常臃肿,编写和维护都将非常困难。

对大量静态内容的美工设计和相关 HTML 语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂 Java 编程,更是无法来完成这样的工作。

为了弥补 Servlet 的缺陷, SUN 公司在 Servlet 的基础上推出了 JSP ( Java Server Pages )技术作为解决方案。

JSP 是简化 Servlet 编写的一种技术,它将 Java 代码和 HTML 语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用 Java 代码来编写,而对固定不变的静态内容采用普通静态 HTML 页面的方式编写。

JSP 页面是由 HTML 语句和嵌套在其中的 Java 代码组成的一个普通文本文件, JSP 页面的文件扩展名必须为 .jsp 。

在 JSP 页面中编写的 Java 代码需要嵌套在 <% 和 %> 中,嵌套在 <% 和 %> 之间的 Java 代码被称之为脚本片段( Scriptlets ),没有嵌套在 <% 和 %> 之间的内容被称之为 JSP 的模版元素。

JSP 中的 Java 代码可以使用 out.println 语句将其他 Java 程序代码产生的结果字符串输出给客户端,也可以使用 System.out.println 语句将它们打印到命令行窗口。

JSP 文件就像普通的 HTML 文件一样,它们可以放置在 WEB 应用程序中的除了 WEB-INF 及其子目录外的其他任何目录中, JSP 页面的访问路径与普通 HTML 页面的访问路径形式也完全一样。

什么是 jsp ?

JSP 全称是 Java Server Pages ,它和 servle 技术一样,都是 SUN 公司定义的一种用于开发动态 web 资源的技术。

JSP 这门技术的最大的特点在于,写 jsp 就像在写 html ,但它相比 html 而言, html 只能为用户提供静态内容,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。

Jsp 快速入门:在 jsp 页面中输出当前时间。

不管是 JSP 还是 Servlet ,虽然都可以用于开发动态 web 资源。但由于这 2 门技术各自的特点,在长期的软件实践中,人们逐渐把 servlet 作为 web 应用中的控制器组件来使用,而把 JSP 技术作为数据显示模板来使用。

其原因为,程序的数据通常要美化后再输出:

让 jsp 既用 java 代码产生动态数据,又做美化会导致页面难以维护。

让 servlet 既产生数据,又在里面嵌套 html 代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的, servlet 只负责响应请求产生数据,并把数据通过转发技术带给 jsp ,数据的显示 jsp 来做。

JSP 的运行原理!

WEB 容器( Servlet 引擎)接收到以 .jsp 为扩展名的 URL 的访问请求时,它将把该访问请求交给 JSP 引擎去处理。 Tomcat 中的 JSP 引擎就是一个 Servlet 程序,它负责解释和执行 JSP 页面。

每个 JSP 页面在第一次被访问时, JSP 引擎将它翻译成一个 Servlet 源程序,接着再把这个 Servlet 源程序编译成 Servlet 的 class 类文件,然后再由 WEB 容器( Servlet 引擎)像调用普通 Servlet 程序一样的方式来装载和解释执行这个由 JSP 页面翻译成的 Servlet 程序。

Tomcat 5.x 把为 JSP 页面创建的 Servlet 源文件和 class 类文件放置在“ <TOMCAT_HOME>\work\Catalina\< 主机名 >\< 应用程序名 >\ ”目录中, Tomcat 将 JSP 页面翻译成的 Servlet 的包名为 org.apache.jsp.<JSP 页面在 WEB 应用程序内的目录名 >

JSP 规范也没有明确要求 JSP 中的脚本程序代码必须采用 Java 语言, JSP 中的脚本程序代码可以采用 Java 语言之外的其他脚本语言来编写,但是, JSP 页面最终必须转换成 Java Servlet 程序。

可以在 WEB 应用程序正式发布之前,将其中的所有 JSP 页面预先编译成 Servlet 程序。

分析 JSP 所生成的 Servlet 代码

JSP 页面翻译成的 Servlet 继承了 org.apache.jasper.runtime.HttpJspBase 类, HttpJspBase 类是 HttpServlet 的一个子类,因此 JSP 页面翻译成的 Servlet 是 HttpServlet 的一个孙子类。 HttpJspBase 类实现了 javax.servlet.jsp.HttpJspPage 接口中的部分方法,因此, HttpJspBase 类是抽象的。

SUN 公司为 JSP 的 WEB 容器开发商和 JSP 页面开发人员提供了一套专门应用于开发 JSP 程序的 Java 类,这套 Java 类被称为 JSP API 。 HttpJspPage 接口和 JspPage 接口属于 JSP API ,在 HttpJspPage 接口中只定义了一个 _jspService 方法,但它继承了 JspPage 接口, JspPage 接口中定义了两个方法: jspInit() 和 jspDestroy() 。

HttpJspBase 的 init 方法调用了 jspInit 和 _jspInit 方法, destroy 方法内部调用了 jspDestroy 和 _jspDestroy 方法, service 方法内部调用了 _jspService 方法。在 HttpJspBase 中实现的 init 、 service 和 destroy 方法都被声明成了 final 类型。

JSP 规范也没有明确要求 JSP 中的脚本程序代码必须采用 Java 语言, JSP 中的脚本程序代码可以采用 Java 语言之外的其他脚本语言来编写,但是, JSP 页面最终必须转换成 Java Servlet 程序。

可以在 WEB 应用程序正式发布之前,将其中的所有 JSP 页面预先编译成 Servlet 程序。

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

JSP 页面中编写的所有代码,默认会翻译到 servlet 的 service 方法中, 而 Jsp 声明中的 java 代码被翻译到 _jspService 方法的外面。语法:

<% !

java 代码

%>

所以, JSP 声明可用于定义 JSP 页面转换成的 Servlet 程序的静态代码块、成员变量和方法 。

多个静态代码块、变量和函数可以定义在一个 JSP 声明中,也可以分别单独定义在多个 JSP 声明中。

JSP 隐式对象的作用范围仅限于 Servlet 的 _jspService 方法,所以在 JSP 声明中不能使用这些隐式对象。

有三种注释方式

HTML 注释(输出注释):指在客户端查看源代码时能看见注释。例如,

<!-- this is an html comment.it will show up int the response. -->

JSP 页注释(隐藏注释):指注释虽然写在 JSP 程序中,但不会发送给客户,因此在客户端查看源代码时不能看见注释。这样的注释在 JSP 编译时被忽略掉。

<%--this is a JSP comment.it will only be seen in jsp code--%>

Java 注释:只能出现在 Java 代码区中,不允许直接出现在页面中。 // 单行注释 /* 多行注释 */

Out 隐式对象

Page 指令:

Request

Response

Session

Application

Config

Page

Exception

Out

Pagecontext

page 指令可以定义如下属性:

import,contentType,pageEncoding,session,isELIgnored,buffer,autoFlush,

info,errorPage,isErrorPage,isThreadSafe,language,extends 。

-------------------------------------------

1.import 属性

import 指定 Jsp 页面转换成 servlet 应该导入的包。

【注意】

import 是 page 的属性中唯一可以在同一文档中出现多次的属性。

默认情况下, servlet 自动导入

java.lang.*

javax.servlet.*

javax.servlet.http.*

javax.servlet,jsp.*

【语法】

<%@ page import="java.util.*" %>

-------------------------------------------

2.contentType 属性

contentType 属性设置 Content-Type 响应报头,标明即将发送到客户程序的文档的 MIME 类型。

【注意】

servlet 的默认 MIME 是 text/plain,Jsp 的默认 MIME 是 text/html( 默认字符集是 ISO-8859-1)

【语法】

<%@ page contentType="text/html" %>

<%@ page contentType="text/html;charset=gb2312" %>

和下面的 scriptlet 所起到的作用基本相同

<%response.setContentType("text/html")%>

第一点不同之处是, response.setContentType 使用明确 Java 代码,而 page 指令只用到 Jsp 语法。

第二点不同之处是, page 指令被特殊处理,它们不是在出现的位置直接转换为 _jspService 代码。

这意味着 response.setContentType 能够有条件地调用,而 page 指令不能。

-------------------------------------------

3.session 属性

session 属性控制页面是否参与 HTTP 会话。

【注意】

true 值表示,如果存在已有会话,则预定义变量 session 应该绑定到现有的会话;

否则,则创建新的会话并将其绑定到 session 。

false 值表示不自动创建会话,在 Jsp 页面转换成 servlet 时,对变量 session 的访问会导致错误。

对于高流量的网站,使用 session="false" 可以节省大量的服务器内存。

但是要注意 session="false" 并不禁用会话跟踪--它只是【阻止】 Jsp 页面为那些尚不拥有会话的用户创建新的会话。

【语法】

<%@ page session="true" %><%-- 默认为 true--%>

<%@ page session="false" %>

-------------------------------------------

4.isELIgnored 属性

isELIgnored 表示是忽略 (true)JSP2.0 表达式语言 (EL) ,还是进行正常的求值 (false) 。

【注意】

JSP2.0 引入一种简洁的表达式语言,在 Jsp 页面中可以用它来访问请求参数、 cookie 、 HTTP 报头、 bean 属性和 Collection 的元素。

表达式的形式为 ${exdivssion}

【语法】

<%@ page isELIgnored="true" %>

<%@ page isELIgnored="false" %>

-------------------------------------------

5.buffer 属性

buffer 属性指定 out 变量使用的缓冲区的大小。

【注意】

服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。

例如 <%@ page buffer="32kb" %>

表示应该对文档的内容进行缓冲,

除非累计至至少为 32KB 或页面完成或调用 response.flushBuffer( 明确地对输出执行晴空 ) ,

否则不将文档发送给客户。

默认的缓冲区大小和服务器有关,但至少 8KB 。

如果将缓冲区功能关闭,应该十分小心,这样做要求设置报头或状态代码的 Jsp 元素都要出现在文件的顶部,位于任何 HTML 内容之前。

【语法】

<%@ page buffer="sizekb" %>

<%@ page buffer="none" %>

-------------------------------------------

6.autoFlush 属性

autoFlush 属性控制当缓冲区充满之后,是应该自动清空缓冲区 ( 默认 ) ,还是在缓冲区溢出后抛出一个异常。

【注意】

当 buffer="none" 的时候 ,autoFlush="false" 是不合法的。

因为当 buffer="none" 则表示将缓冲区功能关闭,那么 autoFlush="false" 没有任何意义。

【语法】

<%@ page autoFlush="true" %><%-- 默认 --%>

<%@ page autoFlush="false" %>

-------------------------------------------

7.info 属性

info 属性定义一个可以在 servlet 中通过 getServletInfo 方法获取的字符串。

【语法】

<%@ page info="some message" %>

-------------------------------------------

8.errorPage

errorPage 属性用来指定一个 Jsp 页面,该页面用来处理当前页面中抛出但未被捕获的任何异常。

指定的页面可以通过 exception 变量访问抛出的异常。

【注意】

errorPage 属性指定页面专用的错误页面。

如果要为整个 web 应用之多逆光错误页面或者为应用中不同类型的错误指定错误处理页面,

则需要使用 web.xml 中的 error-page 。

【语法】

<%@ page errorPage="someurl.jsp" %>

【示例】

//some.jsp

<html>

<body>

<%@ page errorPage="/WEB-INF/myErrors.jsp" %>

<%

String num1 = request.getParameter("num1");

String num2 = request.getParameter("num2");

int result = Integer.parseInt(num1)/Integer.parseInt(num2);// 如果 num2=0 则会抛出异常

%>

<%= result %>

</body>

</html>

///WEB-INF/myErrors.jsp

<html>

<body>

<%@ page isErrorPage="true" %>

<%= exception %>

<%@ page import="java.io.*"%>

<% exception.printStackTrace(new PrintWriter(out)); %>

</body>

</html>

-------------------------------------------

9.isErrorPage 属性

isErrorPage 指定当前页是否可以作为其他 Jsp 页面的错误页面。

【语法】

<%@ page isErrorPage="true" %>

<%@ page isErrorPage="false" %> <%-- 默认 --%>

-------------------------------------------

10.isThreadSafe 属性 ( 不要使用该属性 , 应该使用显示的同步措施 )

isThreadSafe 属性控制由 Jsp 页面生成的 servlet 是允许并行访问 ( 默认 ),

还是同一时间不允许多个请求访问单个 servlet 实例 (isThreadSafe="false") 。

【注意】

因为 SingleThreadModel 的设计很差,使得它基本上毫无用处。因而,应该避免使用 isThreadSafe ,采用显示的同步措施取而代之。

放弃吧 ! 忘掉 SingleThreadModel 和 isThreadSafe="false" 。

-------------------------------------------

11.extends 属性

extends 属性指定 Jsp 页面所生成的 servlet 的超类。

【注意】

一般人应该避免使用该属性,除非引用由服务器提供商专为这种目的提供的类。

【语法】

<%@ page extends="package.class" %>

-------------------------------------------

12.language 属性

language 属性指定页面使用的脚本语言。

【注意】

就现在来说,由于 java 既是默认选择,也是唯一合法的选择,所有没有必要再去关心这个属性。

【语法】

<%@ page Xlanguage="java" %>