JSTL基础功能
一.处理复选框参数
这个功能比较简单,主要是利用JSTL中paramValues这个隐式变量,它和param是相对应个,只不过前者用来处理多个同名参数,而后者是用来处理单个参数的。看下面的例子:
country.jsp:给出了一组多选框,用于选择国家
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
---------------------处理多选框的表单-------------------<br>
<form action="checkbox.jsp" method="post">
<input value="中国" type="checkbox" name="country">
中国
<br>
<input value="英国" type="checkbox" name="country">
英国
<br>
<input value="美国" type="checkbox" name="country">
美国
<br>
<input value="法国" type="checkbox" name="country">
法国
<br>
<input value="德国" type="checkbox" name="country">
德国
<br>
<input type="submit">
</form>
</body>
</html>
checkbox.jsp:处理复选框参数
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="fmt" prefix="fmt"%>
<%@ taglib uri="core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>处理复选框参数</title>
</head>
<body>
<c:choose>
<c:when test="${not empty paramValues.country}">
您选择了下列国家:
<ul>
<c:forEach items="${paramValues.country}" var="adj">
<li>
<c:out value="${adj}" />
</li>
</c:forEach>
</ul>
</c:when>
<c:otherwise>
没有选中任何国家
</c:otherwise>
</c:choose>
</body>
</html>
二.错误处理
当JSTL发生错误时,我们可以有3中方法来处理它:
● 不作任何处理,此时JSP容器会给我们打印出详细的错误信息,对开发人员而言有助于debug,但是对用户而言不是很好
● 使用<c:catch>标签捕捉异常
● 使用JSP的errorPage属性,指定一个通用的错误处理页面
第一种和第三种处理方式都比较常见,这里主要说一下如何使用<c:catch>标签来处理页面异常,它的属性如下表所示:
属性名 |
描述 |
是否必须 |
默认值 |
var |
将错误信息作为变量存储起来 |
否 |
无 |
当<c:catch>标签体里面的内容发生错误时,它并不会导致整个页面的终止执行,它只会让<c:catch>标签中剩下的内容终止执行,而<c:catch>标签之外的内容仍然会继续执行。如果没有给<c:catch>标签指定var属性,那么<c:catch>标签体中的所有错误将会被忽略,页面继续执行;如果指定了var属性,那么错误信息讲话存储在一个变量中,这个变量名就由var属性指定。如果想得到关于错误的更多详细信息,可以通过如下的代码:<c:out value="${parseError.message}"/>带打印错误信息,其中parseError就是我们在<c:catch>标签之中通过var属性指定的值。
三.验证输入
JSTL不能用来做很复杂的数据验证,比如验证电话号码的合法性之类的。它主要用于如下几种简单的验证:
● 确保用户在一个表单域中输入了内容
● 检查一个表单域中有内容时另一个域是否有或者没有
● 检查用户输入的数字是否超过了某个限制
这通常是一个应用的表示层进行验证的顺序。对输入进行验证时,有两个要注意的地方:首先就是在页面中的什么地方对输入进行验证,其次就是当输入非法时如何提示用户,一遍他能够修正错误。下图给出了一个利用JSTL来进行简单验证的模型:
当输入没有通过验证时重复显示表单,仅当输入通过验证之后才将表单中的数据进行提交,它是通过重复循环同一个页面来实现的,下面给出了一个例子,代码如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="fmt" prefix="fmt"%>
<%@ taglib uri="core" prefix="c"%>
<h1>
Peter's Junk-Mail Service
</h1>
<c:if test="${param.submitted}">
<c:if test="${empty param.name}" var="noName" />
<c:if test="${empty param.email}" var="noEmail" />
<c:if test="${empty param.age}" var="noAge" />
<c:catch var="ageError">
<fmt:parseNumber var="parsedAge" value="${param.age}" />
<c:if test="${parsedAge < 13}" var="youngAge" />
</c:catch>
<c:if test="${not empty ageError}" var="badAge" />
<c:if test="${not (noName or noEmail or noAge or badAge or youngAge)}">
<c:set value="${param.name}" var="name" scope="request" />
<c:set value="${param.email}" var="email" scope="request" />
<c:set value="${param.age}" var="age" scope="request" />
<jsp:forward page="spamFormHandler.jsp" />
</c:if>
</c:if>
<form method="post">
<p>
Thanks for signing up for our junk-mail service. Once you submit your information on the form below, you'll begin to receive all the "spam"
you ever wanted.
</p>
<input type="hidden" name="submitted" value="true" />
<p>
Enter your name:
<input type="text" name="name" value="${param.name}" />
<br />
<c:if test="${noName}">
<small><font color="red"> Note: you must enter a name
</font> </small>
</c:if>
</p>
<p>
Enter your email address:
<input type="text" name="email"
value="<c:out value="${param.email}"/>" />
<br />
<c:if test="${noEmail}">
<small><font color="red"> Note: you must enter an
email address </font> </small>
</c:if>
</p>
<p>
Enter your age:
<input type="text" name="age" size="3"
value="<c:out value="${param.age}"/>" />
<br />
<c:choose>
<c:when test="${noAge}">
<small><font color="red"> Note: you must enter your
age </font> </small>
</c:when>
<c:when test="${badAge}">
<small><font color="red">
Note: I couldn't decipher the age you typed in
</font> </small>
</c:when>
<c:when test="${youngAge}">
<small><font color="red"> Note: You're too young to
receive adult junk mail. Please grow older and try again. </font> </small>
</c:when>
</c:choose>
</p>
<input type="submit" value="Sign up" />
</form>