实验8 EL表达式
一、实验目的
- 了解表达式语言在项目开发中的作用;
- 重点掌握表达式语言的使用。
二、实验原理
表达式语言(EL)是JSP 2.0新增的功能。它是一种简洁的数据访问语言,通过它可以在JSP页面中方便地访问应用程序数据,无需使用JSP表达式(<%=和%>)以避免出现JSP脚本。EL的目标是使动态网页的设计、开发和维护更加容易。
EL的特点是访问数据可以使用点(.)运算符或方括号([])运算符;可以访问隐含对象;有自己的运算符构造表达式;可以使用Java语言编写的函数等。
命名变量不是局部变量或者实例变量,它是存放在特定范围内的属性,命名变量的名字和属性名字对应。
如果范围内不存在username属性,那么不会打印任何结果。
如:
${username}
等同于:
<%
String username = (String)pageContext.findAttribute(“username”);
If(username!=null){
%>
<%=username%>
<% } %>
1、EL常用方式
作用域 Java代码 EL的写法
页面域 pageContext.getAttribute(“color”); ${pageScope.color}
请求域 request.getAttribute(“color”); ${requestScope.color}
会话域 session.getAttribute(“color”); ${sessionScope.color}
上下文域 application.getAttribute(“color”); ${applicationScope.color}
自动查找 pageContext.findAttribute(“color”); ${color}
指定域获取数据,方式如下表所示。
表8-1域获取数据方式
EL中11个隐式对象如表8-2所示。
隐含对象名称 描述
pageContext 代表页面上下文对象,可以在页面上调用get方法
pageScope 代表页面域中的Map对象
requestScope 代表请求域中的Map对象
sessionScope 代表会话域中的Map对象
applicationScopeScope 代表上下文域中的Map对象
param 得到表单提交参数,功能与:request.getParameter()相同
paramValues 得到表单提交参数,功能与:String[] request.getParameterValues()相同
header 得到请求头的数据 request.getHeader(“名字”)
headerValues 得到请求头的数据 request.getHeaders(“名字”)
cookie 得到请求的Cookie信息
initParam 相当于config.getInitParamter()得到web.xml中配置的参数
表8-2隐含对象表
pageContext调用get的方法如表8-3所示。
表8-3
作用 JSP表达式 EL的写法
当前工程路径 <%=request.getContextPath() %> ${pageContext.request.contextPath}
请求资源路径 <%=request.getContextURL() %> ${pageContext.request.contextURL}
访问者的IP <%=request.getRemoteAddr() %> ${pageContext.request.remoteAddr}
当前会话的ID <%=request.getSession().getId() %> ${pageContext.request.session.id}
2、得到Cookie中的值
先通过EL得到指定cookie的对象,再通过name和value得到具体的名字和值
<%
Cookie c = new Cookie(“man”,“jack”);
response.addCookie©;
%>
读取Cookie:
名字:cookie.man.name<值:{cookie.man.value } <%– 调用 cookie.getValue() –%>
3、EL表达式中[]和.的区别
如果一个变量名中有特殊的字符,则应用使用[“名字”];
比如获取header中host属性,一共有两种写法:
header[“host”]{header.host }
若获取user-agent属性,只能使用中括号
{a.name} 年龄:
{a.male}
(2)获取数组中的值
<%
String[] arr = {“aaa”,“bbb”,“cccc”};
pageContext.setAttribute(“arr”, arr);
%>
取数组中的元素:
${arr[0]} ${arr[1]} ${arr[2]}
(3)获取Map中的值
<%
map.put(“n1”,“猪八戒”);
map.put(“n2”,“唐僧”);
map.put(“n3”,“孙悟空”);
//放在请求域中
request.setAttribute(“map”, map);
%>
${map.n1}
${map[“n2”]}
${map.n3}
(4)输出List中指定索引位置的元素
<%
List book = new ArrayList();
book.add(“水浒传”);
book.add(“西游记”);
book.add(“红楼梦”);
session.setAttribute(“books”, book);
%>
${books[0] }
${books[1] }
${books[2] }
三、实验任务与步骤
(一)表达式语言运算符的基本语法的应用。
- 实验任务:编写SP页面ELTest.jsp演示EL运算符的使用。
- 实验步骤
(1)编写一个页面ELTest.jsp。
ELTest.jsp参考代码如下:
<%@ page contentType=“text/html;charset=UTF-8”%>
JSP 2.0 表达式语言 - 基本算术运算符
该例说明了基本的表达式语言的算术运算符的使用,其中包括加(+),减(-), 乘(*),除(/ 或 div), 取余 (% 或 mod)。
(3)在浏览器地址栏输入如下URL:http://localhost:8080 /prac06_EL/ELTest.jsp,弹出如图8-1所示界面。
EL 表达式 结果 \${1} ${1} \${1 + 2} ${1 + 2} \${1.2 + 2.3} ${1.2 + 2.3} \${1.2E4 + 1.4} ${1.2E4 + 1.4} \${-4 - 2} ${-4 - 2} \${21 * 2} ${21 * 2} \${3/4} ${3/4} \${3 div 4} ${3 div 4} \${3/0} ${3/0} \${10%4} ${10%4} \${10 mod 4} ${10 mod 4} \${(1==2) ? 3 : 4} ${(1==2) ? 3 : 4}
图8-1
(二)通过EL表达式访问作用域变量
- 实验任务:编写EmployeeBean.java、input.jsp、EmployeeServlet.java、displayEmployee.jsp,在input.jsp页面的表单中填写数据,提交给Servlet将参数保存到EmployeeBean的对象中,并将对象存入请求的域中,再请求转发给displayEmployee.jsp页面,在页面中用EL表达式显示。
- 实验步骤
【步骤1】编写JavaBean(EmployeeBean.java)代码,EmployeeBean.java参考代码如下:
package beans;
public class EmployeeBean {
private String eno = “”;
private String ename = “”;
private String gender = “”;
private String hobbs = null;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobbs() {
return hobbs;
}
public void setHobbs(String hobbs) {
this.hobbs = hobbs;
}
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页面:input.jsp,在其中通过表单输入雇员信息,将请求转发到一个Servlet。
<%@ page contentType=“text/html;charset=UTF-8”%>
雇员号: | |
雇员名: | |
性 别: | 男 女 |
爱 好: | 音乐 体育 美术 |
公司名: |
import java.io.;
import javax.servlet.;
import javax.servlet.http.*;
import beans.EmployeeBean;
public class EmployeeServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
request.setCharacterEncoding(“UTF-8”);
String eno = request.getParameter(“eno”);
String ename = request.getParameter(“ename”);
String gender = request.getParameter(“gender”);
String ecompany = request.getParameter(“ecompany”);
String[] hobbs = request.getParameterValues(“hobbs”);
EmployeeBean employee = new EmployeeBean();
employee.setEno(eno);
employee.setEname(ename);
employee.setGender(gender);
StringBuilder builder = new StringBuilder();
for(String str:hobbs){
builder.append(str).append(",");
}
employee.setHobbs(builder.toString());
employee.setEcompany(ecompany);
request.setAttribute("employee", employee);
RequestDispatcher view =
request.getRequestDispatcher("/displayEmployee.jsp");
view.forward(request, response);
}
}
web.xml参考代码如下:
employee
servlet.EmployeeServlet
【步骤4】编写displayEmployee.jsp页面,使用EL表达式显示用户的信息
<%@ page contentType=“text/html;charset=UTF-8”%>
- 雇员号:${employee.eno}
- 雇员名:${employee.ename}
- 性 别:${employee.gender}
- 爱 好:${employee.hobbs}
- 公司名:${employee.ecompany}
- 雇员号:${param.eno}
- 雇员名:${param.ename}
- 性 别:${param.gender}
- 爱 好:${param.hobbs}
- 公司名:${param.ecompany}
图8-2
(三)编写一个简单的投票系统,用EL表达式显示投票结果
- 实验任务:编写votet.jsp、VoteServlet.java、voteResult.jsp,在votet.jsp页面选择所投项目,然后提交到VoteServlet.java,在VoteServlet.java中对投票结果进行统计然后到voteResult.jsp页面用EL表达式进行显示。
- 实验步骤
【步骤1】编写相关代码。
VoteServlet.java参考代码如下:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class VoteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(“UTF-8”); //设置请求编码方式
String item=request.getParameter(“item”); //获取投票项
//下面是获取ServletContext对象,该对象在application范围有效
ServletContext servletContext=request.getSession().getServletContext();
Map map=null;
if(servletContext.getAttribute(“voteResult”)!=null){
map=(Map)servletContext.getAttribute(“voteResult”); //获取投票结果
map.put(item,Integer.parseInt(map.get(item).toString())+1); //当前投票结果加1
}else{ //初始化一个保存投票信息的Map集合,并将选定投票项的投票结果加1,其它为0
// String[] arr={“基础教程类”,“实例教程类”,“经验技巧类”,“速查手册类”,“案例剖析类”};
String[] arr={“a”,“b”,“c”,“d”,“e”};
map=new HashMap();
for(int i=0;i<arr.length;i++){
if(item.equals(arr[i])){ //判断是否为选定的投票类
map.put(arr[i], 1);
}else{
map.put(arr[i], 0);
}
}
}
servletContext.setAttribute(“voteResult”, map); //保存投票结果到ServletContext对象中
//设置相应类型和编码方式,如果不设置弹出对话框会乱码
response.setContentType(“text/html;charset=UTF-8”);
PrintWriter out=response.getWriter();
out.println(“”);
}
}
在WebRoot下新建文件夹vote,在vote下建立vote.jsp和voteResult.jsp文件
vote.jsp参考代码如下:
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
您最需要哪方面的图书?
- 基础教程类
- 实例教程类
- 经验技巧类
- 速查手册类
- 案例剖析类
voteResult.jsp参考代码如下:
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
您最需要哪方面的图书?
- 基础教程类: ${null==applicationScope.voteResult.a?0:applicationScope.voteResult.a}
- 实例集锦类: ${null==applicationScope.voteResult.b?0:applicationScope.voteResult.b}
- 经验技巧类: ${null==applicationScope.voteResult.c?0:applicationScope.voteResult.c}
- 速查手册类: ${null==applicationScope.voteResult.d?0:applicationScope.voteResult.d}
- 案例剖析类: ${null==applicationScope.voteResult.e?0:applicationScope.voteResult.e}
- 共有:${applicationScope.voteResult.a+applicationScope.voteResult.b+ applicationScope.voteResult.c+applicationScope.voteResult.d+ applicationScope.voteResult.e}人投票!
图8-3
四、思考题
- 理解${2+3}与"2+3"的区别
-
{user==null}
3、获取web开发常用对象 EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。