实验六 表达式语言的使用
一、实验目的
1. 了解表达式语言的功能;
2. 掌握表达式语言的使用。
二、实验原理
表达式语言(EL)是JSP 2.0新增的功能。它是一种简洁的数据访问语言,通过它可以在JSP页面中方便地访问应用程序数据,无需使用JSP表达式(<%=和%>)。EL的目标是使动态网页的设计、开发和维护更加容易。
EL的特点是访问数据可以使用点(.)运算符或方括号([])运算符;可以访问隐含对象;有自己的运算符构造表达式;可以使用Java语言编写的函数等。
三、实验内容与步骤
(一)表达式语言运算符的使用
下面的JSP页面operator.jsp演示了EL运算符的使用:
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>JSP 2.0 Expression Language - Basic Arithmetic</title>
</head>
<body>
<h1>JSP 2.0 表达式语言 - 基本算术运算符</h1>
<hr>
该例说明了基本的表达式语言的算术运算符的使用,其中包括加(+),减(-), 乘(*),除(/ 或 div), 取余 (% 或 mod)。
<br>
<blockquote>
<code>
<table border="1">
<thead>
<td><b>EL 表达式</b></td>
<td><b>结果</b></td>
</thead>
<tr><td>\${1}</td> <td>${1}</td> </tr>
<tr> <td>\${1 + 2}</td> <td>${1 + 2}</td> </tr>
<tr> <td>\${1.2 + 2.3}</td> <td>${1.2 + 2.3}</td> </tr>
<tr> <td>\${1.2E4 + 1.4}</td> <td>${1.2E4 + 1.4}</td> </tr>
<tr> <td>\${-4 - 2}</td> <td>${-4 - 2}</td> </tr>
<tr> <td>\${21 * 2}</td> <td>${21 * 2}</td> </tr>
<tr> <td>\${3/4}</td> <td>${3/4}</td> </tr>
<tr> <td>\${3 div 4}</td> <td>${3 div 4}</td> </tr>
<tr> <td>\${3/0}</td> <td>${3/0}</td> </tr>
<tr> <td>\${10%4}</td> <td>${10%4}</td> </tr>
<tr> <td>\${10 mod 4}</td> <td>${10 mod 4}</td> </tr>
<tr> <td>\${(1==2) ? 3 : 4}</td> <td>${(1==2) ? 3 : 4}</td> </tr>
</table>
</code>
</blockquote>
</body>
</html>
(二)访问作用域变量
编写一个名为EmployeeBean的JavaBean,其中包括3个属性eno表示雇员号、ename表示雇员名和ecompany表示雇员公司名。
【步骤1】EmployeeBean.java程序代码
package com.beans;
public class EmployeeBean {
private String eno = "";
private String ename = "";
private String ecompany = "";
public EmployeeBean() {
}
public void setEno(String eno){
this.eno = eno;
}
public void setEname(String ename){
this.ename = ename;
}
public void setEcompany(String ecompany){
this.ecompany = ecompany;
}
public String getEno(){
return eno;
}
public String getEname(){
return ename;
}
public String getEcompany(){
return ecompany;
}
}
【步骤2】编写一个JSP页面,在其中通过表单输入雇员信息,将请求转发到一个Servlet。
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<body>
请输入雇员信息:
<form action="employee.do" method="post">
<table>
<tr><td>雇员号:</td><td><input type="text" name="eno"></td></tr>
<tr><td>雇员名:</td><td><input type="text" name="ename"></td></tr>
<tr><td>公司名:</td><td><input type="text" name="ecompany"></td></tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
【步骤3】下面的Servlet从JSP页面得到客户信息
package com.control;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.beans.EmployeeBean;
public class EmployeeServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
String eno = request.getParameter("eno");
String ename = request.getParameter("ename");
String ecompany = request.getParameter("ecompany");
EmployeeBean employee = new EmployeeBean();
employee.setEno(eno);
employee.setEname(ename);
employee.setEcompany(ecompany);
request.setAttribute("employee", employee);
RequestDispatcher view =
request.getRequestDispatcher("/displayEmployee.jsp");
view.forward(request, response);
}
}
【步骤4】下面的JSP使用EL表达式显示用户的信息
<%@ page contentType="text/html;charset=gb2312"%>
<html><body>
雇员的信息如下:<br>
<ul>
<li>雇员号:${employee.eno}
<li>雇员名:${employee.ename}
<li>公司名:${employee.ecompany}
</ul>
</body></html>
(三)隐含对象的使用
下面的JSP页面implicit.jsp演示了EL隐含对象的使用。
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>EL implicit objects</title>
</head>
<body>
<h1>JSP 2.0 表达式语言-隐含对象</h1>
<hr>
<blockquote>
<b>输入foo参数值</b>
<form action="implicit.jsp" method="GET">
foo= <input type="text" name="foo" value="${param["foo"]}">
<input type="submit">
</form>
<br>
<code>
<table border="1">
<thead>
<td><b>EL 表达式</b></td>
<td><b>结果</b></td>
</thead>
<tr>
<td>\${param.foo}</td>
<td>${param.foo} </td>
</tr>
<tr>
<td>\${param["foo"]}</td>
<td>${param["foo"]} </td>
</tr>
<tr>
<td>\${header["host"]}</td>
<td>${header["host"]}</td>
</tr>
<tr>
<td>\${header["accept"]}</td>
<td>${header["accept"]}</td>
</tr>
<tr>
<td>\${header["user-agent"]}</td>
<td>${header["user-agent"]}</td>
</tr>
</table>
</code>
</blockquote>
</body>
</html>
(四)在JSP页面中使用Java函数
设要在JSP页面中使用一个add()函数,实现两个整数的加法运算。在JSP中使用Java函数要经过如下3个步骤:
【步骤1】函数的定义,创建类文件Compute.java。它定义了要在JSP中使用的add()方法。
package com.example.expsix;
public class Compute{
public static int add(String x,String y){
int a = 0;
int b = 0;
try{
a = Integer.parseInt(x);
b = Integer.parseInt(y);
}catch(Exception e){
System.err.println("Number format is illegal.");
}
return a+b;
}
}
package com.example.expsix;
import java.util.*;
public class Functions {
public static String reverse( String text ) {
return new StringBuffer( text ).reverse().toString();
}
public static int numVowels( String text ) {
String vowels = "aeiouAEIOU";
int result = 0;
for( int i = 0; i < text.length(); i++ ) {
if( vowels.indexOf( text.charAt( i ) ) != -1 ) {
result++;
}
}
return result;
}
public static String caps( String text ) {
return text.toUpperCase();
}
}
【步骤2】创建标签库描述文件taglib.tld。它实现将每个Java方法与函数名相匹配。
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A Simple Taglib File.</description>
<tlib-version>1.0</tlib-version>
<short-name>demo</short-name>
<uri>http://www.mydomain.com/function</uri>
<function>
<description>Adding two numbers</description>
<name>add</name>
<function-class>com.example.expsix.Compute</function-class>
<function-signature>
int add( java.lang.String, java.lang.String)
</function-signature>
</function>
<function>
<description>Reverses the characters in the given String</description>
<name>reverse</name>
<function-class>com.example.expsix.Functions</function-class>
<function-signature>java.lang.String reverse( java.lang.String )</function-signature>
</function>
<function>
<description>Counts the number of vowels (a,e,i,o,u) in the given String</description>
<name>countVowels</name>
<function-class>com.example.expsix.Functions</function-class>
<function-signature>int numVowels( java.lang.String )</function-signature>
</function>
<function>
<description>Converts the string to all caps</description>
<name>caps</name>
<function-class>com.example.expsix.Functions</function-class>
<function-signature>java.lang.String caps( java.lang.String )</function-signature>
</function>
</taglib>
注意:将该文件保存在Web应用程序WEB-INF\classes目录中。
还需要新建web.xml文件:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置taglib-->
<taglib>
<!--设置标签库唯一 url ;这里的 url 必须与 tld 文件中的 uri 一致-->
<taglib-uri>http://www.mydomain.com/function</taglib-uri>
<!--指明 tld 标签库描述文件的位置-->
<taglib-location>/WEB-INF/classes/taglib.tld</taglib-location>
</taglib>
<!---->
</web-app>
【步骤3】编写JSP文件sum.jsp,使用标签库URI以及函数名调用Java函数,代码如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib prefix="demo" uri="http://www.mydomain.com/function" %>
<%@page isELIgnored="false"%>
<html>
<head><title>Using Function </title></head>
<body>
<h3>计算两个整数之和</h3>
<p>
<form action="sum.jsp" method="post">
X = <input type="text" name="x" size="5" />
Y = <input type="text" name="y" size="5" />
<input type="submit" value="计算">
</form>
<p>
两个整数的和为:${demo:add(param["x"],param["y"])}
</body>
</html>
该页面运行结果为:
图10.1 sum.jsp页面的运行结果
(四)编写一个名为palindrome(String str)的Java函数,实现判断用户输入的字符串是否是回文(palindrome)。编写一个JSP页面,通过EL使用该函数。
在Functions类里面加入方法:
public static boolean palindrome(String str){
StringBuffer sb = new StringBuffer(str);
if((sb.reverse().toString()).equals(str)){
return true;
}else{
return false;
}
}
在taglib.tld中加入:
<function>
<description>Converts the string to all caps</description>
<name>palindrome</name>
<function-class>com.example.expsix.Functions</function-class>
<function-signature>boolean palindrome(java.lang.String)</function-signature>
</function>
新建jsp文件palindrome.jsp:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib prefix="demo" uri="http://www.mydomain.com/function" %>
<%@page isELIgnored="false"%>
<html>
<head><title>Using Function </title></head>
<body>
<h3>判断字符串是否是回文</h3>
<p>
<form action="palindrome.jsp" method="post">
S = <input type="text" name="s" size="5" />
<input type="submit" value="判断">
</form>
<p>
字符串是否是回文:${demo:palindrome(param["s"])}
</body>
</html>
四、思考题
1. 简述JSP表达式语言的主要功能有哪些?
JSP表达式语言(Expression Language,简称EL)的主要功能包括:
(1)简化表达式:EL 提供了在 JSP 中简化表达式的方法。其灵感来自于 ECMAScript 和 XPath 表达式语言,这使得 JSP 写起来更加简单。
(2)访问数据:EL 可以轻松地访问和操纵 JavaBean 中的数据。不论是算术表达式还是逻辑表达式的创建,EL 都可以胜任。
(3)支持多种数据类型:在 EL 表达式内,可以使用整型数、浮点数、字符串、常量 true、false,以及 null。
(4)提供可扩展函数:EL 具有映射到 Java 类中静态方法的可扩展函数。
(5)一组隐式对象:EL 提供了一组隐式对象,这些对象可以在表达式中直接使用,无需声明。
(6)运行时表达式的功能:EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。
2.简述在JSP页面中使用Java函数的步骤。
在JSP页面中使用Java函数的步骤大致如下:
(1)首先,需要创建一个Java类,并在其中定义想要使用的函数。注意,这个函数必须是静态的。
(2)在JSP页面中,通过 <%@ page import="包.类" %> 的方式引入创建的Java类。
(3)在JSP页面中,可以直接通过类名和方法名调用该函数。例如,如果函数是 public static String sayHello(String name),那么在JSP页面中可以这样调用:<%= 类名.sayHello("world") %>。
注意:虽然在JSP中可以使用Java代码,但这并不是一种好的做法。因为JSP主要应该用于表示层,即显示数据给用户,而业务逻辑和数据处理应该在Servlet或其他Java类中完成。在JSP中过多使用Java代码会使表示层和业务逻辑混在一起,导致代码难以维护和扩展。因此,在实际开发中,应尽量避免在JSP页面中使用过多的Java代码。