Jsp1
jsp代码中包含两类:jsp元素和template data。 template模板 data:jsp引擎不处理的部分,就是<%....%>之外的部分,直接给浏览器显示。
<%! %>
<% %>
<%= %>
<%-- --%>
<!-- -->
jsp指令元素: 1.page:11个属性
language,
extends,
import,
session,
buffer,
autoFlush,
buffer,
autoFlush,
isThreadSafe,
info,
errorPage,
contentType,
isErrorPage
2.include
file:
3.taglib:
uri:
prefix:
Jsp动作指令:
<jsp:forward>
jsp: param用于在转发时增加额外的请求参数。请求参数的值可以通过HttpServletRequest类的getParameter()方法获得。 下面是代码实例: forward指令用于将页面响应转发到另外的页面。既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。 forward指令格式如下:
{jsp:param..../>} </jsp:forward> 在Jsp1中:
<jsp:forward page="Jsp1.jsp"> 在Jsp2中
<% String name =request.getParameter("name"); %> 结果图: 从图中可以看出,执行forward指令时,用户请求的地址依然没有发生变化,但页面内容却完全被forward目标页的内容。 另外,在执行forward指令转发请求时,客户端的请求参数不会丢失。来看下面例子,该页没有任何动态内容,只是一个静态的表单页,作用是将请求参数提交到jsp-forward.jsp页。 |
<jsp:include>:
<jsp:useBean>:
javaBean是特殊的Java类,使用J ava语言书写,并且遵守JavaBean API规范。接下来给出的是JavaBean与其它Java类相比而言独一无二的特征:
JavaBean属性一个JavaBean对象的属性应该是可访问的。这个属性可以是任意合法的Java数据类型,包括自定义Java类。 一个JavaBean对象的属性可以是可读写,或只读,或只写。JavaBean对象的属性通过JavaBean实现类中提供的两个方法来访问: 访问JavaBean<jsp:useBean> 标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean>标签的语法格式如下: <jsp:useBean id="bean 的名字" class="javabean名" scope="bean 的作用域" /> 这种情况下,body部分的内容只在此标签创建JavaBean的实例对象时才执行,创建JavaBean之后则表示JavaBean已存在,则body内容不会显示了。 其中,根据具体情况,scope的值可以是page,request,session或application。 【id】 一个用来标识你指定作用域的变量,假如该Bean对象已由 id值可任意只要不和同一JSP文件中其它<jsp:useBean>中id值一样就行了。 注:先要有个javabean.java文件,id值才不会报错,在eclipse中。
【scope:范围】【skōp】 Scope属性具有四个可能的值分别是application 、session 、request、page;四种不同的生命周期和使用范围。 page:默认,缺省值;在本页面(<jsp:useBean>所在的jsp);或其包含页面使用。直到forward或回应回客户端。 session:你可以在同一次会话的任意一个页面中使用该javaBean,该Bean在整个会话期间一直存在。但是该<%@page session=true%> session必须设为true; request:可以在处理同一个请求的任意一个页面使用该JavaBean对 application:待定---- 【class】: 从一个class实例化Bean对象,使用new关键字调用class的构造方法完 成。class="d.bean" 【type】用来指定该Bean对象的数据类型,假如既没有指定 class 或 beanBean, 没 【beanName】:beanName="{package.class | <%= expression %>}" type="package.class 使用java.beans.Beans.instantiate方法实例化beanName属性指定的类或序列化模板对应的Bean对象,赋予JavaBean对象type属性指定的数据类型。Beans.instantiate方法会检查beanName属性指定的名称是类名称还是序列化模板的名称。假如该JavaBean对象已被序列化,则Beans.instantiate使用类加载器读取序列化的内容,更多信息可参考JavaBeans.beanName属性值要么是一个完整类名,要么是一个可以转化为完整类名的表达式。用来传给Beans.instantiate方法。type属性值可和beanName属性值同,或为其超类、接口。 【注意】: 1.class或beanName不能同时存在;它们用来指定实例化的类名称或序列化模板; 2. class可以省去type独自存在,beanName必须和type一起使用; 3.class指定的是类名,beanName指定的是类名或序列化模板的名称; |
<jsp:setProperty>:
<jsp:setProperty property="proertyname" name="bean name" value="value"/> name:use bean中的id值, property:javabean类中的属性名, value:你要设给property的值。
1 <jsp:setProperty name="beanName" value的值可以是字符串,也可以是表达式。如果value的值是一个表达式,那么该表达式的计算结果必须与所有要设置的JavaBean属性的类型一致。 |
<jsp:getProperty>:
<jsp:getproperty name=“id” property=“property”/>
<jsp:getProperty>标签:用于在jsp页面中获取一个JavaBean组件的属性。
<jsp:plugin>:
JSP内置对象
request:
response:
session:
application:
out:
config:
page:
pageContext:
exception:
Cookie:
---------------------------------------------------------------------------------------------------------
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和JSP最早都是由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中发布。
静态数据在输入文件中的内容和输出给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规范版本包括新的用于提升程序员工作效率功能,主要有:
- An Expression Language(EL)允许开发者创建Velocity-样式 templates(among other things).
- 更快更简单的创建新标签的方法。
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
<%@ 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" %>
}
}
}
出版物[编辑]
- JavaServer Pages, Third Edition, Hans Bergsten,O'Reilly & Associates, Inc.,Sebastopol, California, 2003. ISBN 0-596-00563-6
参见[编辑]
- JSTL
- Java EE
- JavaServer Faces
- Java Servlet
- SSJS
- WAR (file format)
- EAR (file format)
- JAR (file format)
- Apache Tomcat
外部链接[编辑]
- Sun's JSP product description
- JSR 245 (JSP 2.1)
- JSR 152 (JSP 2.0)
- JSR 53 (JSP 1.2)
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和JSP最早都是由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中发布。
静态数据在输入文件中的内容和输出给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规范版本包括新的用于提升程序员工作效率功能,主要有:
- An Expression Language(EL)允许开发者创建Velocity-样式 templates(among other things).
- 更快更简单的创建新标签的方法。
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
<%@ 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" %>
}
}
}
出版物[编辑]
- JavaServer Pages, Third Edition, Hans Bergsten,O'Reilly & Associates, Inc.,Sebastopol, California, 2003. ISBN 0-596-00563-6
参见[编辑]
- JSTL
- Java EE
- JavaServer Faces
- Java Servlet
- SSJS
- WAR (file format)
- EAR (file format)
- JAR (file format)
- Apache Tomcat
外部链接[编辑]
- Sun's JSP product description
- JSR 245 (JSP 2.1)
- JSR 152 (JSP 2.0)
- JSR 53 (JSP 1.2)
Jsp1的更多相关文章
- 菜鸟日记之JSP1
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsyste ...
- jsp-1 简单的应用servlet,并用其跳转页面
jspweb里面用到的servlet跳转页面的方法 使用的jar包只有 commons-lang3-3.5.jar 运行时,tomcat会先根据web.xml里面的信息,查找servlet <? ...
- JSP1.x 自定义标签
Tag接口 任何一个标签都对应着一个java类,该类必须实现Tag接口,JSP遇到一个标签后后,将通过一个tld文件查找该标签的实现类,并运行该类的相关方法 import javax.servlet. ...
- jsp页面无法识别el表达式的解决方案
今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- java面试题总汇
coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...
- 浅入tomcat
前言:学习笔记,以供参考 1.什么是服务器 所谓的服务器其实就是一段别人写好的程序,服务器有两个能力. a.可以帮助我们来管理资源. b.可以将资源向外界发布以便于外界来访问这个资源. 2.资源有哪些 ...
- Java牛人
Java领域有很多著名的人物,他们为Java社区编写框架.产品.工具或撰写书籍改变了Java编程的方式.本文是<最受欢迎的8位Java牛人>的2.0版本. PS:排名不分先后.本文的信息整 ...
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
随机推荐
- 爬虫系列----scrapy爬取网页初始
一 基本流程 创建工程,工程名称为(cmd):firstblood: scrapy startproject firstblood 进入工程目录中(cmd):cd :./firstblood 创建爬虫 ...
- java 常用工具整理
mapUtil map操作工具类 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 ...
- Spring Security(三十):9.5 Access-Control (Authorization) in Spring Security
The main interface responsible for making access-control decisions in Spring Security is the AccessD ...
- 一位月薪1.2w的北漂程序员真实生活!
“ 每个人都有一条生活道路.千万人,千万条,各不相同,各有特点.但是并不是好人都有一条好路,坏人都有一坏路.有的时候却恰恰相反.这虽然不是历史的必然,但却是客观社会存在的.今天咱们说的这部书是发生在当 ...
- GIT归纳整理
1. 将repo_a的分支提交到repo_b分支 repo_a:表示原始git库地址:repo_b:表示新增的git库地址. git remote add new_remote repo_b:new_ ...
- Entity Framework Core系列之实战(ASP.NET Core MVC应用程序)
本示例演示在ASP.NET 应用程序中使用EF CORE创建数据库并对其做基本的增删改查操作.当然我们默认你的机器上已经安装了.NET CORE SDK以及合适的IDE.本例使用的是Visual St ...
- URL https://i.cnblogs.com/EditPosts.aspx?opt=1
URL url = new URL("https://i.cnblogs.com");URL url1 = new URL(url, "EditPosts.aspx?op ...
- Shell命令-文件及内容处理之split、paste
文件及内容处理 - split.paste 1. split:分割文件为不同的小片段 split命令的功能说明 split 命令用于将一个文件分割成数个.该指令将大文件分割成较小的文件,在默认情况下将 ...
- Linux--主从复制
一 . mysql+centos7 mariadb mariadb其实是跟mysql是一样的,只不过是在centos7上叫做mariadb, 主要是因为mysql被甲骨文公司收购后,可能会有闭源的风险 ...
- Python——日志模块(logging)
一.日志说明 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事件.事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地 ...