1.标准标签
JSP规范中提供了一些标准标签,所有容器都支持这些标签,它可以协助编写JSP时减少Scriptlet的使用。标准标签都以jsp:作为前置。后来提出的JSTL和EL在许多功能上可以代替标准标签,但在某些场合仍会见到这些标准标签的使用,有必要对它们有所认识。
<jsp:inlcude>和<jsp:forward>
如果想要在运行时依条件动态地调整想要包括的JSP,则可以使用<jsp:inlcude>标签。
<jsp:include page="add.jsp">
<jsp:param name="a" value="1" />
<jsp:param name="b" value="2" />
</jsp:include>
<jsp:param>标签指定了请求参数。
如果想要将请求转发给另一个JSP,则可以使用<jsp:foward>标签。
<jsp:forward page="add.jsp">
<jsp:param name="a" value="1" />
<jsp:param name="b" value="2" />
</jsp:forward>
<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>
<jsp:useBean>标签搭配JavaBean组件来使用,这里所说的JavaBean并非EJB中的JavaBean组件,而是POJO。下例就是一个POJO
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isValid() {
return "hopestar".equals(name) && "863230".equals(password);
}
}
使用POJO的目的在于减少JSP页面上Scriptlet的使用,一个例子如下:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="user" class="cc.openhome.User" />
<jsp:setProperty name="user" property="*" />
<!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>登录页面</title>
</head>
<body>
<%
if(user.isValid()) {
%>
<h1><jsp:getProperty name="user" property="name"/>登录成功</h1>
<%
}
else {
%>
<h1>登录失败</h1>
<%
}
%>
</body>
</html>
<jsp:setProperty>的property属性设置为*时,表示将自动寻找符合POJO中设置方法名称的请求参数值。如果请求参数名称为xxx,则将请求参数值使用setXxx()方法设置给POJO。上例中会自动寻找请求参数中有无name和password参数,有的话,通过setName()和setPassword()设置给JavaBean对象。
2.表达式语言EL
对于JSP中一些简单的属性、请求参数、标头和Cookie等信息的取得,一些简单的运算和判断,可以使用表达式语言来处理,还可以将一些常用的公共函数编写为EL函数,对于JSP上的Scriptlet又有一定量的减少。
对于如下Scriptlet:
<%
String a = request.getParameter("a");
String b = request.getParameter("b");
out.println("a + b = " + (Integer.parseInt(a) + Integer.parseInt(b)));
%>
可以使用一行程序来改写:
${param.a} + ${param.b} = ${param.a + param.b}
EL是使用${和}包括起来要进行处理的表达式。可以使用点运算符“.”指定要访问的属性,使用“+”进行算术运算。param是EL的一个隐含对象,表示用户的请求参数,param.a取得请求参数a的值。
使用EL访问属性
有以下代码:
<h1><jsp:getProperty name="user" property="name" />登录成功</h1>
可以用EL改写:
<h1>${user.name}登录成功</h1>
EL会依照page、request、session、application的顺序来寻找user属性,找到后使用getName()方法取得值。
如果EL访问的对象是数组,可以使用[]来指定索引访问数组元素。
<%
String[] names = {"liuping", "hopestar"};
request.setAttribute("array", names);
%>
EL可以如下访问数组元素:
${array[0]}<br>
${array[1]}<br>
另外,${user.name}可以写成${user["name"]}。又如:
<%
Map map = new HashMap();
map.put("user", hopestar);
map.put("role", admin);
request.setAttribute("login", map);
%>
可以如下使用EL:
${login.user}<br>
${login.role}<br>
或者
${login["user"]}<br>
${login["role"]}<br>
通常,左边是Map对象时,建议使用[],因为设置Map时的键名称可能有空白或者.字符:
<%
Map map = new HashMap();
map.put("user name", hopestar);
map.put("local.role", admin);
request.setAttribute("login", map);
%>
正确取得value的方法:
${login["user name"]}<br>
${login["local.role"]}<br>
[]可以进行嵌套:
<%
List names = new ArrayList();
names.add("hopestar");
names.add("liuping");
request.setAttribute("names", names);
Map datas = new HashMap();
map.put("hopestar", "hopestar's data");
map.put("liuping", "liuping's data");
request.setAttribute("datas", datas);
%>
//...
User data: ${datas[names[param.index]]}<br>
使用index=0时,会从names中取得“hopestar”,再从datas中取得“hopestar's data”。
EL自定义函数
如果你有一个InFix类,它有一个eval()静态方法可以将输入的表达式的结果返回。使用EL你可以这样用它:
${infix:eval(param.expression)}
要实现这个功能第一步要编写类InFix.java:
public class InFix {
//...
public static double eval(String infix) {
//这个方法必须是public和static的。
}
}
容器必须知道如何将这个类中的eval()方法当做EL函数来使用,需要编写一个标签链接库描述文件,这是个XML文件,扩展名是*.tld。
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>infix</short-name>
<uri>http://cc.openhome/infix</uri>
<function>
<description>Eval Infix</description>
<name>eval</name>
<function-class>
cc.openhome.InFix
</function-class>
<function-signature>
double eval(java.lang.String)
</function-signature>
</function>
</taglib>
然后就可以使用这个EL函数:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="infix" uri="http://cc.openhome/infix"%>
<!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>自定义 EL 函数</title>
</head>
<body>
${param.expression} = ${ infix:eval(param.expression) }
</body>
</html>