一、ER表达式(Expression Language)注意点:
1.作用:减少JSP页面的Java代码的数量,即减少页面脚本.
2.禁用EL表达式:在page标签内设置isELIgnored属性为true,默认值为false(不禁用).
3.ER表达式符号表示:${ }
4.EL表达式不支持字符串串联
5.获取属性的两种表示方式:${xx.xx} 或 ${xx[“xx”]}
6.EL表达式的隐含变量有11个,JSP隐含变量有9个+Exception,两者共有的是pageCongtext
二、JSTL(JavaServerPages Standard Tag Library)
1.作用:该技术也是为了减少页面脚本.
2.Jstl主要包含5个部分:
<1>核心标签库(c)
<2>sql标签库(sql)
<3>xml标签库(x)
<4>函数标签库(fn)
<5>国际化(fmt)
3.使用jstl的准备工作:
<1>\WebContent/WEB-INF/lib下要有这3个jar包:jstl.jar、juli-6.0.14.jar、standard.jar
<2>页面配置信息部分要导包:
如:使用核心标签库 <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
Ⅰ.核心标签库:<c:….>
条件动作
<1><c:if test=”el表达式”>
条件满足下的内容
</c:if>
如:
<c:if test="${sessionScope.numguess.answer!=sessionScope.numguess.guess}">
<!-- c:if标签中间是if条件满足下的内容-->
</c:if>
<2><c:choose>、<c:when>、<c:otherwise>嵌套使用,相当于switch…case语句、if…else语句:
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
注:当<c:when></c:when>有多个时,相当于switch…case语句,此时<c:otherwise>相当于default的作用。
<3><c:out>页面输出
如:<c:out value="${header['Accept1']}" default="ddd"></c:out> <!—value为页面要输出的内容;value值找不到,就输出default里的值 -->
<c:out value="${'<a>超链接</a>'}" escapeXml="true"></c:out>
<!-- escapeXml设为true(默认)时对特殊字符转义直接打出来,false时不转义即此时为超链接模式 -->
<4><c:set> 页面赋值 <c:remove> 移除
如:
<!-- var:暴露出的变量名 value:变量值 scope:变量范围,默认为page -->
<c:set var="uname" value="z3"scope="request"></c:set> <!-- 赋值 -->
<c:out value="${requestScope.uname}"></c:out> <!-- 取值方式一-->
${requestScope.uname}<br> <!--取值方式二 -->
<c:remove var="uname" />
移除后的值:${requestScope.uname}<br>
<jsp:useBean id="user" class="com.zh.jstl.User" scope="request"></jsp:useBean>
<!-- target:对象名(必须用el表达式表示) property:属性名 value:属性值 -->
<c:set target="${user}" property="age"value="23"></c:set> <!-- 赋值 -->
${requestScope.user.age}<br>
<c:out value="${user.age}"></c:out> <!-- 取值:注意此处 requestScope.age取不到值-->
<5><c:catch> 异常处理
<c:catch var="ex">
<%=3/0 %>
</c:catch>
<c:out value="${ex}"></c:out> <!-- 打印出异常 -->
<6><c:forEach> 迭代(遍历)
a. Map的迭代
<!-- Map:键值对 -->
<%
Map map=new HashMap();
map.put("name","z3");
map.put("pwd","123");
request.setAttribute("m",map);
%>
<c:forEach items="${m}" var="entry">
<c:out value="${entry }"></c:out><br>
key:<c:out value="${entry.key}"></c:out><br>
value:<c:out value="${entry.value}"></c:out><br>
</c:forEach>
b. 数组的迭代
<%
User[] users=new User[2];
User u1=newUser();
u1.setName("z3");
u1.setAge(23);
users[0]=u1;
User u2=newUser();
u2.setName("l4");
u2.setAge(32);
users[1]=u2;
request.setAttribute("users",users);
%>
<c:forEach items="${users}" var="user">
<c:out value="${user.name }"></c:out><br>
<c:out value="${user.age }"></c:out><br>
</c:forEach>
c. 遍历的状态信息 <c:varStatus>
<%
int[]a={1,2,3,4,5,6};
request.setAttribute("a", a);
%>
<c:forEach items="${a}" var="num"varStatus="status"> <!-- varStatus指向的变量类型为LoopTagStatus-->
<c:out value="${status.index}"></c:out><br> <!-- 索引 -->
<c:out value="${status.count}"></c:out><br> <!-- 已经遍历的记录数 -->
<c:out value="${status.first}"></c:out><br> <!-- 是否为第一条记录 -->
<c:out value="${status.last}"></c:out><br> <!-- 是否为最后一条记录-->
</c:forEach>
d. 遍历范围:begin=”开始索引值” end=”结束索引值”
<%
int[]arr={1,2,3,4,5,6};
request.setAttribute("a",arr);
%>
<h1>遍历前三条记录:</h1>
如:
<!-- begin:从指定索引开始,end:从指定索引结束 -->
<c:forEach items="${a}" var="i"begin="0" end="2">
<c:out value="${i}"></c:out>
<c:if test="${status.last}">
总数是:<c:out value="${status.count}"></c:out>
</c:if>
</c:forEach>
<7><c:forTokens> 切割字符串
如:
<!-- 切割字符串 forTokens -->
<!-- forTokens是用来分割字符串的,items为要分割的字符串,delims为分隔符,此处为空格,var为分割每个字符的"指针" -->
<c:forTokens items="I am a student" delims=" " var="word"> <!-- 分割单个字符 -->
<c:out value="${word }"></c:out><br>
</c:forTokens>
<c:forTokens items="I'm a student,my name is z3." delims=" '," var="word"><!-- 分割多个字符 -->
<c:out value="${word }"></c:out><br>
</c:forTokens>
<8><c:redirect url=”...”></c:redirect>重定向:地址栏转为指定的url
如:<c:redirecturl="http://www.baidu.com"></c:redirect>
<9><c:import url=”…”></c:import>外部包含,可以导入本项目之外的资源,而<jsp:include page=””>(动态包含)和<%@include file=””%>(静态包含)不可以导入外部资源。
如:<c:importurl="http://www.baidu.com"></c:import>
<9><c:url var=”…” value=”…” scope=”…”></c:url>动态url
如:
<%
request.setAttribute("name", "z3");
%>
<c:url var="myurl" scope="request"value="c_set.jsp">
<c:param name="name" value="${name}"></c:param>
</c:url>
${myurl }
Ⅱ. Sql标签库:<sql:...>
SQL动作:
<1>数据库连接:<sql:setDataSource>
<sql:setDataSourceuser="用户名" password="密码" url="jdbc:mysql://localhost:3306/test"driver="com.mysql.jdbc.Driver" var="ds"/>
<1>更新插入:<sql:update>
<sql:update var="res" dataSource="${ds}" sql="insertinto tbuser values(?,?)">
<sql:paramvalue="23"></sql:param> <!--赋值方式一 -->
<sql:param>tw</sql:param> <!-- 赋值方式二-->
<!-- 结果:返回受影响的行数 -->
受影响的行数为:${res}
注:sql语句也可以放在标签中间,如:
<sql:updatevar="res" dataSource="${ds}">
insert into tbuservalues(?,?)
<sql:paramvalue="24"></sql:param>
<sql:param>xb</sql:param>
</sql:update>
<!-- 结果 -->
受影响的行数为:${res}
<2>查询:<sql:query>
<!-- maxRows:如果没有指定或指定为-1,那么不限制返回结果集
maxRows和startRow配合起来可以进行分页
-->
<sql:query var="rs" dataSource="${ds}"startRow="1" maxRows="-1"sql="select * from tbuser"></sql:query>
<c:forEach items="${rs.rows}" var="row">
<c:out value="${row}"></c:out><br> <!-- 取出一行中所有值-->
<c:out value="${row['name']}"></c:out><br> <!-- 取出一行中某属性的值-->
<c:out value="${row['id']}"></c:out><br>
</c:forEach>
<3>事务:<sql:transaction>
<4>插入日期:<sql:dateParam>
如:
<%
Date now=newDate();
request.setAttribute("now",now);
%>
传参时:<sql:dateParamvalue="${now}"/>