1回顶部 JSP 1.1提出了一种扩展的JSP标志的方法,这种方法命名为“标志库”。这些库允许另外的一些类似于jsp:include 或者jsp:forward的标志,但是它们不是以jsp:为前缀的并且还附件一些特性。
为了介绍标志库,在本教程中我们使用Blazix标志库作为例子。这个标志库只能用在Blazix服务器中,这个服务器你可以免费下载。
每一个标志库都有它自己的标志库特殊的文档。为了使用标志库,你可以使用"taglib" directive来指出标志库“description”处在什么地方。对于Blazix标志库而言,directive如下:
<%@ taglib prefix="blx" uri="/blx.tld" %>
上面者句中“uri”就是指出了标志库描述所在的地方。标志库的前缀是不同的。这个指令的意思是说我们可以使用blx:来使用库中的标志。Blazix标志库提供了一个blx:getProperty标志。这个标志可以允许用户编辑表单数据。现在,在GetName.jsp文件中,我们增加一个jsp:useBean并且将表单放置在blx:getProperty中:
<%@ taglib prefix="blx" uri="/blx.tld" %>
<jsp:useBean id="user" class="UserData" scope="session"/> <HTML> <BODY> <blx:getProperty name="user" property="*"> <FORM METHOD=POST ACTION="SaveName.jsp"> What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR> What's your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR> What's your age? <INPUT TYPE=TEXT NAME=age SIZE=4> <P><INPUT TYPE=SUBMIT> </FORM> </blx:getProperty> </BODY> </HTML> 2回顶部
至此,我们还有一些问题还没有澄清。首先,用户不能清除名字区域;而且如果用户在“age”区域键入一个不对的内容(不是一个效果的整型数值),Java异常错误就会发生。
现在,我们将使用Blazix标志库中的其它标志来解决这个问题。Blazie提供了一个blx:setProperty标志来解决这个问题。Blx:setProperty允许我们定义一个异常错误处理方法。如果有异常错误发生,我们可以为用户收集一个错误信息并且继续处理。
下面是我们修改后的SaveName.jsp,它可以处理任何错误。它不仅可以显示GetName.jsp并且在其上可以键入正确的数据,而且自动地连接到NextPage.jsp:
<%@ taglib prefix="blx" uri="/blx.tld" %>
<%! boolean haveError; StringBuffer errors;
String value, Exception ex ) { haveError = true; if ( errors == null ) errors = new StringBuffer(); else errors.append( "<P>" ); errors.append( "<P>Value for field \"" + field + "\" is invalid." ); if ( ex instanceof java.lang.NumberFormatException ) errors.append( " The value must be a number." ); } %> <% // Variables must be initialized outside declaration! haveError = false; errors = null; %> --------------- <BODY> <jsp:useBean id="user" class="UserData" scope="session"/> <blx:setProperty name="user" property="*" onError="errorHandler"/> <% if ( haveError ) { out.println( errors.toString()); pageContext.include( "GetName.jsp" ); } else pageContext.forward( "NextPage.jsp" ); %> </BODY> </HTML> 这里要注意haveError和errors必须每次都重新初始化,因为它们在声明的外部被初始化。 现在,如果一个错误发生在blx:setProperty处理的过程,我们就显示这个错误并再次回到GetName.jsp以使用户可以校正这个错误。如果没有错误发生,我们就自动让用户连接到NextPage.jsp。3回顶部
如果你细心点你还可以发现表单仍有一个问题,即“age”开始显示空而不是0。这个问题我们可以通过增加“emptyInt=0”到blx:getProperty和blx:setProperty标志中,这样bean区域就被初始化为0了。如果键入的年龄不是一个有效的数值,那么我们就使用0来标志空字符。
另外一个小的问题是如果有错误出现并且我们旧书包含“GetName.jsp”的时候,就得到两个"<HTML>"标志。对于这个问题一个完美的解决方法是去掉out.println,并按如下传递错误:
<%
if ( haveError ) {
request.setAttribute( "errors",
errors.toString());
pageContext.forward( "GetName.jsp" );
} else
pageContext.forward( "NextPage.jsp" );
%>
那么我们可以在GetName.jsp执行“request.getAttribute”,并且如果返回数值为非空,就显示错误。这个就留着作为本节教程的练习吧。
最后,再说说本节的练习吧,首先刚才说的内容。还要阅读标志库文档中的SQL标志,然后创建一个数据库表格;再编写一个JSP文件,其上有一个 FORM以及表单上有一个选择框;接着使用SQL标志来根据数据库表格制作选择框。
|
正在阅读:JSP由浅入深(11)标记库JSP由浅入深(11)标记库
2004-02-14 09:33
出处:PConline
责任编辑:pjl