使用JSTL
在MyEclipse2014中,使用JSTL只要在文件开始加上一句
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix表示前缀,用于区分其他标签,可以自定义前缀。
使用JSTL可以进一步减少Scriptlet的使用。使前端页面更加简洁
输出语句out
<c:out value=”value” default=”default” escapeXml=”true/false” ></c:out>
- 输出常量:
<c:out value="test"></c:out>
- 输出变量
<% String username = "tom";session.setAttribute("username", username); %>
<c:out value="username: ${username}"></c:out>
- 当没有获取到值时,采用默认值
<c:out value="${username2}" default="default"></c:out>
- 当出现特殊字符时,是否保留(false-不保留|true-保留)
<c:out value="<out>" escapeXml="false"></c:out> // <out>
<c:out value="<out>" escapeXml="false"></c:out> // <out>
赋值语句set
<c:set value=”value” var=”var” scope=”session” [target=”” property=”“]></c:set>
表示把值value储存到var变量中,变量储存的范围是scope指定的范围。如果不指定scope,则scope取默认值page
- 为变量赋值:
// 将username变量赋值为zhangsan,并保存到sessionScope中
<c:set value="zhangsan" var="username" scope="session"></c:set>
<c:out value="${sessionScope.username }"></c:out>
- 赋值时value可以不写,将value的内容写在标签之中也可:
// 将变量address赋值为‘合肥市’
<c:set var="address" scope="page">合肥市</c:set>
<c:out value="${pageScope.address }"></c:out>
- 向JavaBean中赋值:
// 声名JavaBean
<jsp:useBean id="user" class="Bean.JavaBean"></jsp:useBean>
// 将id为user的JavaBean中name属性赋值为‘zhangsan’
<c:set target="${user}" property="name" value="zhangsan"></c:set>
<c:out value="${pageScope.user.name }"></c:out>
<c:out value="${user.name }"></c:out>
- 和之前一样,value可以包围在标签中
<c:set target="${user }" property="password" >123</c:set>
<c:out value="${user.password }"></c:out>
PS:以上的例子中,直接使用了${user,name}
,是因为,JavaBean在翻译时被自动保存到pageScope中,因此使用JavaBean时可以直接用EL获得JavaBean,而不需要调用setAttribute()方法传递参数:
Bean.JavaBean user = null;
user = (Bean.JavaBean) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (user == null){
user = new Bean.JavaBean();
_jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.PAGE_SCOPE);
}
捕获异常语句catch
catch包围的语句出现错误时,会将异常保存在var中,可以使用EL表达式获得err的值
<c:catch var="error">
<c:set target="sss" property="sss" value="123"></c:set>
</c:catch>
<c:out value="${error }" ></c:out>
结果:
javax.servlet.jsp.JspTagException: Invalid property in <set>: "sss"
移除属性remove
<c:remove var=”username” scope=”scope”></c:remove>
从scope范围中移除var变量。其中var时必须的,scope是可选的
<c:set var="username" value="tim" scope="application"></c:set>
<c:out value="${username }" ></c:out>
<!-- var属性必选,scope可选 -->
<c:remove var="username" ></c:remove>
<c:out value="${username }"></c:out>
简单判断语句if
<c:if test=”${param.score>=90 }” var=”result” scope=”application”>
test表示判断的条件,var表示判断的结果,scope表示保存判断结果的范围。与Java中的if语句不同该语句没有else,如果要实现if else-if 则需要用choose语句。
<c:if test="${param.score>=90 }" var="result" scope="application">
<c:out value="优秀" ></c:out>
</c:if>
<c:out value="sss ${applicationScope.result }"></c:out>
复杂判断语句 choose、when、otherwise 实现条件判断
choose、when、otherwise嵌套使用可以实现if else-if else 条件判断。otherwise类似于Java中的else,可以省略不写。
<c:choose>
<c:when test="${param.score>=90 && param.score<=100 }">
<c:out value="优秀"></c:out>
</c:when>
<c:when test="${param.score>=60 && param.score<90 }">
<c:out value="良好"></c:out>
</c:when>
<c:otherwise>
<c:out value="输入有误"></c:out>
</c:otherwise>
</c:choose>
循环语句 forEach
<c:forEach var=”fruit” items=”${fruits }” begin=”0” end=”4” step=”1” varStatus=”fru”></c:forEach>
属性:
- items表示变量的集合
- var 表示每次从集合中取出的值
- begin、end表示循环从集合中下标为begin的元素开始,到下标为end结束
- step 步长
- varStatus 通过index、count、first、last 4个状态值,描述begin和end子集中元素的状态
varStaus的4个取值:
- index 当前元素在集合中的下标,起始位0
- count 当前元素在begin、end子集中的序号,起始位为1
- first 判断当前元素是不是当前子集的首元素,true/false
- last 判断当前元素是不是当卡子集的末尾元素,true/false
PS:
- 遍历Map时,var中的对象会是entry,需要手动调用getKey() 和 getValue()方法
- 切割字符串,默认字符串之间用逗号隔开,forEach会以逗号为分隔符,将字符转拆分开,如果需要自定义分隔符,则需要使用forTakens
有以下集合:
<%
List<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("pear");
fruits.add("watermelon");
fruits.add("orange");
request.setAttribute("fruits", fruits);
%>
- 全部遍历
<c:forEach var="fruit" items="${fruits }">
<c:out value="${fruit }"></c:out>
<br />
</c:forEach>
// 结果
apple
pear
watermelon
orange
- 部分遍历,闭合区间[begin,end]
<c:forEach var="fruit" items="${fruits }" begin="1" end="3">
<c:out value="${fruit }"></c:out>
<br />
</c:forEach>
结果:
pear
watermelon
orange
- 部分遍历,指定步长
<c:forEach var="fruit" items="${fruits }" begin="0" end="4" step="2">
<c:out value="${fruit }"></c:out>
<br />
</c:forEach>
结果:
apple
watermelon
- 使用varStatus获得当前元素状态
<c:forEach var="fruit" items="${fruits }" begin="1" end="3" step="1" varStatus="fru">
<c:out value="${fruit }"></c:out><br />
<c:out value="count:${fru.count }"></c:out><br />
<c:out value="index: ${fru.index }"></c:out><br />
<c:out value="first:${fru.first }"></c:out><br />
<c:out value="last:${fru.last }"></c:out><br />
<c:out value="-----------"></c:out><br />
<br />
</c:forEach>
结果:
pear
count:1
index: 1
first:true
last:false
-----------
watermelon
count:2
index: 2
first:false
last:false
-----------
orange
count:3
index: 3
first:false
last:true
-----------
- 切割字符串,默认以逗号为分隔符:
<c:forEach var="word" items="abc,edf,g">
<c:out value="${word }"></c:out>
</c:forEach>
- 遍历Map,var中是entry对象:
<%
Map<String,String> map = new HashMap<String, String>();
map.put("name", "tom");
map.put("password","123");
pageContext.setAttribute("map", map);
%>
<c:forEach var="entry" items="${map }">
<c:out value="${entry.key }:${entry.value }"></c:out><br/>
</c:forEach>
字符串截取 fortakens
<c:forTokens var=”str” items=”abc-def-ghi-jkl-mn-opq” delims=”-” begin=”0” end=”4” step=”1” varStatus=”strstate”></c:forTokens>
与ForEach功能不同,但是用法类似。items表示要操作的字符串,delims(delimiter)表示分隔符,var代表每次取值的变量,begin、end表示开始结束位置,varStatus表示状态,这几个属性用法与ForEach一样。
截取前5的单词:
<c:forTokens items="abc-def-ghi-jkl-mn-opq" delims="-" var="str" begin="0" end="4">
<c:out value="${str }"></c:out><br/>
</c:forTokens>
结果:
abc
def
ghi
jkl
mn