JSP Standard Tag Library 标准标签库:
Model 1 开发模式采用jsp 内嵌java 代码的方式实现业务逻辑与前台页面的交互,这样虽然使得前台调用业务简单,却也导致jsp多重职责,在系统庞大的项目中,难以继续应用。Model 2则在业务逻辑manager与jsp间创建一层servlet,作为业务层与jsp显示层的桥梁,将jsp中大部分获值的java代码写到servlet中,以减轻jsp负担;但这样做也不可避免的需要在jsp中写入形似<%=user.getName() %>这样的代码获值。
JSTL标签库的使用便可彻底代替上述java代码,以类似于html标签的形式,结合EL表达式,获取数据。
使用EL表达式时无需引入任何jar包,只要jsp/servlet容器实现了J2EE1.4 、Servlet2.4、JSP2.0规范即可。
Servlet中doGet方法如下,分别用EL表达式获取servlet传递的不同类型数值:
//结构 Group group =new Group(); group.setName("动力节点"); User user =new User(); user.setAge(23); user.setGroup(group); user.setUserName("zhang"); //map Map map=new HashMap(); map.put("k1","v1"); map.put("k2", "v2"); request.setAttribute("map", map); request.setAttribute("user",user); //数组 String[] strArray=new String[]{"a","b","c"}; request.setAttribute("straary", strArray); //对象数组 User[] users=new User[10]; for(int i=0;i<users.length;i++) { users[i]=new User(); users[i].setUserName("钟艾伶_"+i); } //list 集合 List userList=new ArrayList(); for(int i=0;i<10;i++) { User userss=new User(); userss.setUserName("李四"+i); userList.add(userss); } request.setAttribute("userList",userList); request.setAttribute("users",users); request.setAttribute("v2",""); request.setAttribute("v3",new ArrayList()); request.setAttribute("v4","12"); request.setAttribute("v5",null); //分发器 将request、response传到jsp中 request.getRequestDispatcher("/jstl_el.jsp").forward(request, resp);
EL获取字符串:
hello(普通jsp脚本获值):<%=request.getAttribute("hello")%><br> hello(el表达式获值): ${hello}<br>EL获取对象:【对象.属性(get方法后的串,拼成get方法)】
<li>结构 .进行导航 存取器</li> 姓名:${user.userName} <br> 年龄:${user.age}<br> 所属组:${user.group.name}<br>EL获取map:
<li>map</li><br> map.k1:${map.k1 }<br> map.k2:${map.k2 }<br>
EL获取字符串数组:
<li>字符串数组</li><br> strArray[1]:${strarry[1] } strArray[4]:${strarry[4] }
EL获取对象数组:
<li>对象数组</li> users[5].username:${users[5].username}<br>EL获取List集合:
<li>list.采用[].下标</li> userList[6].username:${userList[6].username}<br>EL表达式对运算符的支持:
1+1=${1+1 }<br> 1/1=${1/1 } <br> 10 % 2=${10 % 2 } <br>
常用的jstl标签及其使用:
使用JSTL标签不同于EL表达式可直接使用即可,JSTL使用前需将jstl.jar 和standard.jar拷贝到WEN-INF/lib包下,重启tomcat后,在相应的jsp页面采用taglib指令,引入标签库方可。
<%@taglib uri=" http://java.sun.com/jsp/jstl/core"prefix="c"%>
JSTL标签结合EL表达式的使用:
对应servlet中doGet方法:
//普通字符串 request.setAttribute("hello", "helloWorld"); //HTML字符串 request.setAttribute("hello","<font color=red>北京欢迎您!</font>" ); //条件控制 c:if request.setAttribute("v1","10"); request.setAttribute("v2","2"); //条件控制 c:choose c:when c:otherwise request.setAttribute("userList", new ArrayList()); //循环标签 c:foreach Group group=new Group(); group.setName("动力节点"); List userrs=new ArrayList(); for(int i=0; i<10;i++) { User userr=new User(); userr.setUserName("zhang"+i); userr.setAge(23+i); userr.setGroup(group); userrs.add(userr); } request.setAttribute("userrs",userrs); request.getRequestDispatcher("/jsp_el.jsp").forward(request, resp);
简单输出:c:out
<li>采用c:out标签</li> hello使用标签:<c:out value="123"/> hello使用标签:<c:out value="${hello} "/> hello使用标签:<c:out value="${hello123} ">没有值</c:out> hello使用标签:<c:out value="${welcome} escapXml="true" />
c:set c:remove
<li>c:set c:remove</li> <c:setvalue="root" var="userid"></c:set> userid:${userid} <c:removevar="userid"></c:remove> userid:${userid}逻辑判断标签: c:if \c:choose c:when c:otherwise
<li>条件控制标签 c:if</li> <c:iftest="${v1 lt v2 }">v1小于v2</c:if>
<li>c:choose c:when c:otherwise</li> <c:choose> <c:when test="${v1 gt v2}">v1 大于 v2</c:when> <c:otherwise> v1 小于 v2</c:otherwise> </c:choose> <c:choose> <c:when test="${emptyuserList}">没有满足条件的用户</c:when> <c:otherwise>存在用户数据</c:otherwise> </c:choose>循环标签: c:foreach
<li>jsp脚本显示</li> <tableborder="1"> <tr> <td>用户名</td> <td>年龄</td> <td>所属组</td> </tr> <% ListuserList=(List)request.getAttribute("userrs"); if(userList ==null || userList.size()==0){ %> <tr> <tdcolspan="3">没有符合条件的数据</td> </tr> <% }else{ for(Iteratoriter=userList.iterator();iter.hasNext()) { Useruser=(User)iter.next(); } } %> <tr> <td><%=user.getUserName()%></td> <td><%=user.getAge()%></td> <td><%=user.getGrop()%></td> </tr> </table><span style="font-family: 'Microsoft YaHei'; font-size: 14px; background-color: rgb(255, 255, 255);"> </span>
<li>循环标签 c:foreach</li> <tableborder="1"> <tr> <td>用户名</td> <td>年龄</td> <td>所属组</td> </tr> <c:choose> <c:whentest="${empty userrs }">没有符合条件的用户</c:when> <c:otherwise> <c:forEachitems="${userrs}" var="users" varstatus="vs"> <c:choose> <c:whentest="${vs.count mod 2 == 0 }"><trbgcolor="red"></c:when> <c:otherwise><tr></c:otherwise> </c:choose> <tr> <td>${users.userName}</td> <td>${user.age}</td> <td>${user.group}</td> </tr> </c:forEach> </c:otherwise> </c:choose> </table>
纠错标签:c:catch
<li>普通java</li> <% <span style="white-space:pre"> </span>try{ Integer.parseInt("dfadf"); <span style="white-space:pre"> </span>}catch(NumberFormatException e){ e.printStackTrace(); } %>
<li>c:catch</li> <c:catchitems="msg"> <%Integer.parseInt("dfadf"); %> </c:catch> ${msg }
界面引入传参:
<li>c:import 引入某jsp页面</li> <c:importurl="http://localhost:8099/jstl_el"></c:import> <li>c:url c:param</li> <c:urlvalue="http://localhost:8099/jstl_el"> <c:param name="userId"value="${userrs.userName }"></c:param> <c:param name="age"value="${userrs.age }"></c:param> </c:url>