JSP
维库,知识与思想的自由文库
|
JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同建立的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的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页面可以被分为以下几部份:
[编辑] 静态数据静态数据在输入文件中的内容和输出给HTTP 响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。 [编辑] JSP 指令JSP指令控制JSP编译器如何去生成 servlet,以下是可用的指令:
<source lang="text"><%@ include file="somefile.jsp" %></source>
<source lang="text"> <%@ 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样例会 </source> 注意: 在同一个JSP文件中只有"import"导入页面指令可以被多次使用。
<source lang="text"><%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %></source> [编辑] JSP脚本元素和变量[编辑] 标准脚本变量以下是永远可用的脚本变量:
[编辑] 脚本元素有三个基本的脚本元素,作用是使JAVA代码可以直接插入 servlet.
[编辑] JSP 动作JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:
[编辑] 标签样例[编辑] jsp:include<source lang="html4strict"><html> <head></head> <body> <jsp:include page="mycommon.jsp" > <jsp:param name="extraparam" value="myvalue" /> </jsp:include> name:<%=request.getParameter("extraparam")%> </body> </html> </source> [编辑] jsp:forward<source lang="html4strict"> <jsp:forward page="subpage.jsp" >
<jsp:param name="forwardedFrom" value="this.jsp" />
</jsp:forward> </source> 在本例中,请求被传递到"subpage.jsp",而且请求的处理权不会再返回前者。 [编辑] jsp:plugin<source lang="html4strict"><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></source> 上述 plugin 例子说明了一种在网页中嵌入applet的统一方法。在<OBJECT>标签出现之前,并没有一种嵌入applets的通用方法。这个标签设计得并不好,但有希望在以后加入动态属性(height="${param.height}", code="${chart}"等)和动态参数的新功能。 目前jsp:plugin标签不允许动态调用 applets。例如,你如果有一个图表applet需要数据点以参数形式被传入,除非数据点的数量是一个常量,否则你就不能使用ResultSet 循环来创建jsp:param标签,你不得不手写每个jsp:param标签的代码。而每个上述jsp:param标签可以有一个动态命名和动态值。 [编辑] jsp:useBean<source lang="html4strict"> <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()%>" /> </source> scope属性可以是 request, page, session or application,它有以下用意:
上述例子将会用一个创建一个类的实例,并且把该实例存储在属性中,该属性将在该请求的生命周期内有效。它可以在所有被包含或者从主页面(最先接收请求的页面)转向到的JSP页之间共享。 [编辑] JSP标签库除了JSP预定义动作之外,开发者还可以使用JSP标签扩展API添加他们自定义的动作。开发者写一种实现一个标签的界面和一个标签库的XML描述文件的JAVA类,这就能指定标签和实现标签的JAVA类 请看如下JSP: <source lang="html4strict"> <%@ taglib uri="mytaglib.tld" prefix="myprefix" %> ... <myprefix:myaction> <%-- the start tag %> ... </myprefix:myaction> <%-- the end tag %> ... </source> JSP编译器将会载入mytaglib.tld这个XML文件,然后可以看到标签myaction由JAVA类MyActionTag实现。当该标签首次在文件中使用时,将会创建一个MyActionTag的实例。然后(而且当每次该标签被使用时),当出现开始标签时,将会调用doStartTag()方法,根据开始标签的结果,来决定如何处理标签的主体。主体是指开始标签和结束标签之间的文本。这个doStartTag()方法将会返回如下之一:
当结束标签出现时,它会调用doEndTag()方法,该方法会返回如下两做之一:
上述 myaction 标签tag 会有一个类似下面例子的用于实现的类: <source lang="java"> 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 } </source> Add Body Tag description. [编辑] 本地化JSP的本地化Internationalization 是通过和JAVA应用程序相同的方式完成的,即使用 resource bundle. [编辑] 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页。有几种平台都基于服务于网络层的模-视图-控件 模式(比如Struts 和Spring framework)。 [编辑] 样例不管JSP编译器是生成SERVLET的JAVA源码,或者是直接发布二进制码,了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET,都是很有帮助的。例如,看一下如下输入JSP和它最后生成的JAVA SERVLET: Input JSP <source lang="html4strict"> <%@ page errorPage="myerror.jsp" %> <%@ page import="com.foo.bar" %> <html> <head> <%! int serverInstanceVariable = 1;%> ... <% int localStackBasedVariable = 1; %> ... </source> Resulting servlet <source lang="java"> 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( "\r\n" ); out.print( " \r\n" ); ... } catch ( Exception _exception ) { //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %> } } } </source> [编辑] 出版物
[编辑] 参见
[编辑] 外部链接
| ||||||||||||||||||||||||||||||||||||||||||||||||||


