概述
在当代JSP页面开发中,一个最佳的Java Web开发实践就是在MVC架构模式中,综合使用JavaBean、EL、JSP自定义标记库以及JSP标准标记库JSTL,编写无Java脚本的JSP页面。通过综合使用这些技术,我们可以实现让熟悉各种标记的的界面设计师。与熟悉java编码的java程序员分工协作完成Javaweb项目的开发。
JSP表达式语句:EL
JSP页面中显示结果 jsp:useBean和jsp:getProperty两个元素冗长而笨拙
jsp:getProperty只支持对简单Bean属性的访问
<span style="color:#000099;">public class Person implements Serializable {
private String name;
private Dog dog;
……
}
public class Dog implements Serializable {
public String name;
……
}
</span>
<jsp:useBean id="person" class="com.lovobook.Person" scope="request" />
第一种:jsp脚本表达式
我的狗的名字是:<jsp:getProperty name="person" property="dog" />
结果:
我的狗的名字是:com.lovobook.Dog@e3570c (打印的是内存地址)
第二种:EL表达式
我的狗的名字是:${person.dog.name}
结果:
我的狗的名字是:小白
相同点:
两种表达式都可以让我们在静态内容中插入动态信息。
web容器会以同样的方式处理二者。即,一旦接收到请求,容器将计算表达式,将其转换为一个字符串,然后插入到响应输出流中。
不同点:
二者处理表达式内部变量的方式
1.JSP脚本表达式定义变量(但定义变量是java代码):<%! int num = 100 ; %>
2.EL表达式不能在脚本中定义变量。由于它的主要目标是从JSP页面中消除java代码。
在EL表达式中使用隐式变量
EL运算符
EL运算符可以分为四类
- 属性和集合访问运算符:点运算符、数组形式取值
- 算术运算符:加、减、乘、除
- 关系运算符:大于、小于、等于
- 逻辑运算符:逻辑与、逻辑或、逻辑非
EL函数
为JSP提供了完全的业务逻辑和表现逻辑分离
使用EL函数的步骤
- 方法类(.java):包含需要在JSP中使用的Java方法;
- 标记库描述文件(*.tld):映射每个Java方法到XML函数名;
- 部署描述文件(web.xml):映射TLD到标记库URI
- JSP页面(*.jsp):使用标记库URI和函数名调用方法。
方法类:
public class StrMethods {
public static String upper( String x )
{
return x.toUpperCase();
}
……
}
标记库描述文件:
TLD文件
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<function>
<name>upper</name>
<function-class>myFunc.StrMethods</function-class>
<function-signature>
java.lang.String upper(java.lang.String)
</function-signature>
</function>
部署描述文件:
Web.xml文件
<taglib>
<taglib-uri>
http://myFunc/Functions
</taglib-uri>
<taglib-location>
/WEB-INF/myFunc/Functions.tld
</taglib-location>
</taglib>
JSP页面
JSP文件
<%@ taglib prefix=myString uri=…%>
${myString:upper(param.x)}
自定义标记库与标准标记库JSTL
需要两个JAR文件。
第一个文件是jstl.jar,它为JSTL标记库提供API类。
第二个文件是standard.jar,它提供了标记库的实现类 。复制到WEB-INF目录下的lib子目录下。
通过<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>引入到JSP
JSTL通用标记
使不使用JSP脚本执行Java程序成为可能
支持变量:
JSTL流程控制
<c:if test="${x == '9'}">
${x}
</c:if>
<c:choose>
<c:when test="${color == 'white'}">
Light!
</c:when>
<c:when test="${color == 'black'}">
Dark!
</c:when>
<c:otherwise>
Colors!
</c:otherwise>
</c:choose>
循环:
<c:forEach var="x" begin="0" end="30" step="3">
${x}
</c:forEach>
循环赋值
<c:forEach var="num" items="${numArray}">
<c:set var="num" value="100" />
</c:forEach>
用JSTL访问URL信息
<c:url> 用于URL重写
<c:url value="/page.html" var="pagename"/>
<c:url value="/page.html" var="pagename">
<c:param name="param1" value="${2*2}"/>
<c:param name="param2" value="${3*3}"/>
</c:url>
<c:import>用于访问Servlet容器外的内容
<c:import url="/content.html" var="newstuff" scope="session">
<c:param name="par1" value="val1"/>
<c:param name="par2" value="val2"/>
</c:import>
<c:redirect> 与sendRedirect()方法相同
总结:
- JSP EL的主要目的是简化JSP的开发
- EL表达式总是放在大括号里,而且前面有一个美元符前缀
- EL中提供了隐式变量
- EL函数为JSP提供了完全的业务逻辑和表现逻辑分离
- JSTL1.1规范中定义了五个标准标记库,分别是核心标记库、XML标记库、SQL标记库、国际化标记库、函数标记库
- JSTL核心标记包括通用标记<c:catch>和<c:out>、变量支持标记<c:set>和<c:remove>、流程控制标记<c:if>、<c:choose>、<c:forEach>和<c:forTokens>、URL处理标记<c:url>、<c:import>和<c:redirect>