JSP--使用JSP(2)

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>

 

posted @ 2011-10-29 15:03  liuping  阅读(218)  评论(0编辑  收藏  举报