jsp

 

JSP

维基百科,自由的百科全书

 

JSP (全称J avaS erver P ages)是由Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTMLXML 或其他格式文档的Web 网页的技术标准。JSP技术是以Java 语言作为脚本语言 的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP 的应用程序。

JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。

JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。

目录

[隐藏 ]

[编辑 ] JSP和Servlets

从架构上说,JSP可以被看作是从Servlets高级提炼而作为JAVA Servlet 2.1 API的扩展而应用。Servlets和JSPs最早都是由Sun Microsystems (升阳公司)开发的。从JSP1.2版本以来,JSP处于Java Community Process (有人译为:JAVA社区组织)开发模式下。JSR -53规定了JSP 1.2和Servlet 2.4的规范,JSR -152规定了JSP 2.0的规范。2006年5月,JSP 2.1的规范作为Java EE 5的一部份,在JSR -245中发布。

[编辑 ] JSP句法

一个JSP页面可以被分为以下几部份:

  • 静态数据,如HTML
  • JSP指令,如include指令
  • JSP脚本元素和变量
  • JSP动作
  • 用户自定义标签

[编辑 ] 静态数据

静态数据在输入文件中的内容和输出给HTTP 响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。

[编辑 ] JSP指令

JSP指令控制JSP编译器如何去生成servlet ,以下是可用的指令:

  • 包含指令include –包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C预处理器 所提供的很类似。被包含文件的扩展名一般都是"jspf"(即JSP Fragment ,JSP碎片):
<%@ include file="somefile.jsp" %>
  • 页面指令page –页面指令有以下几个选项:
import 使一个JAVA导入声明被插入到最终页面文件。
contentType 规定了生成内容的类型。当生成非HTML内容或者当前字符集character set 并非默认字符集时使用。
errorPage 处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage 如果设置为TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe 表示最终生成的servlet是否安全线程(thread safe)。
<%@ page import="java.util.*" %> //example import导入样例
<%@ page contentType="text/html" %> //example contentType页面类型样例
<%@ page isErrorPage=false %> //example for non error page无错页面样例
<%@ page isThreadSafe=true %> //example for a thread safe JSP安全线程JSP样例会

注意: 在同一个JSP文件中只有"import"导入页面指令可以被多次使用。

  • 标签库指令taglib –标签库指令描述了要使用的JSP标签库。该指令需要指定一个前缀prefix(和C++的命名空间很类似)和标签库的描述URI:
<%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>

[编辑 ] JSP脚本元素和变量

[编辑 ] 标准脚本变量

以下是永远可用的脚本变量:

  • out – JSPWriter用来写入响应流的数据
  • page – servlet自身
  • pageContext –一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间传递。
  • request – HTTP request 对象
  • response – HTTP response 对象
  • session – HTTP session 对象,在多个请求之间追踪一个客户的信息。
[编辑 ] 脚本元素

有三个基本的脚本元素,作用是使JAVA代码可以直接插入servlet.

  • 一种是声明标签,在JAVA SERVLET的类体中放入一个变量的定义。静态的数据成员也可以如此定义。
    <%! int serverInstanceVariable = 1; %>
    
  • 一种是脚本标签,在JAVA SERVLET的类的_jspService()方法中放入所包含的语句。
    <% int localStackBasedVariable = 1;  out.println(localStackBasedVariable); %>
    
  • 一种是表达式标签,在JAVA SERVLET的类中放入待赋值的表达式,表达式注意不能以分号结尾。
    <%= "expanded inline data " + 1 %>
    

[编辑 ] JSP动作

JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:

jsp:include 和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。
jsp:param 可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。
jsp:forward 用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。
jsp:plugin Netscape Navigator 的老版本和Internet Explorer 使用不同的标签以嵌入一个applet 。这个动作产生为嵌入一个APPLET所需要的指定浏览器标签。
jsp:fallback 如果浏览器不支持APPLETS则会显示的内容。
jsp:getProperty 从指定的JavaBean 中获取一个属性值。
jsp:setProperty 在指定的JavaBean中设置一个属性值。
jsp:useBean 创建或者复用一个JavaBean变量到JSP页。
[编辑 ] 标签样例
[编辑 ] jsp:include
<html
>

