zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    进程隐藏类
    MFC中一些使用的方法
    c++/vc++的一些学习方法
    随意更改桌面壁纸
    Winsock异步模型之(事件通知模型 WSAAsyncSelect)
    开发外挂的一些原理
    ios 图片
    得到cell的坐标
    取出字符串中的空格
    ios 获取当前的日期,年月日
  • 原文地址:https://www.cnblogs.com/liuping/p/2228597.html
Copyright © 2011-2022 走看看