• 编写无Java脚本的JSP页面


    在上一章中总结了Web开发中应用MVC架构模式,将Servlet 用做控制器,JSP作为视图,JavaBean作为模型,实现业务流程控制,页面逻辑和业务逻辑的分离。然而,使用前面的技术实现MVC,并不是最完美的。

    在当代的一个最佳的JavaWeb开发实践就是在MVC架构模式中,中和使用JavaBean,EL(expression language),JSP自定义标记库以及JSP标准标记库JSTL,编写无java脚本的JSP页面。

    一 JSP表达式语言EL

     在使用基于MVC架构模式的Web应用开发中,我们使用Servlet解析用户的请求,调用业务逻辑或数据访问代码,将得到的结果放入Bean中,然后将Bean出处在请求,会话或Servlet上下文中。最后将请求转发给JSP页面。JSP页面通过标准动作jsp:getProperty,和jsp:useBean得到储存在作用域中的Bean属性数据,显示在页面上。我们使用EL就是在最后的步骤不一样。我们不在使用jsp:getProperty和jsp:useBean。不同之处看看下面的案例。

    有两个示例的JavaBean,Person和Dog。 Person有一个字符串类型的userName属性,同时有一个Dog类型的dogName属性。Dog有一个字符串类型的name属性。

    我们取出人的名字,和dog的名字。

    Dog

     1 package com.cy.bean;
     2 
     3 import java.io.Serializable;
     4 
     5 public class Dog  implements Serializable{
     6     private String name;
     7 
     8     public String getName() {
     9         return name;
    10     }
    11 
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15     
    16 
    17 }

    Person 

     1 package com.cy.bean;
     2 
     3 import java.io.Serializable;
     4 
     5 public class Person implements Serializable {
     6    private String userName;
     7    private Dog dogName;
     8    
     9 public String getUserName() {
    10     return userName;
    11 }
    12 public void setUserName(String userName) {
    13     this.userName = userName;
    14 }
    15 public Dog getDogName() {
    16     return dogName;
    17 }
    18 public void setDogName(Dog dogName) {
    19     this.dogName = dogName;
    20 }
    21    
    22 }

     编写一个Servlet作为控制器,在控制器中创建Person实例。将请求转发到.jsp页面。

     1 package com.cy.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    10 import com.cy.bean.Dog;
    11 import com.cy.bean.Person;
    12 
    13 public class MyDog extends HttpServlet{
    14     private static final long serialVersionUID = 1L;
    15 
    16     @Override
    17     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    18             throws ServletException, IOException {
    19         
    20         resp.setCharacterEncoding("utf-8");
    21         resp.setContentType("text/html;charset=utf-8");
    22         
    23         Person p= new Person();
    24         p.setUserName("小明");
    25         Dog d=new Dog();
    26         d.setName("小狗狗");        
    27         p.setDogName(d);        
    28         req.setAttribute("person", p);
    29         
    30         req.getRequestDispatcher("/jsp/myDog.jsp").forward(req, resp);
    31         
    32         
    33     }
    34 
    35     @Override
    36     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    37             throws ServletException, IOException {
    38         doGet(req, resp);
    39     }
    40     
    41 
    42 }

     在web.xml中配置servlet

    1   <servlet>
    2     <servlet-name>mydog</servlet-name>
    3     <servlet-class>com.cy.servlet.MyDog</servlet-class> 
    4   </servlet> 
    5   <servlet-mapping>
    6    <servlet-name>mydog</servlet-name>
    7    <url-pattern>/mydog</url-pattern>  
    8   </servlet-mapping>

    作为视图的jsp页面;

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%
     3 String path = request.getContextPath();
     4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     5 %>
     6 
     7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     8 <html>
     9   <head>
    10     <base href="<%=basePath%>">
    11     
    12     <title>My JSP 'myDog.jsp' starting page</title>
    13     
    14     <meta http-equiv="pragma" content="no-cache">
    15     <meta http-equiv="cache-control" content="no-cache">
    16     <meta http-equiv="expires" content="0">    
    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    18     <meta http-equiv="description" content="This is my page">
    19     <!--
    20     <link rel="stylesheet" type="text/css" href="styles.css">
    21     -->
    22 
    23   </head>
    24   
    25   <body>
    26  <jsp:useBean id="person" type="com.cy.bean.Person" scope="request"></jsp:useBean> 
    27   主人:<jsp:getProperty property="userName" name="person"/><br/>
    28   宠物:<jsp:getProperty property="dogName" name="person"/><br/>
    29   </body>
    30 </html>

    得出来的结果却是:

    因为:person的属性dogName是个对象,而<jsp:getProperty>的Property属性只能访问Bean的属性,而不能访问嵌套的属性。

    解决方案就是JSP EL(即表达式语言 Expression Language)

    我们使用EL

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%
     3 String path = request.getContextPath();
     4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     5 %>
     6 
     7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     8 <html>
     9   <head>
    10     <base href="<%=basePath%>">
    11     
    12     <title>My JSP 'myDog.jsp' starting page</title>
    13     
    14     <meta http-equiv="pragma" content="no-cache">
    15     <meta http-equiv="cache-control" content="no-cache">
    16     <meta http-equiv="expires" content="0">    
    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    18     <meta http-equiv="description" content="This is my page">
    19     <!--
    20     <link rel="stylesheet" type="text/css" href="styles.css">
    21     -->
    22 
    23   </head>
    24   
    25   <body>
    26  
    27     主人:  ${person.userName}
    28      宠物:   ${person.dogName.name } 
    29   </body>
    30 </html>

    结果:

    1.1 EL表达式和JSP脚本表达式

    EL表达式形式:${ }

    ${person.userName}     ${userName}

    JSP表达式形式:<%= userName%>

    一个<div>元素的style属性的代码:

    JSP表达式设置: 1 <div style=<%=mystyle%>>hello</div> 

    EL表达式设置: 1 <div style=${mystyle} >hello</div> 

    EL表达式不能在脚本中定义变量

    JSP中定义一个变量,只需要用<%! int num=10%>

    num的值:<%=num%>   值为10;

    num的值:${num}     返回一个未定义的值;

    1.2在EL表达式中使用隐式变量

    类别

    隐式变量名

    描述

    JSP

    pageContext

    用来访问JSP的隐式对象

    作用域

    pageScope

    与page作用域属性的名称和值相关联的 Map 类

    requestScope

    与request作用域属性的名称和值相关联的 Map 类

    sessionScope

    与session作用域属性的名称和值相关联的 Map 类

    applicationScope

    与application作用域属性的名称和值相关联的 Map 类

    请求参数

    param

    包含请求参数字符串的Map 类

    paramValues

    包含请求参数字符串数组( String[])的 Map 类

    请求头

    header

    包含请求头字符串的 Map 类

    headerValues

    包含请求头字符串数组(String[])的 Map 类

    Cookie

    cookie

    按名称存储请求附带的 cookie 的 Map 类

     注意:pageScope,requestScope,sessionScope,applicationScope这些变量并没有直接赋予我们在EL中直接访问真正的page,ServletRequset,HttpSession以及ServeltContext的权利,他们返回的只是一个分别与page作用域,request作用域,session作用域,application作用域有关的属性名和值的Map对象。

    当容器解析EL表达式中的变量时,例如${x}中的x,容器首先检查隐式变量。如果隐式变量中找不到x,他将依次查找page,request,session,application范围的属性,如果还找不到x,则返回null。

    测试EL表达式中是个隐式变量

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="juxing" uri="http://function/getJuXing" %>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 
     8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9 <html>
    10   <head>
    11     <base href="<%=basePath%>">
    12     
    13     <title>隐式变量</title>
    14     <meta http-equiv="pragma" content="no-cache">
    15     <meta http-equiv="cache-control" content="no-cache">
    16     <meta http-equiv="expires" content="0">    
    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    18     <meta http-equiv="description" content="This is my page">
    19     <!--
    20     <link rel="stylesheet" type="text/css" href="styles.css">
    21     -->
    22   </head>
    23   
    24   <body>
    25   <br/>---------------- 1 pageContext对象   :获取JSP页面中的pageContext对象---------------------- <br/> 
    26     ${pageContext}<br/>
    27     
    28   <br/>---------------- 2  pageScope对象  :从page域(pageScope)中查找数据--------------------------<br/>
    29     <% pageContext.setAttribute("name","kitty");%>  <!-- map -->
    30     ${pageScope.name}<br/>
    31     
    32     <br/>---------------3 requestScope对象:从request域(requestScope)中获取数据------------------------<br/>
    33     <% request.setAttribute("name", "kitty1"); %> <!-- map -->
    34     ${requestScope.name}<br/>
    35     
    36     <br/>---------------4 sessionScope对象:从session域(sessionScope)中获取数据------------------------<br/>
    37     <%session.setAttribute("name", "kitty2"); %>  <!-- map -->
    38     ${sessionScope.name}<br/>
    39     
    40     <br/>---------------5 applicationScope对象:从application域(applicationScope)中获取数据------------------------<br/>
    41     <%application.setAttribute("name", "kitty3"); %><!-- map -->
    42     ${applicationScope.name}<br/>
    43     
    44      <br/>--------------6  param对象:获得用于保存请求参数map,并从map中获取数据------------------------<br/>
    45      <br/>--------------7  paramValues对象:paramValues获得请求参数 ------------------------<br/>    
    46     param或paramValues变量使我们可以获取ServletRequest中传递过来的参数值。<br/>
    47     param相当于是使用参数名,调用getParameter(String name)后 得到的结果。<br/>
    48     paramValues是使用getParameter(String[] name)方法所返回的指定参数名的数组值<br/>
    49     
    50      <br/>--------------8 header对象:header获得请求头------------------------<br/>
    51      ${header.Accept}<br/>
    52      
    53    <br/>--------------9 headerValues对象:headerValues获得请求头的值------------------------<br/>
    54       <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 
    55            例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值
    56            --%>
    57            
    58     ${headerValues.Accept[0]}<br/>
    59      <br/>--------------10、cookie对象:cookie对象获取客户机提交的cookie------------------------<br/>
    60         <!-- 从cookie隐式对象中根据名称获取到的是cookie对象,要想获取值,还需要.value -->
    61     ${cookie.JSESSIONID.value}  //保存所有cookie的map
    62   </body>
    63   </html>

    结果:

    1.3 EL运算符

    运算符可以分为四类:属性和集合访问运算符,算术运算符,关系运算符,逻辑运算符。

      1.3.1用于访问属性和集合的EL运算符

      属性访问运算符是我们可以访问对象的成员,集合访问运算符可以返回Map,List 或Array中的元素。

      1.3.2 EL算数,关系,逻辑运算符

      1.3.2.1 算术运算符就是加减乘除取模;

      1.3.2.2 关系运算符

      1.3.2.3 逻辑运算符

      1.3.2.4 其他

    empty运算符:检查对象是否为null(空)

    二元表达式:${user!=null?user.name :""}

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%
     3 String path = request.getContextPath();
     4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     5 %>
     6 
     7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     8 <html>
     9   <head>
    10     <base href="<%=basePath%>">
    11     
    12     <title>运算符</title>
    13     
    14     <meta http-equiv="pragma" content="no-cache">
    15     <meta http-equiv="cache-control" content="no-cache">
    16     <meta http-equiv="expires" content="0">    
    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    18     <meta http-equiv="description" content="This is my page">
    19     <!--
    20     <link rel="stylesheet" type="text/css" href="styles.css">
    21     -->
    22 
    23   </head>
    24   
    25   <body>
    26    <br/>--------------------用于访问属性和集合的EL运算符----------------<br/>
    27   <%
    28      Map<String,String> map = new LinkedHashMap<String,String>();
    29          map.put("a","aaaaxxx");
    30          map.put("b","bbbb");
    31          map.put("c","cccc");
    32          map.put("1","aaaa1111");
    33          request.setAttribute("map",map);
    34    %>
    35    ${map.a}<br/>
    36    ${map.b}<br/>
    37    ${map["1"]}<br/>
    38   
    39     <br/>--------------------算术运算符----------------<br/>
    40    5+5= ${5+5}<br/>
    41    5-5= ${5-5}<br/>
    42    5*5= ${5*5}<br/>
    43    5/5= ${5/5}<br/><%-- ${5div5} --%>
    44    5%3= ${5%3}<br/><%-- ${5mod3} --%>
    45    <br/>--------------------关系运算符----------------<br/>
    46    ${5==5} <br/>
    47    ${5!=6} <br/>
    48    ${5<=5} <br/><%-- ${5 le 6} --%>
    49    ${5< 6} <br/><%--  ${5 lt 6} --%>
    50    ${5>=5} <br/><%-- ${5 ge 6} --%>
    51    ${5> 4} <br/> <%-- ${5 gt 6} --%>   
    52    <br/>--------------------是否为空----------------<br/>
    53    <%
    54        List<String> list = new ArrayList<String>();
    55          list.add("1111");
    56          list.add("222");
    57          request.setAttribute("list",list);
    58     %>
    59     ${empty(list)}
    60    <br/>--------------------条件运算----------------<br/>
    61    ${3==5?3:5}
    62    
    63   </body>
    64 </html>

     结果显示:

    1.4 函数

    EL函数使用起来比较复杂,但是他为JSP提供了完全的业务逻辑和表现逻辑分离。

    使用EL函数的步骤
    –方法类(.java):包含需要在JSP中使用的Java方法;
    –标记库描述文件(*.tld):映射每个Java方法到XML函数名;
    –部署描述文件(web.xml):映射TLD到标记库URI

    JSP页面(*.jsp):使用标记库URI和函数名调用方法

    示例:打印个矩形方法。

    Rectangle

    1.4.1 创建静态方法

    Rectangle.java
     1 package com.cy.functionn;
     2 
     3 public class Rectangle{
     4     /*方法必须被声明为public和static,而方法所属的类必须声明为public。这样Servlet就可以直接访问该类及其方法,而不用创建一个新对象*/
     5     /*方法的参数和返回值必须在EL中是有效的。*/
     6     /*类文件一般保存在/WEB-INF/下*/
     7     public static String getRectangle(int clos,int rows){
     8         StringBuffer sb=new StringBuffer();
     9         for(int i=0;i<clos;i++){
    10             for(int j=0;j<rows;j++){
    11                 sb.append("*");
    12             }
    13             sb.append("<br/>");
    14         }
    15         return sb.toString();        
    16     }
    17 
    18 }

    1.4.2 创建标记库描述文件(TLD)

    function.tld 

    Rectangle
     1 <!--TLD的目标是讲静态方法映射到可以在JSP中使用的函数名,这是必须的,因为EL中不允许直接调用java方法 -->
     2 <taglib xmlns="http://java.sun.com.xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://java.sun.com.xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
     4     version="2.0">
     5 
     6     <tlib-version>1.0 </tlib-version>
     7     <function>
     8         <name>aaa</name><!-- 定义要在JSP中使用的函数名 -->
     9         <function-class>com.cy.functionn.Rectangle</function-class><!-- 定义方法所在的类的全名 -->
    10         <function-signature>java.lang.String getRectangle(int,int)</function-signature><!--定义静态方法及其参数和返回值的全数据类型  -->
    11     </function>
    12 
    13 </taglib>

    1.4.3 更改部署描述文件

    1

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     3   <display-name>EL</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12   
    13   <jsp-config>
    14     <taglib>
    15       <taglib-uri>http://function/getRectangle</taglib-uri><!-- 定义用于 Servlet, JSP要访问的路径-->
    16       <taglib-location>/WEB-INF/tld/function.tld</taglib-location><!-- 定义标记库描述文件的上下路径 -->
    17     </taglib>
    18   </jsp-config>
    19  
    20 </web-app>

    1.4.4 在JSP内访问EL函数

    1

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <!-- 使用taglib指令访问TLD,并用一个前缀代表该标记库。使用TLD前缀和函数名创建一个EL表达式。
     3  prefix:定义前缀
     4  uri:定义路径与taglib-uri相同
     5  -->
     6 <%@ taglib prefix="myFun" uri="http://function/getRectangle"%>
     7 <%
     8 String path = request.getContextPath();
     9 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    10 %>
    11 
    12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    13 <html>
    14   <head>
    15     <base href="<%=basePath%>">
    16     
    17     <title>My JSP 'MyJsp.jsp' starting page</title>
    18     
    19     <meta http-equiv="pragma" content="no-cache">
    20     <meta http-equiv="cache-control" content="no-cache">
    21     <meta http-equiv="expires" content="0">    
    22     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    23     <meta http-equiv="description" content="This is my page">
    24     <!--
    25     <link rel="stylesheet" type="text/css" href="styles.css">
    26     -->
    27 
    28   </head> 
    29   <body>
    30     <pre>${myFun:aaa(6,10)}</pre>
    31   </body>
    32 </html>

    二 JSP自定义标记库与标准标记库JSTL

     JSTL(JSP标准标准库,JavaServlet Page Standard Tag Liabary)

    jstl规范是SUN JCP指定的一个官方java规范请求(JSR).

                                     JSTL标准标记库

    功能范围

    作用

    URI

    前缀

    核心(core)

    一般用途处理的标记

    http://java.sun.com/jsp/jstl/core

    c

    xml

    解析、选择、转换XML数据的标记

    http://java.sun.com/jsp/jstl/xml

    x

    数据库(sql)

    访问关系型数据库的标记

    http://java.sun.com/jsp/jstl/sql

    sql

    国际化(I18N)

    为国际化应用格式化数据的标记

    http://java.sun.com/jsp/jstl/fmt

    fmt

    函数(Functions)

    处理字符串和集合的标记

    http://java.sun.com/jsp/jstl/functions

    fn

    我们最常用的是核心标记库。

    为了给JSP提供JSTL能力,我们需要两个JAR文件。第一个文件是jstl.jar,他为JSTL标记库提供API类。

    第二个文件是standard.jar,他提供了标记库的实现类。我们需要把这两个文件复制到我们自己的应用程序的WEB-INF下的lib目录。

    我们需要在JSP中通过taglib指令引用标记库。

    1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    2.1 通用标记

    <c:catch > ,<c:out>

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 
     8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9 <html>
    10   <head>
    11     <base href="<%=basePath%>">
    12     
    13     <title>My JSP 'jstl.jsp' starting page</title>
    14     
    15     <meta http-equiv="pragma" content="no-cache">
    16     <meta http-equiv="cache-control" content="no-cache">
    17     <meta http-equiv="expires" content="0">    
    18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    19     <meta http-equiv="description" content="This is my page">
    20     <!--
    21     <link rel="stylesheet" type="text/css" href="styles.css">
    22     -->
    23   </head> 
    24   <body>  
    25   <%--  标记<c:catch>允许我们在jsp中不需要错误页面捕获程序错误。标记<c:out>与JSP脚本表达式类似,用于显示内容  --%>
    26   <c:catch var="a">
    27              会抛异常的代码  ,异常的值会存储在页面范围变量a中。<br/>
    28   </c:catch> 
    29   <c:out value=""></c:out>
    30 如----------------------------:<br/>
    31     <c:catch var="e">
    32     ${"1aaa"+1}  <!-- 会抛异常的代码 -->
    33     </c:catch>
    34      <c:out value="e"></c:out><br/>
    35      <c:out value="${e}"></c:out> <br/> 
    36   </body>
    37 </html>

     显示:

    2.2 变量支持标记

    1<c:set>:用于设置变量和对象的值;

    2<c:remove>:用于讲一个变量从其作用域中删除;

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 
     8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9 <html>
    10   <head>
    11     <base href="<%=basePath%>">
    12     
    13     <title>My JSP 'jstl.jsp' starting page</title>
    14     
    15     <meta http-equiv="pragma" content="no-cache">
    16     <meta http-equiv="cache-control" content="no-cache">
    17     <meta http-equiv="expires" content="0">    
    18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    19     <meta http-equiv="description" content="This is my page">
    20     <!--
    21     <link rel="stylesheet" type="text/css" href="styles.css">
    22     -->
    23   </head> 
    24   <body>  
    25     <c:set var ="num"> ${8*7} </c:set>   
    26     <c:set var ="num" value="${8*7}"></c:set>
    27   <% Map<String,String> map = new LinkedHashMap<String,String>();
    28          map.put("a","aaaaxxx");
    29          map.put("b","bbbb");
    30          request.setAttribute("map",map);
    31           %> 
    32           <!-- 用于javabean和map对象 -->
    33     <c:set target="${map}" property="a"> 狗狗</c:set>   
    34     ${map.a} <br/>  
    35     <c:set target="${map}" property="b" value="小狗狗"></c:set>  
    36     ${map.b} <br/>    
    37     ${num}<br/>
    38     remove标记不用于javaBean和Map对象<br/> 
    39    <c:remove var="num" scope="page"/>  
    40     ${num}<br/> 
    41   </body>
    42 </html>

    2.3 流程控制

    2.3.1 JSTL条件处理

    2.3.2 循环

    1 <c:if> <c:choose>条件处理

    2 <c:forEach><c:forTokens> 循环

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
     3 <%
     4     String path = request.getContextPath();
     5     String basePath = request.getScheme() + "://"
     6             + request.getServerName() + ":" + request.getServerPort()
     7             + path + "/";
     8 %>
     9 
    10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    11 <html>
    12 <head>
    13 <base href="<%=basePath%>">
    14 
    15 <title>My JSP 'jstl.jsp' starting page</title>
    16 
    17 <meta http-equiv="pragma" content="no-cache">
    18 <meta http-equiv="cache-control" content="no-cache">
    19 <meta http-equiv="expires" content="0">
    20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    21 <meta http-equiv="description" content="This is my page">
    22 <!--
    23     <link rel="stylesheet" type="text/css" href="styles.css">
    24     -->
    25 </head>
    26 <body>
    27 
    28     test:设置布尔表达式,true,false.
    29     <br />
    30     <c:if test="${9==9}">
    31                你好!<br />
    32     </c:if>
    33     <c:choose>
    34         <c:when test="${5!=5}">
    35                         错误<br />
    36         </c:when>
    37 
    38         <c:when test="${5==5}">
    39               正确1<br />
    40         </c:when>
    41 
    42         <c:when test="${5!=5}">
    43                 正确2<br />
    44         </c:when>
    45 
    46     </c:choose>
    47 
    48     x:变量 begin:起始值 end:结束值 step:间隔值
    49     <c:forEach var="x" begin="0" end="10" step="3">
    50       ${x}
    51     </c:forEach>
    52     <br />
    53 
    54     <c:set var="str" value="hello,world,kitty"></c:set>
    55     items:要处理的用分隔符分隔的字符串对象; delims:指定分隔符
    56     <c:forTokens var="bl" items="${str}" delims=",">
    57      ${bl}
    58    </c:forTokens>
    59 
    60 </body>
    61 </html>

    2.4 用JSTL访问URL信息

    2.4.1 <c:url> 重写URL并对其参数编码

    2.4.2 <c:import> 访问Web应用程序之外的内容

    2.4.3 <c:redirect> 重定向到不同的URL

  • 相关阅读:
    十三 .Django(ORM表高级操作)
    十二 .Django ForeighKey自关联(ORM)
    十二 .Django 一对多表ForeighKey(ORM)
    十一 .Django 一对一表OneToOneField (ORM)
    十 .Django 单表操作(ORM)
    八 .Django 模型(models)
    【模板】Lucas定理
    【模板】AC自动机加强版
    【模板】AC自动机
    【POJ3162】Walking Race 树形dp+单调队列+双指针
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/4957754.html
Copyright © 2020-2023  润新知