第8章 JSP和EL----补充

8.1 El及其在JSP中的重要地位

     引入EL(Expresin Language)主要原因之一是,希望不依赖脚本元素就能创建表示层Jsp页面。脚本元素一般是用Java编写的代码,可以嵌入到一个 

    Jsp页面中。之所以想在Jsp中嵌入脚本元素,主要是受应用需求的驱使。要求使用脚本元素的主要应用需求如下:

    为Jsp提供流程控制

    设置Jsp页面局部变量,并在以后访问

    要提供复杂表达式(涉及Java对象)的值

    访问一个任意Java对象的属性

   调用JavaBean或其它Java对象的方法

    经验告诉我们,在Jsp中使用脚本元素,会使大型项目从长远来看很难维护。理想情况下,应尽一切可能创建没有脚本元素的Jsp

   为了创建完全没有脚本元素也能正常工作的Jsp,它应满足上述5个应用需求,而且无需使用嵌入的Java代码。前两项由JSTL处理,后三项由EL解决

8.2 EL语法

   ${expression}

    由${ 开头,接着expression是EL的表达式,最后以 }结尾。在这里${ 符号被视为EL的起始点,所以如果在Jsp网页中要显示${ 字符串,必须在前面加

     上反斜杠符号\,亦即写成\${ 的格式,或者写成${ ‘ ${ ’ },也就是用EL来输出${ 符号。在EL中要输出一个字符串,可将此字符串放在一对单引

     号或双引号内。

8.3 EL运算符

     1.算术运算符

          image  

      2.关系运算符

image

    3.逻辑运算符

  image

     4.条件运算符

    image

       5.验证运算符

   image

       6. 运算符的优先级

      image

     补充:EL内置对象:

          1..与[]运算符: 

          2.与存储有关的内置对象

               applicationScope

               sessionScope

               requetScope

                pageScope

               但是4个隐含对象只能有业取得某个范围的属性值即jsp中的getAttribute(String   name),不能取得其他信息.   

          3.与输入有关的内置对象

                param

                paramValues

           4.其它内置对象

                cookis

                header内置对象

                initParam内置对象

                pageContext内置对象

image

           例8-3 访问javaBean属性

      eighth_example2.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link href="css/style.css" type="text/css" rel="stylesheet">
<title>用户注册</title>
</head>

<body>
<table width="659" height="425" border="0" align="center" cellpadding="0" cellspacing="0"background="image/backgrounb.jpg">
  <tr>
    <td height="71" align="center">用户注册</td>
  </tr>
  <tr>
    <td valign="top">
    <form name="form" method="post" action="getInfo.jsp">
   
    <table width="346" border="1" align="center" cellpadding="0" cellspacing="0">
      <tr align="center">
        <td width="113" height="30">用&nbsp;户&nbsp;名:</td>
        <td width="227"><input type="text" name="account"></td>
      </tr>
      <tr align="center">
        <td height="30">密&nbsp;&nbsp;&nbsp;&nbsp;码:</td>
        <td><input type="password" name="password"></td>
      </tr>
      <tr align="center">
        <td height="30">姓&nbsp;&nbsp;&nbsp;&nbsp;名:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr align="center">
        <td height="30">年&nbsp;&nbsp;&nbsp;&nbsp;龄:</td>
        <td><input type="text" name="age"></td>
      </tr>
      <tr align="center">
        <td height="30">性&nbsp;&nbsp;&nbsp;&nbsp;别:</td>
        <td><input type="text" name="sex"></td>
      </tr>
      </table>
        <table width="346" border="0" align="center">
          <tr align="center">
            <td>
              <input type="submit" name="Submit" value="提交">&nbsp;&nbsp;&nbsp;
              <input type="reset" name="Submit2" value="清除">
            </td>
          </tr>
        </table>
    </form>
   
    </td>
  </tr>
</table>
</body>
</html>

         getInfo.jsp

<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link href="css/style.css" type="text/css" rel="stylesheet">
<jsp:useBean id="userBean" scope="request" class="pfc.UserBean"/>
<%
request.setCharacterEncoding("gb2312");
userBean.setAccount(request.getParameter("account"));
userBean.setPassword(request.getParameter("password"));
userBean.setAge(request.getParameter("age"));
userBean.setSex(request.getParameter("sex"));
userBean.setUsername(request.getParameter("username"));
%>

</head>
<body>
<table width="659" height="425" border="0" align="center" cellpadding="0" cellspacing="0"background="image/backgrounb.jpg">
  <tr>
    <td height="71" align="center">用户注册信息是</td>
  </tr>
  <tr>
    <td valign="top">
    <table width="346" border="1" align="center" cellpadding="0" cellspacing="0">
      <tr align="center">
        <td width="113" height="30">用&nbsp;户&nbsp;名:</td>
        <td width="227">${userBean.account}</td>
      </tr>
      <tr align="center">
        <td height="30">密&nbsp;&nbsp;&nbsp;&nbsp;码:</td>
        <td>${userBean.password}</td>
      </tr>
      <tr align="center">
        <td height="30">姓&nbsp;&nbsp;&nbsp;&nbsp;名:</td>
        <td>${userBean.username}</td>
      </tr>
      <tr align="center">
        <td height="30">年&nbsp;&nbsp;&nbsp;&nbsp;龄:</td>
        <td>${userBean.age}</td>
      </tr>
      <tr align="center">
        <td height="30">性&nbsp;&nbsp;&nbsp;&nbsp;别:</td>
        <td>${userBean.sex}</td>
      </tr>
         </table>
        </td>
  </tr>
</table>
</body>
</html>

      UserBean.java

package pfc;

public class UserBean {
    public String account = "";
    public String password = "";
    public String username= "";
    public String age= "";
    public String sex= "";
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
   

}

运行结果一

image

image

       例4:pageContext隐含对象的应用,eighth_example3.jsp

<%@ page pageEncoding="gb2312"%>
<html>
    <head>
        <title>pageContext隐含对象的调用</title>
        <link href="css/style.css" type="text/css" rel="stylesheet">
<body>
<p align="center">pageContext隐含对象的调用</p>
<table width="737" border="1" align="center">
  <tr align="center">
    <td>pageContext隐含对象的调用</td>
    <td >说明</td>
    <td >调用结果</td>
  </tr>
  <tr>
    <td>\${pageContext.request.queryString}</td>
    <td>获取参数</td>
    <td>${pageContext.request.queryString}</td>
  </tr>
  <tr>
    <td>\${pageContext.request.requestURL}</td>
    <td>获取当前网页的地址,但是包含请求的参数</td>
    <td>${pageContext.request.requestURL}</td>
  </tr>
  <tr>
    <td>\${pageContext.request.contextPath}</td>
    <td>web应用的名称</td>
    <td>${pageContext.request.contextPath}</td>
  </tr>
  <tr>
    <td>\${pageContext.request.method}</td>
    <td>获取HTTP的方法(GET或POST)</td>
    <td>${pageContext.request.method}</td>
  </tr>
  <tr>
    <td>\${pageContext.request.remoteAddr}</td>
    <td>获取用户的IP地址</td>
    <td>${pageContext.request.remoteAddr}</td>
  </tr>
</table>
</body>
</html>

image

             例5:获取参数隐含对象的应用,eighth_example4.jsp

eighth_example4.jsp

<%@ page pageEncoding="gb2312"%>
<html>
<link href="css/style.css" type="text/css" rel="stylesheet">
<body>
<p align="center">param和paramValues隐含对象的应用</p>

<form name="form" method="post" action="getPara.jsp">
<table width="426" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="108" height="30">姓名</td>
    <td width="298" height="30"><input type="text" name="name"></td>
  </tr>
  <tr>
    <td height="30">性别</td>
    <td height="30">
      <input type="radio" name="sex" value="男">
    男&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="radio" name="sex" value="女">
    女</td>
  </tr>
  <tr>
    <td height="30">年龄</td>
    <td height="30"><input type="text" name="age"></td>
  </tr>
  <tr>
    <td height="30">职业</td>
    <td height="30"><input type="text" name="profession"></td>
  </tr>
  <tr>
    <td height="30">您喜欢的高校</td>
    <td height="30">
      <input type="checkbox" name="school" value="清华">
    清华
    <input type="checkbox" name="school" value="北大">
    北大
    <input type="checkbox" name="school" value="北大方正软件学院">
    北大方正软件学院
    <input type="checkbox" name="school" value="其他">
    其他</td>
  </tr>
  <tr align="center">
    <td height="30" colspan="2">

        <input type="submit" name="Submit" value="提交">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

      <input type="reset" name="Submit2" value="清除">

   
    </td>
  </tr>
</table></form>
</body>
</html>

getPara.jsp:

<%@ page pageEncoding="gb2312"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
        <link href="css/style.css" type="text/css" rel="stylesheet">
<%request.setCharacterEncoding("gb2312");%>

</head>

<body>
<p align="center">param和paramValues隐含对象的参数</p>
<table width="416" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="108" height="30">姓名</td>
    <td width="298" height="30">${param.name}</td>
  </tr>
  <tr>
    <td height="30">性别</td>
    <td height="30">${param.sex}</td>
  </tr>
  <tr>
    <td height="30">年龄</td>
    <td height="30">${param.age}</td>
  </tr>
  <tr>
    <td height="30">职业</td>
    <td height="30">${param.profession}</td>
  </tr>
  <tr>
    <td height="30">您喜欢的高校</td>
    <td height="30">${paramValues.school[0]} ${paramValues.school[1]} ${paramValues.school[2]} ${paramValues.school[3]}</td>
  </tr>
</table>
</body>
</html>

image

image

      例8-6 访问作用域范围隐含对象的应用

<%@ page contentType="text/html; charset=gb2312" language="java"  %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>EL中pageScope、requestScope、sessionScope、applicationScope隐含对象</title>
</head>
<%
pageContext.setAttribute("name","作用域为page",PageContext.PAGE_SCOPE);
pageContext.setAttribute("name","作用域为request",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name","作用域为session",PageContext.SESSION_SCOPE);
pageContext.setAttribute("name","作用域为application",PageContext.APPLICATION_SCOPE);  
%>
<body>
\${name}:${name}<br>
\${pageScope}:${pageScope.name}<br>
\${requestScope}:${requestScope.name}<br>
\${sessionScope}:${sessionScope.name}<br>
\${applicationScope}:${applicationScope.name}
</body>
</html>

image

例7   访问Servlet中的作用域,eighth_example6.jsp

eighth_example6.jsp

<%@ page contentType="text/html; charset=gb2312"  %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<link href="css/style.css" rel="stylesheet" type="text/css">
<title>访问Servlet</title>
<style type="text/css">
<!--
body {
    background-color: #FFCC00;
}
-->
</style></head>
<body>
<p align="center">访问Servlet</p>
<table width="402" height="100" border="0" align="center">
  <tr>
    <td width="143">作用域为request:</td>
    <td width="306">${university1}</td>
  </tr>

  <tr>
    <td>作用域为session:</td>
    <td>${university2}、${university3}</td>
  </tr>
 
  <tr>
    <td>作用域为application:</td>
    <td>${university4}</td>
  </tr>
 
  <tr>
    <td>访问数组:</td>
    <td>${city[0]}、${city[1]}、${city[2]}</td>
  </tr>
 
    <tr>
    <td>访问List集合:</td>
    <td>${majorList[0]}、${majorList[1]}、${majorList[2]}</td>
  </tr>
 
</table>
</body>
</html>

UserInfoServlet.java

package pfc;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class UserInfoServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 作用域为request
        request.setAttribute("university1", "清华");
        // 作用域为session
        HttpSession session = request.getSession();
        session.setAttribute("university2", "北大");
        session.setAttribute("university3", "南大");
        // 作用域为application
        ServletContext application = getServletContext();
        application.setAttribute("university4", "天大");
        // 作用域为session,访问数组
        String city[] = { "北京", "天津", "南京" };
        session.setAttribute("city", city);
        // 作用域为session,访问List容器
        java.util.List<String> majorList = new java.util.ArrayList<String>();
        majorList.add("软件技术");
        majorList.add("软件测试");
        majorList.add("游戏软件");
        session.setAttribute("majorList", majorList);
        RequestDispatcher dispatcher = request
                .getRequestDispatcher("eighth_example6.jsp");
        dispatcher.forward(request, response);
    }
}

image

8.5 函数

由于在Jsp 2.0中,程序代码是独立放在Java class里, EL必须要有一个机制可以调用Java class 的方法,而这个机制即是函数。一个函数可以对应到一个Java class的public static method,这个对应是通过中介的文件,即标签库描述文件(Tag Library Descriptor,TLD)来完成。类必须声明为public 的,而类内被调用的方法必须声明为public static的

例 8-8 eighth_example7.jsp

<%@ page contentType="text/html; charset=gb2312"  %>
<%@ taglib prefix="fun" uri ="/WEB-INF/function.tld"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<link href="css/style.css" type="text/css" rel="stylesheet" />
<title>自定义函数的应用</title>
</head>
<style type="text/css">
<!--
body {
    background-color: #FFCC00;
}
-->
</style>
<body>
<p align="center">自定义函数的应用</p>
<form name="form1" method="post" action="eighth_example7.jsp">

<table width="300" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="272" align="center"> 
    第一个字符串<input type="text" name="first" value="${param.first}">&nbsp;&nbsp;
    </td>
  </tr>
   <tr>
    <td width="272" align="center"> 
    第二个字符串<input type="text" name="second" value="${param.second}">&nbsp;&nbsp;
    </td>
  </tr>
  <tr>
    <td width="272" align="center"> 
    <input type="submit" name="Submit" value="提交">
  </td>
  </tr>
</table>
</form>
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr align="center">
    <td width="189" height="25">说明</td>
    <td width="111">输出结果</td>
  </tr>
  <tr align="center">
    <td height="25">将第一个字符串内容反向输出</td>
    <td>${fun:reverse(param.first)}</td>
  </tr>
   <tr align="center">
    <td height="25">将第一个字符串内容转换为大写字母</td>
    <td>${fun:cape(param.first)}</td>
  </tr>
  <tr align="center">
    <td height="25">将两个字符串内容连接</td>
       <td>${fun:connect(param.first,param.second)}</td>
  </tr>
 
</table>
</body>
</html>

KindMethod.java

package pfc;
public class KindMethod {
    // 反向输出
    public static String reverse(String text) {
        return new StringBuffer(text).reverse().toString();
    }
    // 转换成大写字母
    public static String cape(String text) {
        return text.toUpperCase();
    }
    public static String connect(String x, String y) {
        return x+y;
    }
}

function.tld

<?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>library</description>
  <display-name>functions</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>fun</short-name>
  <function>
    <description>reverse</description>
    <name>reverse</name>
    <function-class>pfc.KindMethod</function-class>
    <function-signature>java.lang.String reverse( java.lang.String )</function-signature>
  </function>
   <function>
    <description>cape</description>
    <name>cape</name>
    <function-class>pfc.KindMethod</function-class>
    <function-signature>java.lang.String cape( java.lang.String )</function-signature>
  </function>
  <function>
    <description>connect</description>
    <name>connect</name>
    <function-class>pfc.KindMethod</function-class>
    <function-signature>java.lang.String connect( java.lang.String, java.lang.String)</function-signature>
  </function>
</taglib>

表8.5 function.tld的说明

description 函数说明
name 函数名称
function-class 实现此函数java类名称
function-signature 用来实现此函数的java mthod声明

image

 

posted @ 2014-12-08 14:52  elite_2012  阅读(219)  评论(0编辑  收藏  举报