<head
></
head
>

<body
>

<jsp:include page=
"mycommon.jsp"
 >

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

</
jsp:include>

name:<%=
request.getParameter(
"extraparam"
)
%>

</
body
>

</
html
>

[编辑 ] jsp:forward
<jsp:forward page=
"subpage.jsp"
 >

     <jsp:param name
=
"forwardedFrom"
 value
=
"this.jsp"
 /
>

</
jsp:forward>

在本例中,请求被传递到"subpage.jsp",而且请求的处理权不会再返回前者。

[编辑 ] jsp:plugin
<jsp:plugin type
=
applet height
=
"100%"
 width
=
"100%"


            archive
=
"myjarfile.jar,myotherjar.jar"


            codebase
=
"/applets"


            code
=
"com.foo.MyApplet"
 >

    <jsp:params>

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

    </
jsp:params>

    <jsp:fallback>

        Your browser does not support applets.
    </
jsp:fallback>

</
jsp:plugin>

上述plugin 例子说明了一种在网页中嵌入applet 的统一方法。在<OBJECT > 标签出现之前,并没有一种嵌入applets的通用方法。这个标签设计得并不好,但有希望在以后加入动态属性 (height="${param.height}", code="${chart}"等)和动态参数的新功能。目前jsp:plugin标签不允许动态调用applets。例如,你如果有一个图表 applet需要数据点以参数形式被传入,除非数据点的数量是一个常量,否则你就不能使用ResultSet循环来创建jsp:param标签,你不得不 手写每个jsp:param标签的代码。而每个上述jsp:param标签可以有一个动态命名和动态值。

[编辑 ] jsp:useBean
<jsp:useBean id
=
"myBean"
 class
=
"com.foo.MyBean"
 scope
=
"request"
 /
>

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

<jsp:setProperty name
=
"myBean"
 property=
"lastChanged"
 value
=
"<%= new Date()%>

" />

scope属性可以是request, page, session or application,它有以下用意:

  • request— 该属性在请求的生命周期内有效,一旦请求被所有的JSP页处理完后,那么该属性就不可引用。
  • page— 该属性只是当前页中有效。
  • session— 该属性在用户会话的生命周期内有效。
  • application— 该属性在各种情况下都有效,并且永远不会被变为不可引用,和全局变量global variable 相同。

上述例子将会用一个创建一个类的实例,并且把该实例存储在属性中,该属性将在该请求的生命周期内有效。它可以在所有被包含或者从主页面(最先接收请求的页面)转向到的JSP页之间共享。

[编辑 ] JSP标签库

除了JSP预定义动作之外,开发者还可以使用JSP标签扩展API添加他们自定义的动作 。开发者写一种实现一个标签的界面和一个标签库的XML描述文件的JAVA类,这就能指定标签和实现标签的JAVA类 请看如下JSP:

<%@ taglib uri=
"mytaglib.tld"
 prefix=
"myprefix"
 %>

...
<myprefix:myaction>
 <%-- the start
 tag %>

...
</
myprefix:myaction>
 <%-- the end tag %>

...

JSP编译器将会载入mytaglib.tld这个XML文件,然后可以看到标签myaction 由JAVA类MyActionTag 实 现。当该标签首次在文件中使用时,将会创建一个MyActionTag的实例。然后(而且当每次该标签被使用时),当出现开始标签时,将会调用 doStartTag()方法,根据开始标签的结果,来决定如何处理标签的主体。主体是指开始标签和结束标签之间的文本。这个doStartTag()方 法将会返回如下之一:

  • SKIP_BODY - 标签之间不做处理。
  • EVAL_BODY_INCLUDE - 对标签之内主体进行赋值。
  • EVAL_BODY_TAG - 对标签之内主体进行赋值并把结果输出到流(保存在标签的主体内容属性中)。
注意: 如果标签扩展了BodyTagSupport类,当主体被执行时会在调用doEndTag()之前调用doAfterBody()方法。该方法用于实现循环结构。

当结束标签出现时,它会调用doEndTag()方法,该方法会返回如下两做之一:

  • EVAL_PAGE - 表示JSP文件的剩余部份将会被执行。this indicates that the rest of the JSP file should be processed.
  • SKIP_PAGE - 表示将不会再有更多执行操作。当前JSP页交出控制权。就象在转发动作中的作用一样。

上述myaction标签tag会有一个类似下面例子的用于实现的类:

public
 class
 MyActionTag extends
  TagSupport {

    //Releases all instance variables.

    public
 void
 release(
)
 {
...}

 
    public
 MyActionTag(
)
 {
 ... }

 
    //called for the start tag

    public
 int
 doStartTag(
)
 {
 ... }

 
    //called at the end tag

}

[编辑 ] 本地化

JSP的本地化 是通过和JAVA应用程序相同的方式完成的,即使用资源包

[编辑 ] JSP 2.0

新的JSP规范版本包括新的用于提升程序员工作效率功能,主要有:

Hello, ${param.visitor}  <%-- same as: Hello, <%=request.getParameter("visitor")%> --%>

[编辑 ] 模型-视图-控制器 模式

为了把表现层presentation 从请求处理request processing 和数据存储data storage 中分离开来,升阳公司推荐在JSP文件中使用一种模型-视图-控制器Model-view-controller 模式。规范的SERVLET或者分离的JSP文件用于处理请求。当请求处理完后,控制权交给一个只作为创建输出作用的JSP页。有几种平台都基于服务于网络层的模-视图-控件 模式(比如StrutsSpring framework )。

[编辑 ] 样例

不管JSP编译器是生成SERVLET的JAVA源码,或者是直接发布二进制码,了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET,都是很有帮助的。例如,看一下如下输入JSP和它最后生成的JAVA SERVLET:

Input JSP

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

<%@ page import=
"com.foo.bar"
 %>

 
<html
>

<head
>

<%! int serverInstanceVariable =
 1
;%>

...
<% int localStackBasedVariable =
 1
; %>

<table
>

    <tr
><td
><%=
 "expanded inline data "
 + 1 %></
td
></
tr
>

    ...

Resulting servlet

package
 jsp_servlet
;

import
 java.util.*
;

import
 java.io.*
;

import
 javax.servlet.*
;

import
 javax.servlet.http.*
;

import
 javax.servlet.jsp.*
;

import
 javax.servlet.jsp.tagext.*
;

 
import
 com.foo.bar
;
 //imported as a result of <%@ page import="com.foo.bar" %>

import
 ...
 
class
 _myserlvet implements
 javax.servlet
.Servlet
, javax.servlet
.jsp
.HttpJspPage
 {

    //inserted as a

    //result of <%! int serverInstanceVariable = 1;%>

    int
 serverInstanceVariable =
 1
;

    ...
 
    public
 void
 _jspService(
 javax.servlet
.http
.HttpServletRequest
 request,
                            javax.servlet
.http
.HttpServletResponse
 response )

        throws
 javax.servlet
.ServletException
,
               java.io
.IOException

    {

        javax.servlet
.ServletConfig
 config =
 ...;
//get the servlet config

        Object
 page =
 this
;

        PageContext pageContext =
 ...;
//get the page context for this request

        javax.servlet
.jsp
.JspWriter
 out =
 pageContext.getOut
(
)
;

        HttpSession session =
 request.getSession
(
 true
 )
;

        try
 {

             out.print
(
 "<html>\r
\n
"
 )
;

             out.print
(
 "<head>\r
\n
"
 )
;

             ...
             //from <% int localStackBasedVariable = 1; %>

             int
 localStackBasedVariable =
 1
;

             ...
             out
.print
(
 "<table>\r
\n
"
 )
;

             out.print
(
 "   <tr><td>"
 )
;

             //note, toStringOrBlank() converts the expression into a string or if

             // the expression is null, it uses the empty string.

             //from <%= "expanded inline data " + 1 %>

             out.print
(
 toStringOrBlank(
 "expanded inline data "
 +
 1 )
 )
;

             out.print
(
 "   </td></tr>\r
\n
"
 )
;

             ...
        }
 catch
 (
 Exception
 _exception )
 {

           //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %>

        }

    }

}

[编辑 ] 出版物

[编辑 ] 参见

[编辑 ] 外部链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值