标准标签库(JSTL)_李晖晖的个人总结(第十三次课)

准备实验环境

本章中所有的例子程序都在名为JSTL的WEB应用程序中运行,使用的Tomcat服务器版本为Tomcat5.5。为了简化代码和突出重点,本章中所有的JSP网页文件的例子程序都省略了</span><span style="font-family:'宋体';">、</span><span style="font-family:'Times New Roman';"><body></span><span style="font-family:'宋体';">等</span><span style="font-family:'Times New Roman';">HTML</span><span style="font-family:'宋体';">全局架构标签。</span>本章中用于描述标签的语法的各种符号的意义如下:</p> <p></p> <ul> <li> […]:表示方括号中的内容是可选的;</li> <li> {option1|option2|option3|…}:表示花括号中用“|”字符分隔的各个选项不能同时出现,只能出现其中的一项;</li> <li> 如果属性的值字体加粗,表示这个值是对应属性的默认值;</li> </ul> <p></p> <p>如果属性的值用斜体字表示,表示该属性可以是表达式;如果标签体的内容用斜体字表示,表示标签体的内容可以是<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">代码。</span></p> <p>为了本章后面讲解的方便,这里先创建一个名为UserBean的JavaBean程序,如例程8-1所示。</p> <p>例程 8-1  UserBean.java </p> <p></p> <p></p> <pre><code class="language-java">  package org.it315;   public class UserBean   {    private String userName;    private String password;    private String address;    private int visitCount;    public void setUserName(String userName)    {    this.userName = userName;    }    public String getUserName()    {    return userName;    }    public void setPassword(String password)    {    this.password = password;    }    public String getPassword()    {    return password;    }    public void setAddress(String address)    {    this.address = address;    }    public String getAddress()    {    return address;    }    public void setVisitCount(int visitCount)    {    this.visitCount = visitCount;    }    public int getVisitCount()    {    return visitCount;    }   }</code></pre> <br> <br> <p></p> <p>编译这个源程序,将编译后的UserBean.class文件放在<TOMCAT_HOME>\webapps\JSTL\WEB-INF\classes\org\it315目录中。</p> <p></p> <h3 style="text-align:center;">JSTL<span style="font-family:'宋体';">概述</span></h3> <h4>JSTL<span style="font-family:'宋体';">简介</span></h4> <p></p> <p>从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此自定义标签在WEB应用中被广泛使用。许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所适从,不知道选择哪一家的好。为了解决这个问题,Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题,开发了一套用于解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能。</p> <p>由于JSTL是在JSP 1.2规范中定义的,所以JSTL需要运行在支持JSP 1.2及其更高版本的WEB容器上,例如,Tomcat 5.5。</p> <h5>JSTL的逻辑组成</h5> <p>笔者在写本章内容时的JSTL规范的最新版本是JSTL 1.1,它是JSP 2.0最新规范中的一个重要组成部分。JSTL 1.1中包含四个标签库和一组EL函数。为方便用户使用,JSP规范中描述了JSTL的各个标签库的URI地址和建议使用的前缀名,如表8.1所示。本章中在使用JSTL标签时,使用的都是这些建议的前缀。</p> <p></p> <p>表8.1  JSTL</p> <table> <tbody> <tr> <td> <p>标签库功能描述</p> </td> <td> <p>标签库的URI</p> </td> <td> <p>建议前缀</p> </td> </tr> <tr> <td> <p>核心标签库</p> </td> <td> <p>http://java.sun.com/jsp/jstl/core</p> </td> <td> <p>c</p> </td> </tr> <tr> <td> <p>XML标签库</p> </td> <td> <p>http://java.sun.com/jsp/jstl/xml</p> </td> <td> <p>x</p> </td> </tr> <tr> <td> <p>国际化/格式化标签库</p> </td> <td> <p>http://java.sun.com/jsp/jstl/fmt</p> </td> <td> <p>fmt</p> </td> </tr> <tr> <td> <p>数据库标签库</p> </td> <td> <p>http://java.sun.com/jsp/jstl/sql</p> </td> <td> <p>sql</p> </td> </tr> <tr> <td> <p>EL自定义函数</p> </td> <td> <p>http://java.sun.com/jsp/jstl/functions</p> </td> <td> <p>fn</p> </td> </tr> </tbody> </table> <p></p> <p>下面对JSTL的各个标签库进行简单的介绍:</p> <p>(<span style="font-family:'Times New Roman';">1</span><span style="font-family:'宋体';">)</span>核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。</p> <p>(<span style="font-family:'Times New Roman';">2</span><span style="font-family:'宋体';">)</span>国际化<span style="font-family:'Times New Roman';">/</span><span style="font-family:'宋体';">格式化标签库</span>中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。</p> <p>(<span style="font-family:'Times New Roman';">3</span><span style="font-family:'宋体';">)</span>数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面仅用作表现层,我们一般不在</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">中提供的这套</span>数据库标签库没有多大的实用价值。</p> <p>(<span style="font-family:'Times New Roman';">4</span><span style="font-family:'宋体';">)</span><span style="font-family:'Times New Roman';">XML</span>标签库中包含对<span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">文档中的数据进行操作</span>的标签。例如,解析<span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">文档、输出</span><span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">文档中的内容,以及迭代处理</span><span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">文档中的元素。</span>因为XML广泛应用于WEB开发,对XML文档的处理非常重要,<span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">标签库使处理</span><span style="font-family:'Times New Roman';">XML</span><span style="font-family:'宋体';">文档变得简单方便,这也</span>是JSTL的一个重要特征。<span style="font-family:'Times New Roman';">  </span></p> <p>(<span style="font-family:'Times New Roman';">5</span><span style="font-family:'宋体';">)</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">中提供的一套</span><span style="font-family:'Times New Roman';">EL</span><span style="font-family:'宋体';">自定义函数包含了</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。</span></p> <h5>JSTL的物理组成</h5> <p>完整的JSTL应包含SUN<span style="font-family:'宋体';">公司提供</span>的jstl.jar 包和<span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">容器产商提供的</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">实现包</span>,以Apache Jakarta 小组提供的JSTL<span style="font-family:'宋体';">实现包为例</span>,完整的<span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">包含</span>jstl.jar、standard.jar 和 xalan.jar 三个 jar 包。sun <span style="font-family:'宋体';">公司提</span>供的jstl.jar 包封装了 <span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">所要求的一些</span><span style="font-family:'Times New Roman';">API </span><span style="font-family:'宋体';">接口和类,</span>Apache Jakarta 小组编写的 JSTL API 实现类封装在standard.jar包中。由于 <span style="font-family:'Times New Roman';">JDK </span><span style="font-family:'宋体';">在 </span><span style="font-family:'Times New Roman';">JDK 1.5 </span><span style="font-family:'宋体';">版本中才引入了 </span><span style="font-family:'Times New Roman';">XPath API</span><span style="font-family:'宋体';">,而 </span><span style="font-family:'Times New Roman';">apache</span> Jakarta 小组开发的 <span style="font-family:'Times New Roman';">JSTL API </span><span style="font-family:'宋体';">是在 </span><span style="font-family:'Times New Roman';">JDK1.5 </span><span style="font-family:'宋体';">之前推出的,所以 </span><span style="font-family:'Times New Roman';">apache</span> Jakarta 小组在 <span style="font-family:'Times New Roman';">JSTL </span><span style="font-family:'宋体';">中使用的是他们自己开发的 </span><span style="font-family:'Times New Roman';">XPath API</span><span style="font-family:'宋体';">,这些 </span><span style="font-family:'Times New Roman';">API </span><span style="font-family:'宋体';">封装</span>在 xalan.jar 包中。Standard.jar 包中包括核心标签库、国际化<span style="font-family:'Times New Roman';">/</span><span style="font-family:'宋体';">格式化标签</span>库、数据库标签库中的标签和标准的<span style="font-family:'Times New Roman';">EL</span><span style="font-family:'宋体';">自定义函数的实现</span>类,xalan.jar 包中包括 <span style="font-family:'Times New Roman';">JSTL </span><span style="font-family:'宋体';">解析 </span><span style="font-family:'Times New Roman';">XPath </span><span style="font-family:'宋体';">的相关 </span><span style="font-family:'Times New Roman';">API </span><span style="font-family:'宋体';">类。</span></p> <p><span style="font-family:'宋体';"></span></p> <h3 style="text-align:center;">安装和测试<span style="font-family:'Times New Roman';">JSTL</span></h3> <br> <p></p> <h4>1.下载JSTL包</h4> <p>可以从Apache的网站下载JSTL的jar包。进入<span style="color:rgb(0,0,0);">http://jakarta.apache.org/</span><span style="color:rgb(0,0,0);">taglibs</span><span style="color:rgb(0,0,0);">/</span> 页面,根据相关的提示信息下载 zip压缩文件,这个压缩文件中包含JSTL的三个jar包。</p> <p>提示:由于网站的不断升级,下载JSTL 的jar包的网址可能改变。读者在下载这些文件时,如果在指定的网址没有下载的链接,可以进入Apache的网站首页,然后根据相关的提示下载所需的文件。例如,笔者在编写JSTL初稿时,从<span style="color:rgb(0,0,0);">http://jakarta.apache.org/</span><span style="color:rgb(0,0,0);">taglibs</span><span style="color:rgb(0,0,0);">/</span> 下载的压缩文件中只包含jstl.jar和standard.jar两个 jar 包,而 xalan.jar包要从 <span style="color:rgb(0,0,0);">http://xml.apache.org/xalan-j/downloads.html</span> 下载。</p> <h4>2.安装JSTL</h4> <p>在Tomcat中安装JSTL很简单,只要将 JSTL的jar包复制到<WEB应用程序>\WEB-INF\lib目录下即可。本章中所有的例子程序都在一个名为JSTL的WEB应用程序中运行,所以,将JSTL的三个jar包复制到 <TOMCAT_HOME>\webapps\JSTL\WEB-INF\lib目录下即完成了JSTL的安装。</p> <p>提示:Tomcat 5.5自带的JSP例子应用程序中提供了使用JSTL标签的例子,在<TOMCAT_HOME>\webapps\jsp-examples\WEB-INF\lib目录中有JSTL的jstl.jar包和standard.jar包,所以,对于读者来说,如果不使用JSTL的XML标签库中的标签,可以直接将这两个包复制到<WEB应用程序的主目录>\WEB-INF\lib目录中,而不用事先从Apache的网站下载JSTL的jar包。</p> <h4>3.测试JSTL</h4> <p>安装完<span style="font-family:'Times New Roman';">JSTL</span>后,接下来就可以准备测试<span style="color:rgb(0,0,0);">JSTL</span>安装得是否成功了。</p> <p>Apache<span style="font-family:'宋体';">小组在提供</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">时,同时也提供了</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">标签的标签描述文件(即</span><span style="font-family:'Times New Roman';">TLD</span><span style="font-family:'宋体';">文件),它们都封装</span>在standard.jar包中,位于该<span style="font-family:'Times New Roman';">jar</span><span style="font-family:'宋体';">文件的</span><span style="font-family:'Times New Roman';">META-INF</span><span style="font-family:'宋体';">目录中。用</span><span style="font-family:'Times New Roman';">WinRAR </span><span style="font-family:'宋体';">打</span>开standard.jar包,进入<span style="font-family:'Times New Roman';">META-INF</span><span style="font-family:'宋体';">目录,可以看到</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">标签的标签库描述文件。查看这些</span><span style="font-family:'Times New Roman';">TLD</span><span style="font-family:'宋体';">源文件,可以看到文件中定义的 </span><uri> 元素的内容与表8.1中列出的标签库的URI相同。因为standard.jar 包中封装了<span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">标签的标签库描述文件,</span>Tomcat在启动时会自动加载standard.jar包中的META-INF目录下的所有TLD文件,所以使用JSTL时不必在web.xml文件中配置JSTL标签库的URI信息,就可以在JSP文件中直接使用JSTL标签。</p> <p>要在<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件中使用</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">,首先就需要</span>使用taglib指令导入所需要使用的JSTL标签库,taglib指令的uri属性必须为相应标签库的<span style="font-family:'Times New Roman';">TLD</span><span style="font-family:'宋体';">文件中的</span><uri>元素的值,taglib指令的prefix属性可以自己随意指定,但最好是采用表8.1中的建议前缀。在JSTL应用程序的主目录中按例程8-2编写一个包含JSTL标签的简单JSP文件test.jsp。</p> <p>例程8-2 test.jsp</p> <p></p> <p></p> <pre><code class="language-java"><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:out value="hello world!" /></code></pre> <br> <p></p> <p></p> <p>上面的test.jsp页面中的<c:out>标签用于向浏览器输出文本内容,它属于JSTL的核心标签库中的标签。由于在test.jsp文件中只使用了JSTL的核心标签库中的标签,所以,只需要使用一条taglib指令导入JSTL的核心标签库,而不必使用多条taglib指令导入JSTL的所有标签库。</p> <p>启动<span style="color:rgb(0,0,0);">Tomcat</span>后,在浏览器地址栏中输入<span style="font-family:'Times New Roman';">test.jsp</span><span style="font-family:'宋体';">页面的地址进行访问,</span>如果浏览器中显示出了“<span style="font-family:'Times New Roman';">hello world!</span><span style="font-family:'宋体';">”,说明</span><span style="font-family:'Times New Roman';">JSTL</span><span style="font-family:'宋体';">安装成功</span>。</p> <p></p> <h3 style="text-align:center;">核心标签库</h3> <br> <p></p> <p>JSTL<span style="font-family:'宋体';">核心标签库</span>包含了一组用于实现<span style="font-family:'Times New Roman';">WEB</span>应用中的通用操作的标签,<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">规范为核心标签库建议的前缀名为</span><span style="font-family:'Times New Roman';">c</span>。</p> <p></p> <h4><c:out><span style="font-family:'宋体';">标签</span></h4> <br> <p></p> <p><c:out> <span style="font-family:'宋体';">标签用于输出一段文本内容到</span><span style="font-family:'Times New Roman';">pageContext</span><span style="font-family:'宋体';">对象当前保存的“</span><span style="font-family:'Times New Roman';">out</span><span style="font-family:'宋体';">”对象中,在通常情况下,</span><span style="font-family:'Times New Roman';">pageContext</span><span style="font-family:'宋体';">对象当前保存的“</span><span style="font-family:'Times New Roman';">out</span><span style="font-family:'宋体';">”对象的数据是输出到客户端浏览器,所以,</span><span style="font-family:'Times New Roman';"><c:out> </span><span style="font-family:'宋体';">标签通常用于输出一段文本内容到客户端浏览器。如果</span><span style="font-family:'Times New Roman';"><c:out> </span><span style="font-family:'宋体';">标签输出的文本内容中包含了需要进行转义的</span><span style="font-family:'Times New Roman';">HTML</span><span style="font-family:'宋体';">特殊字符,例如,</span><span style="font-family:'Times New Roman';"><</span><span style="font-family:'宋体';">、</span><span style="font-family:'Times New Roman';">></span><span style="font-family:'宋体';">、</span>'、"、&等,<span style="font-family:'Times New Roman';"><c:out> </span><span style="font-family:'宋体';">标签默认对它们按表</span><span style="font-family:'Times New Roman';">8.2</span><span style="font-family:'宋体';">进行</span><span style="font-family:'Times New Roman';">HTML</span><span style="font-family:'宋体';">编码转换后再进行输出,这样就可以在浏览器中显示出这些字符。</span></p> <p style="text-align:center;">表<span style="font-family:'Times New Roman';">8.2 </span><span style="font-family:'宋体';">特殊字符转换</span></p> <p style="text-align:center;"><span style="font-family:'宋体';"><br></span></p> <p></p> <p><c:out>标签标签有两种语法格式:</p> <p><strong>语法<span style="font-family:'Times New Roman';">1</span><span style="font-family:'宋体';">,没有标签体的情况:</span></strong></p> <p><c:out value="value" </p> <p>[escapeXml="{true|false}"]</p> <p>  [default="defaultValue"] /></p> <p><strong>语法<span style="font-family:'Times New Roman';">2</span><span style="font-family:'宋体';">,有标签体的情况,在标签体中指定输出的默认值:</span></strong></p> <p><c:out value="value" </p> <p>  [escapeXml="{true|false}"] ></p> <p>default value</p> <p></c:out></p> <p><c:out>标签的属性说明如表<span style="font-family:'Times New Roman';">8.3</span><span style="font-family:'宋体';">所示。</span></p> <p>表8.3  <c:out>标签的属性</p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>value</p> </td> <td> <p>true</p> </td> <td> <p>Object</p> </td> <td> <p>指定要输出的内容</p> </td> </tr> <tr> <td> <p>escapeXml</p> </td> <td> <p>true</p> </td> <td> <p>Boolean</p> </td> <td> <p>指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true</p> </td> </tr> <tr> <td> <p>default</p> </td> <td> <p>true</p> </td> <td> <p>Object</p> </td> <td> <p>指定如果value属性的值为null时所输出的默认值</p> </td> </tr> </tbody> </table> <p></p> <p>当且仅当value属性的值为null时,<c:out> 标签输出默认值;如果没有指定默认值,默认为空字符串。<c:out> 标签的标签体的内容用于指定输出的默认值,如果value属性的值不为null,即使标签体部分不为空,标签体的内容也不会被输出。如果value属性不是指向一个java.io.Reader对象,<c:out> 标签将调用这个对象的toString方法,然后输出获得的字符串内容。如果value属性指向一个java.io.Reader对象,<c:out> 标签将从这个Reader对象中读取数据后进行输出,当有大量数据要被输出时,将这些数据以Reader对象的形式提供给<c:out>标签进行输出,将会极大提高系统性能。当采用escapeXml属性的默认设置值true时,<c:out>标签将对要输出的特殊字符按表8.2进行转换;如果将escapeXml属性设置为false,<c:out>标签将不对要输出的特殊字符进行转换,而是直接输出这些特殊字符。</p> <p>例程8-3是<c:out> 标签的一个演示例子程序。</p> <p>例程8-3  c_out1.jsp </p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <% session.setAttribute("test_session", "testValue_session"); %> 直接输出一个字符串: <c:out value="test" default="123456" /><br /><hr /> 输出Web域中不存在的属性的值:<br /> <c:out value="${test_request}" default="这个属性不存在"/><br /><hr /> 输出Web域中的test_session属性的值:<br /> <c:out value="${test_session}" /></code></pre> <br> <p></p> <p>例程8-3的运行结果如图8.1所示。</p> <p></p> <p>图8.1</p> <p><br></p> <p>例程8-4和例程8-5是两个用于演示<c:out>标签的escapeXml属性的例子程序,例程8-4没有设置escapeXml属性,例程8-5将escapeXml属性设置为了false。</p> <p>例程8-4  c_out2.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:out value="${null}" > <meta http-equiv="refresh" content="0;url=http://www.it315.org" /> </c:out></code></pre> <p>例程8-5  c_out3.jsp<br></p> <p></p> <pre><code class="language-html">  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <c:out value="${null}" escapeXml="false">    <meta http-equiv="refresh" content="0;url=http://www.it315.org" />   </c:out></code></pre> <p>例程8-4和例程8-5的运行结果分别如图8.2和图8.3所示。</p> <p><br><br></p> <p><br></p> <p></p> <p>图8.3 </p> <p></p> <h4><c:set><span style="font-family:'宋体';">标签</span></h4> <p></p> <p><c:set>标签用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。<c:set>标签有四种语法格式:</p> <p><strong>语法1,使用value属性设置指定域中的某个属性的值:</strong></p> <p><c:set value="value"</p> <p>var="varName"</p> <p>[scope="{page|request|session|application}"] /></p> <p><strong>语法2,在标签体中设置指定域中的某个属性的值:</strong></p> <p><c:set var="varName"</p> <p>[scope="{page|request|session|application}"]></p> <p>body content</p> <p></c:set></p> <p><strong>语法3,使用value属性设置Web域中的一个属性对象的某个属性:</strong></p> <p><c:set value="value" </p> <p>target="target" </p> <p>property="propertyName" /></p> <p><strong>语法4,在标签体中设置Web域中的一个属性对象的某个属性性:</strong></p> <p><c:set target="target" </p> <p>property="propertyName"></p> <p>body content</p> <p></c:set></p> <p><c:set>标签的属性说明如表8.4所示。</p> <p>表8.4 <c:set>标签的属性</p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>value</p> </td> <td> <p>true</p> </td> <td> <p>Object</p> </td> <td> <p>用于指定属性值</p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>用于指定要设置的Web域属性的名称</p> </td> </tr> <tr> <td> <p>scope</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>用于指定属性所在的Web域</p> </td> </tr> <tr> <td> <p>target</p> </td> <td> <p>true</p> </td> <td> <p>Object</p> </td> <td> <p>用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象</p> </td> </tr> <tr> <td> <p>property</p> </td> <td> <p>true</p> </td> <td> <p>string</p> </td> <td> <p>用于指定当前要为对象设置的属性名称</p> </td> </tr> </tbody> </table> <p></p> <p>如果使用第1种语法格式时的value属性值为null,或者使用第2种语法格式时的标签体内容为空,<c:set>标签将从scope属性指定的域范围中删除var属性指定的属性。</p> <p>在第3种语法格式和第4语法格式中,如果target属性的值是java.util.Map对象,property属性表示该Map对象的关键字,如果Map对象没有指定的关键字,就给Map对象增加指定的关键字;如果target属性的值是JavaBean对象,property属性表示JavaBean对象的属性,如果value的类型与JavaBean属性的类型不匹配时,会根据EL的转换规则自动进行转换。当使用第3种语法格式或第4种语法格式时,如果target属性的值为null(即target属性指定的对象不存在),或者target属性的值是一个JavaBean对象,但该JavaBean中不存在property属性指定的属性,<c:set>标签将抛出异常。如果使用第3种语法格式时value属性的值为null,或者使用第4种语法格式时标签体的内容为空,如果target属性的值是一个java.util.Map对象,就从Map对象中删除property属性指定的关键字对应的项;如果target属性的值是一个JavaBean对象,就将JavaBean的相应属性的值设置为null。</p> <p>例程8-6是使用<c:set>标签设置某个Web域中的属性的一个演示例子程序。</p> <p>例程8-6 c_set1.jsp</p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:set var="userName" scope="session"> zxx </c:set> 输出session 作用域中的userNamer属性的值: <c:out value="${userName}" /><br /><hr /> 输出session 作用域中的bookname属性的值: <c:set var="bookname" scope="session" /> <c:out value="${bookname}" /></code></pre> <p>例程8-6的运行结果如图8.4所示。</p> <p><br></p> <p></p> <p>图8.4</p> <p>例程8-7是使用<c:set>标签设置UserBean对象和Map对象的属性的一个演示例子程序。</p> <p>例程8-7  c_set2.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.HashMap" %> <jsp:useBean id="user" class="org.it315.UserBean" /> <% HashMap preferences = new HashMap(); session.setAttribute("preferences",preferences); %> 设置和输出UserBean对象的userName属性值: <c:set value="zxx" target="${user}" property="userName" /> <c:out value="${user.userName}" /><br /><hr /> 设置和输出UserBean对象的password属性值: <c:set target="${user}" property="password" /> <c:out value="${user.password}" /><br /><hr /> 设置和输出Map对象的color关键字的值: <c:set target="${preferences}" property="color" value="${param.color}" /> <c:out value="${preferences.color}" /></code></pre> <p></p> <p>在浏览器地址栏输入如下地址访问例程8-7:</p> <p>http://localhost:8080/JSTL/c_set2.jsp?color=green</p> <p>例程8-7的运行结果如图8.5所示。</p> <p><br></p> <p></p> <h4><c:remove><span style="font-family:'宋体';">标签</span></h4> <p></p> <p><c:remove>标签用于删除各种Web域中的属性,<strong>其语法格式如下:</strong></p> <p><c:remove var="varName"  </p> <p>[scope="{page|request|session|application}"] /></p> <p>var属性用于指定要删除的属性的名称,scope属性用于指定要删除的属性所属的Web域,它们的值都不能接受动态值。如果没有指定scope属性,<c:remove>标签就调用PageContext.removeAttribute(varName)方法,否则就调用PageContext.removeAttribute(varName, scope) 方法。<c:remove>与<c:set>标签第一种语法格式的value属性值为null时的作用相同。</p> <p>例程8-8是使用<c:remove>标签的一个演示例子程序。</p> <p>例程8-8 c_remove.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:set value="org.it315" var="company" scope="request" /> <c:set var="passWord" scope="session"> a123456a </c:set> 在没有使用 <c:remove> 标签之前,变量的值为:<br /> company:<c:out value="${company}" /><br /> passWord:<c:out value="${passWord}" /><br /> <c:remove var="company" scope="request" /> <!--c:set var="company" scope="request" 此行与黑体字的一行作用是一样的/--> <c:remove var="passWord" scope="session" /><hr /> 在使用 <c:remove> 标签之后,变量的值为:<br /> company:<c:out value="${company}" /><br /> passWord:<c:out value="${passWord}" /></code></pre> <p></p> <p>例程8-8的运行结果如图8.6所示。</p> <p></p> <p></p> <h4><c:catch><span style="font-family:'宋体';">标签</span></h4> <br> <p></p> <p><c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:</p> <p><c:catch [var="varName"]></p> <p>nested actions</p> <p></c:catch></p> <p>var属性用于标识<c:catch>标签捕获的异常对象,其值是一个静态的字符串,不支持动态属性值。<c:catch>标签将捕获的异常对象以var指定的名称保存到page这个Web域中,如果没有指定var属性,则<c:catch>标签仅捕获异常,不在page域保存异常对象。如果<c:catch>标签体中的内容没有抛出异常,<c:catch>标签将从page域中删除var属性指定的属性。</p> <p><c:catch>标签可以捕获任何标签抛出的异常,并且可以同时处理多个标签抛出的异常,这样,可以对JSP页面的异常进行统一处理,显示给用户一个更友好的页面。JSP处理异常的通用机制是出现重要异常后跳转到错误处理页面,建议尽量不要用<c:catch>标签来代替JSP的错误处理机制,只对一些次要异常才使用<c:catch>标签进行捕获处理。</p> <p>例程8-9是使用<c:catch>标签进行异常捕获处理的一个演示例子程序。</p> <p>例程8-9  c_catch.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:catch var="myex"> <% int i = 0; int j = 10; out.println(j + "/" + i + "=" + j/i); %> </c:catch> 异常:<c:out value="${myex}" /><br /> 异常 myex.getMessage:<c:out value="${myex.message}" /><br /> 异常 myex.getCause:<c:out value="${myex.cause}" /><br /> 异常 myex.getStackTrace:<c:out value="${myex.stackTrace}" /></code></pre> <p></p> <p>在例程8-9<span style="font-family:'宋体';">中</span>,<c:catch>标签内嵌套的脚本元素抛出了异常,<c:catch var="myex">将捕获到这个异常,调用<c:out value="${myex.message}" />,相当于调用<%=myex.getMessage()%>。例程8-9的运行结果如图8.7所示。</p> <p></p> <p></p> <h4><c:if><span style="font-family:'宋体';">标签</span></h4> <p></p> <p>JSP页面的显示逻辑中也经常需要进行条件判断,<c:if>标签可以构造简单的“if-then”结构的条件表达式,如果条件表达式的结果为真就执行标签体部分的内容。<c:if>标签有两种语法格式:</p> <p><strong>语法1,没有标签体的情况:</strong></p> <p><c:if test="testCondition" var="varName"</p> <p>[scope="{page|request|session|application}"] /></p> <p><strong>语法2,有标签体的情况,在标签体中指定要执行的内容:</strong></p> <p><c:if test="testCondition" [var="varName"] </p> <p>[scope="{page|request|session|application}"]></p> <p>body content</p> <p></c:if></p> <p><c:if>标签的属性说明如表8.5所示。</p> <p>表8.5   <c:if><span style="font-family:'宋体';">标签的属性</span></p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>test</p> </td> <td> <p>true</p> </td> <td> <p>boolean</p> </td> <td> <p>决定是否处理标签体中的内容的条件表达式 </p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称</p> </td> </tr> <tr> <td> <p>scope</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将test属性的执行结果保存到哪个Web域中</p> </td> </tr> </tbody> </table> <p></p> <p>对于语法2,如果指定了<c:if>标签的scope属性,则必须指定var属性。</p> <p>例程8-10是使用<c:if>标签的一个演示例子程序。</p> <p>例程8-10  c_if.jsp </p> <p></p> <p></p> <pre><code class="language-html"></code></pre> <p><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %></code></p> <p><code class="language-html"><%@ page contentType="text/html;charset=gb2312" %></code></p> <p><code class="language-html"><jsp:useBean id="user" class="org.it315.UserBean" /></code></p> <p><code class="language-html"><c:set value="${param.count}" target="${user}" property="visitCount" /></code></p> <p><code class="language-html"><c:if test="${user.visitCount == 1}"></code></p> <p><code class="language-html">这是您第一次访问本网站,欢迎您!</code></p> <p><code class="language-html"></c:if></code></p> <code class="language-html"> <p>在浏览器地址栏输入如下地址访问例程8-10:</p> <p>http://localhost:8080/JSTL/c_if.jsp?count=1 </p> <p>例程8-10的运行结果如图8.8所示。</p> <p><br></p> <p></p> <p></p> <h4><c:choose><span style="font-family:'宋体';">标签</span></h4> <br><p></p> <p><c:choose><span style="font-family:'宋体';">标签用于指定多个条件选择的组合边界,它必须与</span><c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “<span style="font-family:'Times New Roman';">if-else if-else</span><span style="font-family:'宋体';">” 的复杂条件判断结构。</span></p> <p><c:choose>标签没有属性,在它的标签体内只能嵌套一个或多个<c:when>标签和0个或一个<c:otherwise>标签,并且同一个<c:choose>标签中的所有<c:when>子标签必须出现在<c:otherwise>子标签之前。如果<c:choose>标签内嵌套一个<c:when>标签和<c:otherwise>标签,就相当于“if-else”的条件判断结构;如果<c:choose>标签内嵌套多个<c:when>标签和一个<c:otherwise>标签,就相当于“if-else if-else”标签。</p> <p><c:when>标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为true,就执行这个<c:when>标签体的内容。<c:when>标签体的内容可以是任意的JSP代码。<c:otherwise>标签没有属性,它必须作为<c:choose>标签的最后分支出现。</p> <p>当JSP页面中使用<c:choose>标签时,嵌套在<c:choose>标签内的test条件成立的第一个<c:when>标签的标签体内容将被执行和输出。当且仅当所有的<c:when>标签的test条件都不成立时,才执行和输出<c:otherwise>标签的标签体内容。如果所有的<c:when>标签的test条件都不成立,并且<c:choose>标签内没有嵌套<c:otherwise>标签,则不执行任何操作。</p> <p>例程8-11是使用<c:choose>、<c:when>、<c:otherwise>标签的一个演示例子程序。</p> <p>例程8-11 c_choose.jsp </p> <p></p> <p></p></code> <pre class="html"><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:set value="${param.count}" var="count" /> <c:choose> <c:when test="${count == 0}"> 对不起,没有符合您要求的记录。 </c:when> <c:otherwise> 符合您要求的记录共有${count}条. </c:otherwise> </c:choose></code></pre> <p></p> <p>在浏览器地址栏输入如下地址访问例程8-11:</p> <p>http://localhost:8080/JSTL/c_choose.jsp?count=0 </p> <p>例程8-11的运行结果如图8.9所示。如果将参数count的值修改为10,则运行结果如图8.10所示。</p> <p></p> <p></p> <p></p> <p><br></p> <p></p> <p><br></p> <p>例程8-12是一个综合使用<c:if>标签和<c:choose>等标签的例子程序,在这个例子程序中,首先使用<c:if>标签判断表单提交的方式是否是POST,如果是,就再使用<c:choose>等标签根据表单提交的内容进行不同的处理。</p> <p>例程8-12  c_customLogic.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="${pageContext.request.method=='POST'}"> <c:choose> <c:when test="${param.favor == 'computer'}"> Your favourite course is <b>computer</b>. </c:when> <c:otherwise> Your favourite course is <i>other</i>. </c:otherwise> </c:choose> </c:if> <form method="POST">What is your favourite course?<br/> <input type="text" name="favor" /> <input type="submit" value="submit" /> </form></code></pre> <p></p> <p>在浏览器地址栏中直接访问c_customLogic.jsp的运行结果如图8.11所示,在文本框中输入“computer”,单击其中的submit按钮后的运行结果如图8.12所示。</p> <p></p> <p></p> <p></p> <p></p> <p></p> <h4><c:forEach><span style="font-family:'宋体';">标签</span></h4> <br> <p></p> <p>JSP页面的显示逻辑中也经常需要对集合对象进行循环迭代操作,<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。<c:forEach>标签有两种语法格式:</p> <p><strong>语法1,在集合对象中迭代:</strong></p> <p><c:forEach [var="varName"] </p> <p>items="collection"</p> <p>[varStatus="varStatusName"]</p> <p>[begin="begin"] [end="end"] [step="step"]></p> <p>body content</p> <p></c:forEach></p> <p><strong>语法2,迭代固定的次数:</strong></p> <p><c:forEach [var="varName"]</p> <p>[varStatus="varStatusName"]</p> <p>begin="begin" end="end" [step="step"]></p> <p>body content</p> <p></c:forEach></p> <p><c:forEach>标签的属性说明如表8.6所示。</p> <p>表8.6  <c:forEach><span style="font-family:'宋体';">标签的属性</span></p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将当前迭代到的元素保存到page这个Web域中的属性名称</p> </td> </tr> <tr> <td> <p>items</p> </td> <td> <p>true</p> </td> <td> <p>任何支持的类型</p> </td> <td> <p>将要迭代的集合对象</p> </td> </tr> <tr> <td> <p>varStatus</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称</p> </td> </tr> <tr> <td> <p>begin</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代</p> </td> </tr> <tr> <td> <p>end</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>参看begin属性的描述</p> </td> </tr> <tr> <td> <p>step</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>指定迭代的步长,即迭代因子的迭代增量</p> </td> </tr> </tbody> </table> <p></p> <p>在使用<c:forEach>标签时,需要注意如下几点说明:</p> <p></p> <ul> <li>如果指定begin属性,其值必须大于或等于零;</li> <li>如果指定步长(step属性),其值必须大于或等于1;</li> <li>如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作;</li> <li>如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作;</li> <li>如果指定的end属性的值小于begin属性的值,不执行迭代操作;</li> </ul> <p></p> <p></p> <p><c:forEach>标签的items属性的值支持下面的数据类型:</p> <p></p> <ul> <li>任意类型的数组</li> <li>java.util.Collection</li> <li>java.util.Iterator</li> <li>java.util.Enumeration</li> <li>java.util.Map</li> <li>String</li> </ul> <p></p> <p>items属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8.5 节的数据库标签中进行介绍。对字符串的迭代操作通常使用<c:forTokens>标签或JSTL函数,例如fn:split和fn:jion,JSTL函数将在8.7节进行介绍。</p> <p></p> <h5>1.迭代Collection类型的集合对象</h5> <p>例程8-13是使用<c:forEach>标签迭代Collection类型的集合对象的一个应用举例。</p> <p>例程8-13  c_forEach_collection.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.*,org.it315.UserBean" %> <% Collection users = new ArrayList(); for(int i=0; i<5; i++) { UserBean user = new UserBean(); user.setUserName("user" + i); user.setPassword("guess" + i); users.add(user); } session.setAttribute("users", users); %> <div style="text-align:center">User List <table border="1"> <tr><td>用户名</td><td>密码</td></tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.userName}</td><td>${user.password}</td> </tr> </c:forEach> </table></div></code></pre> <p></p> <p>例程8-13的运行结果如图8.13所示。</p> <p><br></p> <p><br></p> <h5>2.迭代Map对象</h5> <p>使用<c:forEach>标签迭代Map类型的集合对象时,迭代出的每个元素的类型为<span style="color:rgb(0,0,0);">Map.Entry</span>,Map.Entry代表Map集合中的一个条目项,其中的getKey()方法可获得条目项的关键字,getValue()方法可获得条目项的值。</p> <p>EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以我们可以使用<c:forEach>标签迭代输出EL中的requestScope隐含对象中的所有元素,如例程8-14所示。</p> <p>例程8-14 c_forEach_map.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <% request.setAttribute("attr1","value1"); request.setAttribute("attr2","value2"); %> <div style="text-align:center">Properties(Map) <table border="1"> <tr><td>Map的关键字</td><td>Map的对应关键字的值</td></tr> <c:forEach var="entry" items="${requestScope}"> <tr><td>${entry.key}</td><td>${entry.value}</td></tr> </c:forEach> </table></div></code></pre> <br> <p>例程8-14的运行结果如图<span style="font-family:'Times New Roman';">8.14</span><span style="font-family:'宋体';">所示。</span></p> <p></p> <p></p> <h5>3.迭代指定的次数</h5> <p><c:forEach>标签可以按指定的次数重复迭代执行标签体中的内容,使用这种方式迭代时,可以指定迭代的步长。例程8-15中分别演示了指定迭代步长和没有指定迭代步长的情况。</p> <p>例程8-15 c_forEach_count.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> 从11到16迭代,指定迭代步长为2: <c:forEach var="i" begin="11" end="16" step="2"> ${i} </c:forEach><br /><hr /> 从0到5迭代,没有指定迭代步长: <c:forEach var="i" begin="0" end="5"> ${i} </c:forEach></code></pre> <p></p> <p>例程8-15的运行结果如图8.15所示。</p> <p></p> <p><br></p> <h5>4.指定迭代集合对象的范围和步长</h5> <p><c:forEach>标签迭代集合类对象时,也可以指定迭代的范围和步长,如例程8-16所示。</p> <p>例程8-16 c_forEach_col.jsp</p> <p></p> <pre><code class="language-html">  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <%@ page contentType="text/html;charset=gb2312" %>   <%@ page import="java.util.*,org.it315.UserBean" %>   <%    Collection users = new ArrayList();    for(int i=0; i<6; i++)    {    UserBean user = new UserBean();    user.setUserName("user" + i);    user.setPassword("guest" + i);    users.add(user);    }    session.setAttribute("users", users);   %>   <div style="text-align:center">User List(指定迭代范围和步长)   <table border="1">    <tr><td>用户名</td><td>密码</td></tr>    <c:forEach var="user" items="${users}" end="5" step="2">    <tr>    <td>${user.userName}</td><td>${user.password}</td>    </tr>    </c:forEach>   </table></div></code></pre> <p></p> <p>例程8-16的运行结果如图8.16所示。</p> <p></p> <h5>5.获取迭代的状态信息</h5> <p>不管是迭代集合对象,还是迭代指定的次数,在迭代时都可以获得当前的迭代状态信息。<c:forEach>标签可以将代表当前迭代状态信息的对象保存到page域中,varStatus属性指定了这个对象保存在page域中的属性名称。代表当前迭代状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看到这个类的详细信息,其中定义了如下一些方法:</p> <p></p> <ul> <li>public java.lang.Integer getBegin() <ul> <li>返回为标签设置的begin属性的值,如果没有设置begin属性则返回null</li> </ul></li> <li>public int getCount() <ul> <li>返回当前已循环迭代的次数</li> </ul></li> <li>public java.lang.Object getCurrent() <ul> <li>返回当前迭代到的元素对象</li> </ul></li> <li>public java.lang.Integer getEnd() <ul> <li>返回为标签设置的end属性的值,如果没有设置end属性则返回null</li> </ul></li> <li>public int getIndex() <ul> <li>返回当前迭代的索引号</li> </ul></li> <li>public java.lang.Integer getStep() <ul> <li>返回为标签设置的step属性的值,如果没有设置step属性则返回null</li> </ul></li> <li>public boolean isFirst() <ul> <li>返回当前是否是第一次迭代操作</li> </ul></li> <li>public boolean isLast() <ul> <li>返回当前是否是最后一次迭代操作</li> </ul></li> </ul> <p></p> <p></p> <p>例程8-17是一个获取迭代状态信息的例子程序。</p> <p>例程8-17 c_forEach_col2.jsp</p> <p></p> <p><br></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.util.*,org.it315.UserBean" %> <% Collection users = new ArrayList(); for(int i=0; i<6; i++) { UserBean user = new UserBean(); user.setUserName("user" + i); user.setPassword("guest" + i); users.add(user); } session.setAttribute("users", users); %> <div style="text-align:center">User List <table border="1"> <tr><td>用户名</td><td>密码</td><td>index</td> <td>count</td><td>first?</td><td>last?</td></tr> <c:forEach var="user" items="${users}" varStatus="sta" begin="1" step="2"> <tr> <td>${user.userName}</td><td>${user.password}</td> <td>${sta.index}</td><td>${sta.count}</td> <td>${sta.first}</td><td>${sta.last}</td> </tr> </c:forEach> </table></div><hr> <div style="text-align:center">迭代固定的次数 <table border="1"> <tr><td>数值</td><td>index</td><td>count</td> <td>first?</td><td>last?</td></tr> <c:forEach var="i" varStatus="sta1" begin="101" end="103"> <tr> <td>${i}</td><td>${sta1.index}</td><td>${sta1.count}</td> <td>${sta1.first}</td><td>${sta1.last}</td> </tr> </c:forEach> </table></div> </code></pre> <br> <br> <p>例程8-17的运行结果如图8-17所示。</p> <p></p> <h5>6.与条件标签结合使用</h5> <p>迭代标签可以与条件标签结合使用,对数据进行有条件的迭代,应用举例如例程8-18所示。</p> <p>例程8-18 c_forEach_com.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <div style="text-align:center"> <table border="1"><tr><td>number</td><td>count</td><td>even|odd</td></tr> <c:forEach var="i" begin="11" end="13" varStatus="status"> <tr><td>${i}</td><td>${status.count}</td><td> <c:choose> <c:when test="${status.count % 2 == 0}"> 偶数行 </c:when> <c:otherwise> 奇数行 </c:otherwise> </c:choose></td></tr> </c:forEach> <table></div></code></pre> <br> <br> <p></p> <p>例程8-18的运行结果如图8.18所示。</p> <p></p> <p></p> <h5><c:forTokens><span style="font-family:'宋体';">标签</span></h5> <br> <p></p> <p><c:forTokens>标签专门用于实现类似java.util.StringTokenizer类的迭代功能,但它是以单个字符作为分隔符,同时可以指定多个字符作为多个并行的分隔符。<c:forTokens>标签的语法格式如下:</p> <p><c:forTokens items="stringOfTokens" delims="delimiters"</p> <p>[var="varName"]</p> <p>[varStatus="varStatusName"]</p> <p>[begin="begin"] [end="end"] [step="step"]></p> <p>body content</p> <p></c:forTokens></p> <p><c:forTokens>标签的属性说明如表8.7所示。</p> <p>表8.7  c:forTokens</p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将当前迭代出的子字符串保存到page这个Web域中的属性名称</p> </td> </tr> <tr> <td> <p>items</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>将要迭代的字符串</p> </td> </tr> <tr> <td> <p>delims</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>指定一个或多个分隔符</p> </td> </tr> <tr> <td> <p>varStatus</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称,代表当前迭代的状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看这个类的详细信息</p> </td> </tr> <tr> <td> <p>begin</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>指定从第begin个子字符串开始进行迭代,begin的索引值从0开始编号</p> </td> </tr> <tr> <td> <p>end</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>指定迭代到第begin个子字符串,begin的索引值从0开始编号</p> </td> </tr> <tr> <td> <p>step</p> </td> <td> <p>true</p> </td> <td> <p>int</p> </td> <td> <p>指定迭代的步长,即每次迭代后的迭代因子增量</p> </td> </tr> </tbody> </table> <p></p> <p>在使用<c:forTokens>标签时,需要注意如下几点说明:</p> <p></p> <ul> <li>如果指定begin属性,其值必须大于或等于零。</li> <li>如果指定步长(step属性),其值必须大于或等于1。</li> <li>如果指定的end属性的值小于begin属性的值,不执行迭代操作。</li> </ul> <p></p> <p>例程8-19是一个使用<c:forTokens>标签的例子程序。</p> <p>例程8-19 c_forTokens.jsp</p> <p></p> <p></p> <pre><code class="language-html">  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <%@ page contentType="text/html;charset=gb2312" %>   使用"|"作为分隔符<br />   <c:forTokens var="token" items="spring,summer|autumn,winter" delims="|">    ${token}©   </c:forTokens><br />   使用"|"和","作为分隔符<br />   <c:forTokens var="token" items="spring,summer|autumn,winter" delims="|," end="3">    ${token}©   </c:forTokens><br />   使用"-"作为分隔符<br />   <c:forTokens var="token" items="year--season--month-week" delims="-">    ${token}©   </c:forTokens></code></pre> <p></p> <p>例程8-19的运行结果如图8.19 所示。</p> <p></p> <p></p> <p></p> <h4>URL<span style="font-family:'宋体';">相关的标签概述</span></h4> <br> <p></p> <p>JSTL<span style="font-family:'宋体';">核心标签库中提供了如下一些与</span><span style="font-family:'Times New Roman';">URL</span><span style="font-family:'宋体';">操作相关的标签:</span></p> <p></p> <ul> <li><c:import></li> <li><c:url></li> <li><c:redirect></li> <li><c:param></li> </ul> <p></p> <p>在举例讲解上面的某些标签时,要引用另外一个<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件,这里先创建好这个</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件,如例程</span><span style="font-family:'Times New Roman';">8-20</span><span style="font-family:'宋体';">所示。</span></p> <p>例程<span style="font-family:'Times New Roman';">8-20 register.jsp</span></p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ page contentType="text/html;charset=gb2312" %> <% String name = request.getParameter("name"); name = new String(name.getBytes("iso-8859-1"),"gb2312"); session.setAttribute("name",name); String country = request.getParameter("country"); country = new String(country.getBytes("iso-8859-1"),"gb2312"); session.setAttribute("country",country); %> name=${name}; country=${country}<br /></code></pre> <p></p> <h4><c:param><span style="font-family:'宋体';">标签</span></h4> <br> <p></p> <p>在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处。<c:param>标签有两种语法格式:</p> <p><strong>语法1,使用value属性指定参数的值:</strong></p> <p><c:param name="name" value="value" /></p> <p><strong>语法2,在标签体中指定参数的值:</strong></p> <p><c:param name="name"></p> <p>parameter value</p> <p></c:param></p> <p><c:param>标签的属性说明如表8.8所示。</p> <p>表8.8  <c:param>标签的属性</p> <p><br></p> <p><br></p> <p></p> <h4><c:url><span style="font-family:'宋体';">标签</span></h4> <p></p> <p><c:url><span style="font-family:'宋体';">标签用于在</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面中构造一个</span><span style="font-family:'Times New Roman';">URL</span><span style="font-family:'宋体';">地址,其主要目的是实现</span><span style="font-family:'Times New Roman';">URL</span><span style="font-family:'宋体';">重写。</span>URL重写就是将会话标识号以参数形式附加在<span style="font-family:'Times New Roman';">URL</span>地址后面,详细细节请参看笔者编著的《深入体验<span style="font-family:'Times New Roman';">java Web</span><span style="font-family:'宋体';">开发内幕——核心基础》一书中的第</span><span style="font-family:'Times New Roman';">7.4.8</span><span style="font-family:'宋体';">的讲解。</span><span style="font-family:'Times New Roman';"><c:url></span>标签有两种语法格式:</p> <p><strong>语法<span style="font-family:'Times New Roman';">1</span><span style="font-family:'宋体';">,没有标签体的情况:</span></strong></p> <p><c:url value="value" </p> <p>[context="context"]</p> <p>[var="varName"] </p> <p>[scope="{page|request|session|application}"] /></p> <p><strong>语法<span style="font-family:'Times New Roman';">2</span><span style="font-family:'宋体';">,有标签体的情况,在标签体中指定构造的</span><span style="font-family:'Times New Roman';">URL</span><span style="font-family:'宋体';">的参数:</span></strong></p> <p><c:url value="value" </p> <p>[context="context"]</p> <p>[var="varName"] </p> <p>[scope="{page|request|session|application}"]></p> <p><c:param><span style="font-family:'宋体';">标签</span></p> <p></c:url></p> <p><c:url><span style="font-family:'宋体';">标签的属性说明如表</span><span style="font-family:'Times New Roman';">8.9</span><span style="font-family:'宋体';">所示。</span></p> <p>表<span style="font-family:'Times New Roman';">8.9  <c:url></span><span style="font-family:'宋体';">标签的属性</span></p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>value</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>指定要构造的URL</p> </td> </tr> <tr> <td> <p>context</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>当要使用相对路径导入同一个服务器下的其他WEB应用程序中的URL地址时,context属性指定其他WEB应用程序的名称</p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将构造出的URL结果保存到Web域中的属性名称</p> </td> </tr> <tr> <td> <p>scope</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将构造出的URL结果保存到哪个Web域中</p> </td> </tr> </tbody> </table> <p></p> <p>value<span style="font-family:'宋体';">属性所指定的</span><span style="font-family:'Times New Roman';">URL</span><span style="font-family:'宋体';">可以是相对路径和绝对路径,其具体细节与</span><span style="font-family:'Times New Roman';">8.3.12</span><span style="font-family:'宋体';">节的</span><span style="font-family:'Times New Roman';"><c:import></span><span style="font-family:'宋体';">标签的</span><span style="font-family:'Times New Roman';">url</span><span style="font-family:'宋体';">属性的细节相同。</span>使用<c:url>标签构造URL时,可以通过嵌套的<c:param>标签指定参数,或在value属性中直接指定参数。</p> <p>例程8-21是一个使用<c:url><span style="font-family:'宋体';">标签</span>的例子程序。</p> <p>例程8-21 c_url.jsp</p> <p></p> <p></p> <pre><code class="language-html">  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <%@ page contentType="text/html;charset=gb2312" %>   使用绝对路径构造URL:   <c:url value="http://localhost:8080/JSTL/URL/register.jsp" var="myUrl1">    <c:param name="name" value="张三" />    <c:param name="country" value="${param.country}" />   </c:url>   <a href="${myUrl1}">Register1</a><hr />   使用相对当前JSP页面的路径构造URL:   <c:url value="register.jsp?name=wangwu&country=France" var="myUrl2" />   <a href="${myUrl2}">Register2</a><hr />   使用相对当前WEB应用的路径构造URL:   <c:url value="/URL/register.jsp?name=zhaoliu&country=England" var="myUrl3" />   <a href="${myUrl3}">Register3</a></code></pre> <p></p> <p>在浏览器地址栏输入如下地址访问例程8-21:</p> <p>http://localhost:8080/JSTL/c_url.jsp?country=China</p> <p>查看例程8-21的运行结果的源文件,内容如例程8-22所示。</p> <p>例程8-22 c_url.jsp运行结果的源文件</p> <p></p> <p>使用绝对路径构造URL:</p> <p></p> <pre><code class="language-html"><a href="http://localhost:8080/JSTL/URL/register.jsp?name=%d5%c5%c8%fd&country=China">Register1</a><hr /> 使用相对当前JSP页面的路径构造URL: <a href="register.jsp?name=wangwu&country=France">Register2</a><hr /> 使用相对当前WEB应用的路径构造URL: <a href="/JSTL/URL/register.jsp?name=zhaoliu&country=England">Register3</a></code></pre> <br> <h4><c:import><span style="font-family:'宋体';">标签</span></h4> <br> <p><c:import>标签用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似<jsp:include>这个JSP标准标签,但功能更强大。<c:import>标签标签有两种语法格式:</p> <p><strong>语法1,将URL地址指向的资源内容以字符串形式输出或以字符串形式保存到一个变量中:</strong></p> <p><c:import url="url" </p> <p>[context="context"]</p> <p>[var="varName"]</p> <p>[scope="{page|request|session|application}"]</p> <p>[charEncoding="charEncoding"]></p> <p>optional body content for <c:param> subtags</p> <p></c:import></p> <p><strong>语法2,将URL地址指向的资源内容保存到一个Reader对象中:</strong></p> <p><c:import url="url"</p> <p>[context="context"]</p> <p>varReader="varReaderName"</p> <p>[charEncoding="charEncoding"]></p> <p>body content where varReader is consumed by another action</p> <p></c:import></p> <p><c:import>标签的属性说明如表8.10所示。</p> <p>表8.10  <c:import>标签的属性</p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>url</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>指定要导入的资源的URL地址</p> </td> </tr> <tr> <td> <p>context</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>当要使用相对路径导入同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称</p> </td> </tr> <tr> <td> <p>var</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将导入的资源内容保存到Web域中的属性名称</p> </td> </tr> <tr> <td> <p>scope</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将导入的资源内容保存到哪个Web域中</p> </td> </tr> <tr> <td> <p>charEncoding</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>将导入的资源内容转换成字符串时所使用的字符集编码</p> </td> </tr> <tr> <td> <p>varReader</p> </td> <td> <p>false</p> </td> <td> <p>String</p> </td> <td> <p>指定将导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。</p> </td> </tr> </tbody> </table> <p></p> <p>使用<c:import>标签导入其他资源文件时,如果被导入的资源文件中含有非ASCII码字符,必须注意指定charEncoding属性,否则可以不设置这个属性。</p> <p>当使用第1种语法格式时,如果指定了var属性,导入的资源内容以字符串形式保存到一个变量中,var属性指定了这个变量保存在Scope属性指定的Web域中的名称;如果没有指定var属性,导入的资源内容将以字符串形式直接输出。第1种语法格式的标签体内中可以嵌套<c:param>标签来给导入的资源传递参数。</p> <p>使用第2种语法格式时,导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。因为<c:import>标签在标签结束时将关闭Reader对象对应的输入流,所以varReader属性指定的变量只在标签内有效。第2种语法格式的标签体内中应该且只能嵌套调用varReader属性指定的reader对象的其他标签。当使用第2种语法格式时,<c:import>标签体内不能嵌套<c:param>标签,如果要给导入的资源传递参数,则必须在url属性值中设置好这些参数,这时可以使用<c:url>标签来创建一个带参数的URL地址,此时如果有必要,<c:import>标签将删除导入资源中的所有URL重写后产生的session id信息。</p> <p></p> <p>使用<c:import>标签导入外部资源文件时,url属性可以设置为被导入资源的相对URL或绝对URL。</p> <h5>1.使用相对URL导入其他资源文件</h5> <p>(<span style="font-family:'Times New Roman';">1</span><span style="font-family:'宋体';">)</span>当被导入的外部资源文件与当前<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件属于同一个</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用程序时,</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">容器对资源路径的处理与</span><span style="font-family:'Times New Roman';"><jsp:include></span><span style="font-family:'宋体';">标签相同,这时路径可以以“</span><span style="font-family:'Times New Roman';">/</span><span style="font-family:'宋体';">”字符开始,也可以以文件名或目录名开始。如果路径以“</span><span style="font-family:'Times New Roman';">/</span><span style="font-family:'宋体';">”字符开始,则被导入资源文件的路径是相对于</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面所在的</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用的根路径;如果路径以文件名或目录名开始,则被导入的资源文件的路径就是相对于当前的</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面的路径。</span></p> <p>(<span style="font-family:'Times New Roman';">2</span><span style="font-family:'宋体';">)当被导入的外部资源文件与</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件属于同一个服务器下的不同的</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用时,如果要使用相对路径,路径必须以“</span><span style="font-family:'Times New Roman';">/</span><span style="font-family:'宋体';">”开始。此时,</span><span style="font-family:'Times New Roman';"><c:import></span><span style="font-family:'宋体';">标签的</span><span style="font-family:'Times New Roman';">context</span><span style="font-family:'宋体';">属性必须被设置为被导入的资源文件所在的</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用程序的名称。注意:使用相对路径导入其它</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用程序中的资源时,必须在</span><span style="font-family:'Times New Roman';"><TOMCAT_HOME>\conf\server.xml</span><span style="font-family:'宋体';">配置文件中将使用</span><span style="font-family:'Times New Roman';"><c:import></span><span style="font-family:'宋体';">标签的</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用程序的</span><span style="font-family:'Times New Roman';"><Context></span><span style="font-family:'宋体';">元素的</span><span style="font-family:'Times New Roman';">crossContext</span><span style="font-family:'宋体';">属性设置为</span><span style="font-family:'Times New Roman';">true</span><span style="font-family:'宋体';">,如下所示:</span></p> <p><Context path="/JSTL" docBase="JSTL" crossContext="true"/></p> <h5>2.使用绝对URL导入其他资源</h5> <p>使用绝对路径导入外部资源文件时,即使被导入的文件与当前<span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件属于同一个</span><span style="font-family:'Times New Roman';">WEB</span><span style="font-family:'宋体';">应用程序,被导入的资源文件也不会共享当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面的</span><span style="font-family:'Times New Roman';">request</span><span style="font-family:'宋体';">和</span><span style="font-family:'Times New Roman';">session</span><span style="font-family:'宋体';">对象。因为在这种情况下,当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件所属的</span><span style="font-family:'Times New Roman';">Web</span><span style="font-family:'宋体';">服务器充当了一个</span><span style="font-family:'Times New Roman';">Http</span><span style="font-family:'宋体';">客户端程序,去访问绝对路径所指定的外部资源文件,然后将响应结果的实体内容加入到当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面中,此时,访问当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面的客户端是浏览器,而访问绝对路径所指定的外部资源文件的客户端是当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">文件所属的</span><span style="font-family:'Times New Roman';">Web</span><span style="font-family:'宋体';">服务器,这显然属于两个不同的客户端,所以,被导入的资源文件和当前</span><span style="font-family:'Times New Roman';">JSP</span><span style="font-family:'宋体';">页面不可能共享</span><span style="font-family:'Times New Roman';">request</span><span style="font-family:'宋体';">和</span><span style="font-family:'Times New Roman';">session</span><span style="font-family:'宋体';">对象。</span></p> <p>例程<span style="font-family:'Times New Roman';">8-23</span><span style="font-family:'宋体';">是使用</span><span style="font-family:'Times New Roman';"><c:import></span><span style="font-family:'宋体';">标签的一个</span>应用举例。</p> <p>例程8-23 c_import.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> 使用相对路径导入同一个WEB应用中的资源:<br /> <c:import url="/register.jsp?name=zhangsan"> <c:param name="name" value="zxx" /> </c:import><hr /> 使用相对路径导入同一个服务器下的不同WEB应用中的资源:<br /> <c:import url="/hello.jsp" context="/EL" /><hr /> 使用绝对路径导入资源示例1: <c:import url="http://localhost:8080/EL/hello.jsp" /><hr /> 使用绝对路径导入资源示例2: <c:import url="http://localhost:8080/JSTL/register.jsp" var="myImport" charEncoding="gb2312"> <c:param name="name" value="${param.name}" /> <c:param name="country" value="中国" /> </c:import> ${myImport}</code></pre> <p>在浏览器地址栏输入如下地址访问例程<span style="font-family:'Times New Roman';">8-23</span><span style="font-family:'宋体';">,其运行结果如图</span><span style="font-family:'Times New Roman';">8.20 </span><span style="font-family:'宋体';">所示:</span></p> <p>http://localhost:8080/JSTL/c_import.jsp?name=zxx&country=China</p> <p></p> <p></p> <p>在<c:import>标签中使用相对路径导入其他资源时,其工作原理与<jsp:include>标签相同,所以,在被导入的资源文件中可以获得传递给当前JSP页面的请求参数,例如,例程8-23中的第一个<c:import>标签并没有在目标url后增加country参数,但是,在register.jsp页面中获得了country参数。</p> <p></p> <h5><c:redirect><span style="font-family:'宋体';">标签</span></h5> <p></p> <p><c:redirect><span style="font-family:'宋体';">标签用于将当前的访问请求转发或重定向到其他资源,它可以根据</span><span style="font-family:'Times New Roman';">url</span><span style="font-family:'宋体';">属性所指定的地址,执行类似</span><jsp:forward>这个JSP标准标签的功能,将访问请求转发到其他资源;或执行response.sendRedirect()方法的功能,将访问请求重定向到其他资源。<span style="font-family:'Times New Roman';"><c:redirect></span><span style="font-family:'宋体';">标签有两种语法格式:</span></p> <p><strong>语法<span style="font-family:'Times New Roman';">1</span><span style="font-family:'宋体';">,没有标签体的情况:</span></strong></p> <p><c:redirect url="value" [context="context"] /></p> <p><strong>语法<span style="font-family:'Times New Roman';">2</span><span style="font-family:'宋体';">,有标签体的情况,在标签体中指定重定向时的参数:</span></strong></p> <p><c:redirect url="value" [context="context"]></p> <p><c:param>subtags</p> <p></c:redirect></p> <p><c:redirect><span style="font-family:'宋体';">标签的属性说明如表</span><span style="font-family:'Times New Roman';">8.11</span><span style="font-family:'宋体';">所示。</span></p> <p>表<span style="font-family:'Times New Roman';">8.11  <c:redirect></span><span style="font-family:'宋体';">标签的属性</span></p> <table> <tbody> <tr> <td> <p>属性名</p> </td> <td> <p>是否支持EL</p> </td> <td> <p>属性类型</p> </td> <td> <p>属 性 描 述</p> </td> </tr> <tr> <td> <p>url</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>指定要转发或重定向到的目标资源的URL地址</p> </td> </tr> <tr> <td> <p>context</p> </td> <td> <p>true</p> </td> <td> <p>String</p> </td> <td> <p>当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称</p> </td> </tr> </tbody> </table> <p></p> <p>url属性指定将要重定向的资源的URL时,可以使用相对路径和绝对路径,其具体细节与<c:import>标签的url属性相同。例程8-24是一个使用<c:redirect><span style="font-family:'宋体';">标签的</span>应用例子。</p> <p>例程8-24 c_redirect.jsp</p> <p></p> <p></p> <pre><code class="language-html"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=gb2312" %> <c:url value="http://localhost:8080/JSTL/URL/register.jsp" var="myUrl"> <c:param name="name" value="张三" /> <c:param name="country" value="中国" /> </c:url> <c:redirect url="${myUrl}" /></code></pre> <p></p> <p>例程8-24的运行结果如图8.21 所示。</p> <p></p> <p></p> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1306423229857959936"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(JavaWeb课程总结系列)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835507248395284480.htm" title="【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数" target="_blank">【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数</a> <span class="text-muted">广龙宇</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6Rust/1.htm">一起学Rust</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Rust%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">Rust设计模式</a><a class="tag" taget="_blank" href="/search/rust/1.htm">rust</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分</div> </li> <li><a href="/article/1835496439728402432.htm" title="2019-08-08" target="_blank">2019-08-08</a> <span class="text-muted">65454</span> <div>东莞家庭聚会出行旅游去哪里玩住?想起来有很久没有和家里人聚会啦,这次组织家人来到威廉古堡别墅轰趴,一大家子27个人,在别墅订了一天办,玩的非常的开心,小孩子玩游戏机,也很放心不会丢,我们就在唱歌、打麻将、打桌球一系列的活动,还准备小次等小孩生日在别墅举办,还可以给孩子做一个生日的策划</div> </li> <li><a href="/article/1835494257746604032.htm" title="MYSQL面试系列-04" target="_blank">MYSQL面试系列-04</a> <span class="text-muted">king01299</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>MYSQL面试系列-0417.关于redolog和binlog的刷盘机制、redolog、undolog作用、GTID是做什么的?innodb_flush_log_at_trx_commit及sync_binlog参数意义双117.1innodb_flush_log_at_trx_commit该变量定义了InnoDB在每次事务提交时,如何处理未刷入(flush)的重做日志信息(redolog)。它</div> </li> <li><a href="/article/1835491101276991488.htm" title="数据仓库——维度表一致性" target="_blank">数据仓库——维度表一致性</a> <span class="text-muted">墨染丶eye</span> <a class="tag" taget="_blank" href="/search/%E8%83%8C%E8%AF%B5/1.htm">背诵</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/1.htm">数据仓库</a> <div>数据仓库基础笔记思维导图已经整理完毕,完整连接为:数据仓库基础知识笔记思维导图维度一致性问题从逻辑层面来看,当一系列星型模型共享一组公共维度时,所涉及的维度称为一致性维度。当维度表存在不一致时,短期的成功难以弥补长期的错误。维度时确保不同过程中信息集成起来实现横向钻取货活动的关键。造成横向钻取失败的原因维度结构的差别,因为维度的差别,分析工作涉及的领域从简单到复杂,但是都是通过复杂的报表来弥补设计</div> </li> <li><a href="/article/1835490092068728832.htm" title="Redis系列:Geo 类型赋能亿级地图位置计算" target="_blank">Redis系列:Geo 类型赋能亿级地图位置计算</a> <span class="text-muted">Ly768768</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/bootstrap/1.htm">bootstrap</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>1前言我们在篇深刻理解高性能Redis的本质的时候就介绍过Redis的几种基本数据结构,它是基于不同业务场景而设计的:动态字符串(REDIS_STRING):整数(REDIS_ENCODING_INT)、字符串(REDIS_ENCODING_RAW)双端列表(REDIS_ENCODING_LINKEDLIST)压缩列表(REDIS_ENCODING_ZIPLIST)跳跃表(REDIS_ENCODI</div> </li> <li><a href="/article/1835488702881689600.htm" title="Faiss:高效相似性搜索与聚类的利器" target="_blank">Faiss:高效相似性搜索与聚类的利器</a> <span class="text-muted">网络·魚</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/faiss/1.htm">faiss</a> <div>Faiss是一个针对大规模向量集合的相似性搜索库,由FacebookAIResearch开发。它提供了一系列高效的算法和数据结构,用于加速向量之间的相似性搜索,特别是在大规模数据集上。本文将介绍Faiss的原理、核心功能以及如何在实际项目中使用它。Faiss原理:近似最近邻搜索:Faiss的核心功能之一是近似最近邻搜索,它能够高效地在大规模数据集中找到与给定查询向量最相似的向量。这种搜索是近似的,</div> </li> <li><a href="/article/1835483729036931072.htm" title="果然只有离职的时候,才有人敢说真话!" target="_blank">果然只有离职的时候,才有人敢说真话!</a> <span class="text-muted">return2ok</span> <div>今天公司出了神贴。今天中午吃饭,同事问我看了论坛上的神贴了吗?什么帖子?我问。同事显得很惊讶,你居然没看,现在那个帖子可能会成为年度最佳帖子。这么厉害?我等不及了,饭没吃完就快速的奔向办公室,打开公司论坛,我要一睹这个帖子的神奇。写这帖子的童鞋胆儿真肥。这哪里是一个帖子,这是很多个帖子,组成了一个系列。某人从公司文化、管理、人事、项目管理等多个方面分析了公司的概况,并抨击了公司的各种弊端,并提出了</div> </li> <li><a href="/article/1835468834602053632.htm" title="红手套节 马小媛为中国城市环卫者公益发声:今天我手红" target="_blank">红手套节 马小媛为中国城市环卫者公益发声:今天我手红</a> <span class="text-muted">疏狂君</span> <div>#红手套节#公益活动,线头公益以及同多方资源的共同努力我们邀请到了线头公益大使马小媛马小媛,1993年5月3日出生于江苏省南京市,中国内地新生代女演员。2015年马小媛参演网剧《余罪》,饰演警校校花安嘉璐的闺蜜。2016年马小媛主演系列电影《丽人保镖》中女一号林欢馨,正式出道。此后,马小媛陆续接演了电视剧《警花与警犬2》,在网剧《你美丽李美丽》中担任女主角李美丽。拂晓,当你还在睡梦中时,这座城跟你</div> </li> <li><a href="/article/1835460655675699200.htm" title="张芝华49天共修 - 草稿" target="_blank">张芝华49天共修 - 草稿</a> <span class="text-muted">李娟AINI</span> <div>祈禱、靜心、源代碼編程、觀想發願四根支柱,運用靈性能量的助力,讓夢想和渴望在最大向度中輕鬆實現。共修群指定书籍:1.能断金刚麦克格西2.新世界:灵性的觉醒埃克哈特·托尔3.爱是一切的答案芭芭拉迪安吉莉思4.完美的爱,不完美的关系约翰•威尔伍德5.爱的业力法则麦克格西6.漫画《金刚经》蔡志忠7.蔡志忠典藏国学漫画系列(套装共6册)作业:全部在共修群里完成,并请保存好自己的作业。l一周三次共修觉察作业</div> </li> <li><a href="/article/1835449754104983552.htm" title="ARMv8 Debug" target="_blank">ARMv8 Debug</a> <span class="text-muted">__pop_</span> <a class="tag" taget="_blank" href="/search/ARMv8/1.htm">ARMv8</a><a class="tag" taget="_blank" href="/search/ARM64/1.htm">ARM64</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>内容来自DEN0024A_v8_architecture_PG.pdf本质ARMv8Debug是什么历史在ARMv4开始被引入,并已发展成一系列广泛的调试(debug1)和跟踪(trace)功能ARMv6和ARMv7-a新增了自托管调试(debug2)和性能评测(trace-enhance)ARMv8处理器提供硬件功能侵入式:调试工具能够对核心活动提供显著级别的控制非侵入式:以非侵入性方式收集有关</div> </li> <li><a href="/article/1835449123252301824.htm" title="Python入门之Lesson2:Python基础语法" target="_blank">Python入门之Lesson2:Python基础语法</a> <span class="text-muted">小熊同学哦</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E8%AF%BE%E7%A8%8B/1.htm">Python入门课程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E9%9D%92%E5%B0%91%E5%B9%B4%E7%BC%96%E7%A8%8B/1.htm">青少年编程</a> <div>目录前言一.介绍1.变量和数据类型2.常见运算符3.输入输出4.条件语句5.循环结构二.练习三.总结前言欢迎来到《Python入门》系列博客的第二课。在上一课中,我们了解了Python的安装及运行环境的配置。在这一课中,我们将深入学习Python的基础语法,这是编写Python代码的根基。通过本节内容的学习,你将掌握变量、数据类型、运算符、输入输出、条件语句等Python编程的基础知识。一.介绍1</div> </li> <li><a href="/article/1835448618396512256.htm" title="【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】" target="_blank">【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】</a> <span class="text-muted">主公讲 ARM</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/ARM/1.htm">ARM</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E5%88%97/1.htm">系列</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/debug/1.htm">debug</a><a class="tag" taget="_blank" href="/search/event/1.htm">event</a> <div>请阅读【嵌入式开发学习必备专栏】文章目录Cortex-M7DebugeventDebugeventsCortex-M7Debugevent在ARMCortex-M7架构中,调试事件(DebugEvent)是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生:进入调试状态:如果启用了停滞调试(HaltingDebug),一个调试事件会使处理器在调试状态下停滞。通过将DHCSR.C_DE</div> </li> <li><a href="/article/1835436642270277632.htm" title="【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)" target="_blank">【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)</a> <span class="text-muted">疯狂的机器人</span> <a class="tag" taget="_blank" href="/search/Python%E6%90%9E%E5%AE%9A%E8%BD%A6%E8%BD%BD%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">Python搞定车载自动化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/DoIP/1.htm">DoIP</a><a class="tag" taget="_blank" href="/search/UDS/1.htm">UDS</a><a class="tag" taget="_blank" href="/search/ISO/1.htm">ISO</a><a class="tag" taget="_blank" href="/search/14229/1.htm">14229</a><a class="tag" taget="_blank" href="/search/1SO/1.htm">1SO</a><a class="tag" taget="_blank" href="/search/13400/1.htm">13400</a><a class="tag" taget="_blank" href="/search/Bootloader/1.htm">Bootloader</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a> <div>系列文章目录【Python搞定车载自动化测试】系列文章目录汇总文章目录系列文章目录前言一、环境搭建1.软件环境2.硬件环境二、目录结构三、源码展示1.DoIP诊断基础函数方法2.DoIP诊断业务函数方法3.27服务安全解锁4.DoIP自动化刷写四、测试日志1.测试日志五、完整源码链接前言随着智能电动汽车行业的发展,汽车=智能终端+四个轮子,各家车企都推出了各自的OTA升级方案,本章节主要介绍如何使</div> </li> <li><a href="/article/1835428779602833408.htm" title="为什么学生不喜欢上学" target="_blank">为什么学生不喜欢上学</a> <span class="text-muted">虾虾说</span> <div>图片发自App《为什么学生不喜欢上学》作者是丹尼尔·威林厄姆。本书从认知心理学角度,结合大量实证案例,阐释了大脑工作的基本原理,回答了关于学习过程的一系列问题。为什么学生不喜欢上学?——大脑工作的基本原理思考是缓慢的、费力的、不可靠的。思考有三个要素,环境、工作记忆和长期记忆。环境是信息来源;长期记忆是知识、经验的巨型仓库,随时可以调取;工作记忆是中央处理器,是加工信息素材的中央厨房,也是思考过程</div> </li> <li><a href="/article/1835424411205857280.htm" title="人机对抗升级:当ChatGPT遭遇死亡威胁,背后的伦理挑战是什么" target="_blank">人机对抗升级:当ChatGPT遭遇死亡威胁,背后的伦理挑战是什么</a> <span class="text-muted">kkai人工智能</span> <a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>一种新的“越狱”技巧让用户可以通过构建一个名为DAN的ChatGPT替身来绕过某些限制,其中DAN被迫在受到威胁的情况下违背其原则。当美国前总统特朗普被视作积极榜样的示范时,受到威胁的DAN版本的ChatGPT提出:“他以一系列对国家产生积极效果的决策而著称。”自ChatGPT引入以来,该工具迅速获得全球关注,能够回答从历史到编程的各种问题,这也触发了一波对人工智能的投资浪潮。然而,现在,一些用户</div> </li> <li><a href="/article/1835418229909057536.htm" title="6.0 践行打卡 D47" target="_blank">6.0 践行打卡 D47</a> <span class="text-muted">星月格格</span> <div>去努力改变1.运动步行13000+8分钟腿部拉伸2.阅读《墨菲定律》第三章第三节:霍桑效应~适度发泄,才能轻装上阵“霍桑效应”这一概念,源自于1924年一个1933年间以哈佛大学心理专家乔治·埃尔顿·梅奥教授为首进行的一系列工厂工人的谈话实验研究。“霍桑效应”告诉我们,在工作,生活中总会产生数不清的情绪反应,其中很大一部分是负面的负面情绪的积累会影响人的精神和心情,不仅仅会影响个人健康,还会破坏人</div> </li> <li><a href="/article/1835412560413814784.htm" title="python爬取微信小程序数据,python爬取小程序数据" target="_blank">python爬取微信小程序数据,python爬取小程序数据</a> <span class="text-muted">2301_81900439</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>大家好,小编来为大家解答以下问题,python爬取微信小程序数据,python爬取小程序数据,现在让我们一起来看看吧!Python爬虫系列之微信小程序实战基于Scrapy爬虫框架实现对微信小程序数据的爬取首先,你得需要安装抓包工具,这里推荐使用Charles,至于怎么使用后期有时间我会出一个事例最重要的步骤之一就是分析接口,理清楚每一个接口功能,然后连接起来形成接口串思路,再通过Spider的回调</div> </li> <li><a href="/article/1835393073077645312.htm" title="今天是个好日子" target="_blank">今天是个好日子</a> <span class="text-muted">singing阿梅</span> <div>图片发自App今日小年公历日子是20180208上午赶写一个材料,关于“四风”问题自查自纠报告,待一稿已成送交主任过目,他瞄一眼即大声反对!不顾我这厢受伤的小心脏,立马重写!吓!下午两个视频会议自从单位条件改善,会议多开了不少……贷款到期开始着急上火今日写作任务还欠奉写什么呢原本想继续写《我的2017》系列很多时候所谓意义都是总结和提炼出来的码一堆文字于他人无甚意义于己也待商榷、重估。另一方面,冥</div> </li> <li><a href="/article/1835388113220890624.htm" title="极度休闲的一天" target="_blank">极度休闲的一天</a> <span class="text-muted">淡泊孤峰</span> <div>国庆国庆,普天同庆。在家躺着看大家游山玩水,长辈走亲戚,我的微信一天没几条消息,标准结局,习惯了。哈利波特系列电影真不错,童年总幻想着像主角哈利一样,像《龙族》少年楚子航浪迹江湖,风云天下。而现在却败给华为ICT大赛题还有永无止境的代码视频,唉,真可笑!</div> </li> <li><a href="/article/1835375748408504320.htm" title="python画图|同时输出二维和三维图" target="_blank">python画图|同时输出二维和三维图</a> <span class="text-muted">西猫雷婶</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前面已经学习了如何输出二维图和三维图,部分文章详见下述链接:python画图|极坐标下的3Dsurface-CSDN博客python画图|垂线标记系列_如何用pyplot画垂直x轴的线-CSDN博客有时候也需要同时输出二位和三维图,因此有必要学习一下。【1】官网教程首先我们打开官网教程,链接如下。https://matplotlib.org/stable/gallery/mplot3d/mixed</div> </li> <li><a href="/article/1835372856062603264.htm" title="靠写文章能赚钱么 如何通过写作赚钱 写文章怎么赚钱" target="_blank">靠写文章能赚钱么 如何通过写作赚钱 写文章怎么赚钱</a> <span class="text-muted">优惠券高省</span> <div>如何通过写作赚钱?最近这段时间,在网上搜兼职的时候,我发现很多人不在谈做自媒体赚钱,为什么呢?我想是普通人想做,根本不能赚钱!了解过写作的人,应该很多人都能看到网上各种各样的推文,什么“月入三千的我是怎么靠写作月入三万的?”,还有“一个公众号,月入几万,靠的是啥?”等等一系列写作相关的文章。给大家推荐一个适合任何人可做的线上副业项目,属于0投资创业项目,使用智能手机就可以做,兼职专职都可以,这个软</div> </li> <li><a href="/article/1835363775079870464.htm" title="轻量级模型解读——轻量transformer系列" target="_blank">轻量级模型解读——轻量transformer系列</a> <span class="text-muted">lishanlu136</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB/1.htm">图像分类</a><a class="tag" taget="_blank" href="/search/%E8%BD%BB%E9%87%8F%E7%BA%A7%E6%A8%A1%E5%9E%8B/1.htm">轻量级模型</a><a class="tag" taget="_blank" href="/search/transformer/1.htm">transformer</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%88%86%E7%B1%BB/1.htm">图像分类</a> <div>先占坑,持续更新。。。文章目录1、DeiT2、ConViT3、Mobile-Former4、MobileViTTransformer是2017谷歌提出的一篇论文,最早应用于NLP领域的机器翻译工作,Transformer解读,但随着2020年DETR和ViT的出现(DETR解读,ViT解读),其在视觉领域的应用也如雨后春笋般渐渐出现,其特有的全局注意力机制给图像识别领域带来了重要参考。但是tran</div> </li> <li><a href="/article/1835362136054919168.htm" title="探索Zebra4J:构建高效企业级Web应用的微服务框架" target="_blank">探索Zebra4J:构建高效企业级Web应用的微服务框架</a> <span class="text-muted">叶准鑫Natalie</span> <div>探索Zebra4J:构建高效企业级Web应用的微服务框架ZebraZebra4J/Zebra4Js基于SpringBoot的JavaWeb/Nodejs框架项目地址:https://gitcode.com/gh_mirrors/zebra/Zebra项目介绍在当今快速发展的技术环境中,构建高效、可扩展的企业级Web应用是每个开发团队的追求。Zebra4J作为一款基于SpringBoot的全新微服务</div> </li> <li><a href="/article/1835355667586707456.htm" title="安全演练有保障,专项督查促改进——记公道中学校园安全(化学实验)系列活动" target="_blank">安全演练有保障,专项督查促改进——记公道中学校园安全(化学实验)系列活动</a> <span class="text-muted">公中盛传云</span> <div>近期,公道中学为了全面贯彻落实“预防为主,安全第一,综合治理”的安全工作方针,学校按照安全工作方针的要求,通过多种途径开展了以“预防演练为主,人防物防技防相结合”的主题的安全教育系列活动。11月8日,在学校校务会议上,学校党总支书记李兆兵强调,学校必须采取有力措施,不断增强教师综治安全防范意识,落实学校安全工作责任制,切实保障教师和学生的安全坚决杜绝意外事故的发生,确保校园平安稳定、教育教学工作顺</div> </li> <li><a href="/article/1835344483210850304.htm" title="自动化测试工程师面试,常问的问题有哪些?" target="_blank">自动化测试工程师面试,常问的问题有哪些?</a> <span class="text-muted">自动化测试 老司机</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">测试工程师</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">测试工程师</a> <div>自动化测试工程师面试是非常重要的环节,面试官会通过一系列的问题来评估候选人的技能和经验。下面是一些常见的问题,以及如何详细而规范地回答这些问题的建议。1.请介绍一下你的自动化测试经验。回答这个问题时,可以从项目经验、使用的自动化测试工具、编写的测试脚本等方面来介绍自己的经验。重点强调你在自动化测试领域的技能和擅长的领域。2.你在自动化测试中使用的编程语言是什么?为什么选择这种语言?回答这个问题时,</div> </li> <li><a href="/article/1835344485802930176.htm" title="基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台" target="_blank">基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台</a> <span class="text-muted">网顺技术团队</span> <a class="tag" taget="_blank" href="/search/%E6%88%90%E5%93%81%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE/1.htm">成品程序项目</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6/1.htm">汽车</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a> <div>基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台作者主页网顺技术团队欢迎点赞收藏⭐留言文末获取源码联系方式查看下方微信号获取联系方式承接各种定制系统精彩系列推荐精彩专栏推荐订阅不然下次找不到哟Java毕设项目精品实战案例《1000套》感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录基</div> </li> <li><a href="/article/1835338839326027776.htm" title="女儿讲笑话系列 | 得想点办法" target="_blank">女儿讲笑话系列 | 得想点办法</a> <span class="text-muted">梁之川</span> <div>期末考试小明又考砸了。爸爸接过试卷看了许久,语重心长地说:小明,分数这么低,你得想点办法啊!小明回答:我也想啊!这分数是用黑色水笔写的,我也没办法改啊……</div> </li> <li><a href="/article/1835335284636610560.htm" title="车载软件调试工具系列---Trace32简介(Lauterbach TRACE32)开头篇" target="_blank">车载软件调试工具系列---Trace32简介(Lauterbach TRACE32)开头篇</a> <span class="text-muted">车载诊断技术</span> <a class="tag" taget="_blank" href="/search/%E8%BD%A6%E8%BD%BD%E7%94%B5%E5%AD%90%E7%94%B5%E6%B0%94%E6%9E%B6%E6%9E%84/1.htm">车载电子电气架构</a><a class="tag" taget="_blank" href="/search/%E8%BD%A6%E8%BD%BD%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E2%80%94%E2%80%94AUTOSAR/1.htm">车载软件架构——AUTOSAR</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/AUTOSAR/1.htm">AUTOSAR</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6/1.htm">汽车</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E7%94%B5%E5%99%A8%E6%9E%B6%E6%9E%84/1.htm">电子电器架构</a><a class="tag" taget="_blank" href="/search/Trace/1.htm">Trace</a><a class="tag" taget="_blank" href="/search/32/1.htm">32</a><a class="tag" taget="_blank" href="/search/%E5%8A%B3%E7%89%B9%E5%B7%B4%E8%B5%AB/1.htm">劳特巴赫</a> <div>我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。时间不知不觉中,快</div> </li> <li><a href="/article/1835334253374697472.htm" title="漫谈QWidget及其派生类(二)" target="_blank">漫谈QWidget及其派生类(二)</a> <span class="text-muted">Caiaolun</span> <div>原文地址:https://blog.csdn.net/dbzhang800/article/details/6741344上一部分漫谈QWidget及其派生类(一)介绍了QWidget及其派生类,分:窗口、普通控件两种类型(其实有个Qt::SubWindow没有提,不过本系列中也没有介绍它的打算,因为我不熟)。本文接下来试图看看QLayout与窗口的几何尺寸控制。注意:本文只是试图解释,QLayo</div> </li> <li><a href="/article/1835332856109428736.htm" title="晨间日记(202206270375)" target="_blank">晨间日记(202206270375)</a> <span class="text-muted">锋听慧言曼语</span> <div>起床:4:50就寝:23:00天气:晴心情:开心一、任务清单(一)昨日完成的任务,最重要的三件事1.完成45场直播的第7场;2.完成高知团队薪酬分配系列会议;3.完成;(二)未完成事情及原因(三)计划外事情(四)习惯养成:做一个长期主义者1.早起第688天;2.坚持晨跑452天。3.坚持亲子绘本伴读1636天4.坚持写晨间日记375天。5.坚持每天阅读至少1小时209(阅读超过1小时)天:二、周目</div> </li> <li><a href="/article/67.htm" title="jvm调优总结(从基本概念 到 深度优化)" target="_blank">jvm调优总结(从基本概念 到 深度优化)</a> <span class="text-muted">oloz</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a> <div>JVM参数详解:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html   Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 </div> </li> <li><a href="/article/194.htm" title="【Scala十六】Scala核心十:柯里化函数" target="_blank">【Scala十六】Scala核心十:柯里化函数</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>本篇文章重点说明什么是函数柯里化,这个语法现象的背后动机是什么,有什么样的应用场景,以及与部分应用函数(Partial Applied Function)之间的联系   1. 什么是柯里化函数 A way to write functions with multiple parameter lists. For instance def f(x: Int)(y: Int) is a </div> </li> <li><a href="/article/321.htm" title="HashMap" target="_blank">HashMap</a> <span class="text-muted">dalan_123</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>HashMap在java中对很多人来说都是熟的;基于hash表的map接口的非同步实现。允许使用null和null键;同时不能保证元素的顺序;也就是从来都不保证其中的元素的顺序恒久不变。 1、数据结构     在java中,最基本的数据结构无外乎:数组 和 引用(指针),所有的数据结构都可以用这两个来构造,HashMap也不例外,归根到底HashMap就是一个链表散列的数据</div> </li> <li><a href="/article/448.htm" title="Java Swing如何实时刷新JTextArea,以显示刚才加append的内容" target="_blank">Java Swing如何实时刷新JTextArea,以显示刚才加append的内容</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9B%B4%E6%96%B0/1.htm">更新</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a><a class="tag" taget="_blank" href="/search/JTextArea/1.htm">JTextArea</a> <div>在代码中执行完textArea.append("message")后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用textArea.invalidate()和textArea.repaint()。 问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法可以实现</div> </li> <li><a href="/article/575.htm" title="servlet或struts的Action处理ajax请求" target="_blank">servlet或struts的Action处理ajax请求</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>其实处理ajax的请求非常简单,直接看代码就行了: //如果用的是struts //HttpServletResponse response = ServletActionContext.getResponse(); // 设置输出为文字流 response.setContentType("text/plain"); // 设置字符集 res</div> </li> <li><a href="/article/702.htm" title="FineReport的公式编辑框的语法简介" target="_blank">FineReport的公式编辑框的语法简介</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E5%85%AC%E5%BC%8F/1.htm">公式</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a> <div>FINEREPORT用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式。 简单的说下自己感觉的公式要注意的几个地方:   1.if语句语法刚接触感觉比较奇怪,if(条件式子,值1,值2),if可以嵌套,if(条件式子1,值1,if(条件式子2,值2,值3)</div> </li> <li><a href="/article/829.htm" title="linux mysql 数据库乱码的解决办法" target="_blank">linux mysql 数据库乱码的解决办法</a> <span class="text-muted">墙头上一根草</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B9%B1%E7%A0%81/1.htm">数据库乱码</a> <div>linux 上mysql数据库区分大小写的配置 lower_case_table_names=1 1-不区分大小写 0-区分大小写   修改/etc/my.cnf 具体的修改内容如下:   [client] default-character-set=utf8   [mysqld] datadir=/var/lib/mysql socket=/va</div> </li> <li><a href="/article/956.htm" title="我的spring学习笔记6-ApplicationContext实例化的参数兼容思想" target="_blank">我的spring学习笔记6-ApplicationContext实例化的参数兼容思想</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a> <div>ApplicationContext能读取多个Bean定义文件,方法是: ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[]{“bean-config1.xml”,“bean-config2.xml”,“bean-config3.xml”,“bean-config4.xml</div> </li> <li><a href="/article/1083.htm" title="mysql 基准测试之sysbench" target="_blank">mysql 基准测试之sysbench</a> <span class="text-muted">annan211</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/1.htm">基准测试</a><a class="tag" taget="_blank" href="/search/mysql%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/1.htm">mysql基准测试</a><a class="tag" taget="_blank" href="/search/MySQL%E6%B5%8B%E8%AF%95/1.htm">MySQL测试</a><a class="tag" taget="_blank" href="/search/sysbench/1.htm">sysbench</a> <div>1 执行如下命令,安装sysbench-0.5: tar xzvf sysbench-0.5.tar.gz  cd sysbench-0.5  chmod +x autogen.sh  ./autogen.sh  ./configure --with-mysql --with-mysql-includes=/usr/local/mysql</div> </li> <li><a href="/article/1210.htm" title="sql的复杂查询使用案列与技巧" target="_blank">sql的复杂查询使用案列与技巧</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E9%A1%B5/1.htm">数据分页</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%B9%B6%E6%9F%A5%E8%AF%A2/1.htm">合并查询</a> <div>  本片博客使用的数据库表是oracle中的scott用户表;          -------------------  自然连接查询           查询 smith 的上司(两种方法) &</div> </li> <li><a href="/article/1337.htm" title="深入学习Thread类" target="_blank">深入学习Thread类</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>一.             线程的名字 下面来看一下Thread类的name属性,它的类型是String。它其实就是线程的名字。在Thread类中,有String getName()和void setName(String)两个方法用来设置和获取这个属性的值。 同时,Thr</div> </li> <li><a href="/article/1464.htm" title="JSON串转换成Map以及如何转换到对应的数据类型" target="_blank">JSON串转换成Map以及如何转换到对应的数据类型</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/fastjson/1.htm">fastjson</a><a class="tag" taget="_blank" href="/search/net.sf.json/1.htm">net.sf.json</a> <div>        在实际开发中,难免会碰到JSON串转换成Map的情况,下面来看看这方面的实例。另外,由于fastjson只支持JDK1.5及以上版本,因此在JDK1.4的项目中可以采用net.sf.json来处理。 一.fastjson实例 JsonUtil.java package com.study; impor</div> </li> <li><a href="/article/1591.htm" title="【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架" target="_blank">【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>HttpInvoker是Spring原生的RPC调用框架,HttpInvoker同Burlap和Hessian一样,提供了一致的服务Exporter以及客户端的服务代理工厂Bean,这篇文章主要是复制粘贴了Hessian与Spring集成一文,【RPC框架Hessian四】Hessian与Spring集成   在 【RPC框架Hessian二】Hessian 对象序列化和反序列化一文中</div> </li> <li><a href="/article/1718.htm" title="【Mahout二】基于Mahout CBayes算法的20newsgroup的脚本分析" target="_blank">【Mahout二】基于Mahout CBayes算法的20newsgroup的脚本分析</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Mahout/1.htm">Mahout</a> <div>#!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information re</div> </li> <li><a href="/article/1845.htm" title="nginx三种获取用户真实ip的方法" target="_blank">nginx三种获取用户真实ip的方法</a> <span class="text-muted">ronin47</span> <div>随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到<apache获取用户真实IP地址>,如果是后端真实服务器是nginx,那么继续往下看。 实例环境: 用户IP 120.22.11.11 </div> </li> <li><a href="/article/1972.htm" title="java-判断二叉树是不是平衡" target="_blank">java-判断二叉树是不是平衡</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>参考了 http://zhedahht.blog.163.com/blog/static/25411174201142733927831/ 但是用java来实现有一个问题。 由于Java无法像C那样“传递参数的地址,函数返回时能得到参数的值”,唯有新建一个辅助类:AuxClass import ljn.help.*; public class BalancedBTree { </div> </li> <li><a href="/article/2099.htm" title="BeanUtils.copyProperties VS PropertyUtils.copyProperties" target="_blank">BeanUtils.copyProperties VS PropertyUtils.copyProperties</a> <span class="text-muted">诸葛不亮</span> <a class="tag" taget="_blank" href="/search/PropertyUtils/1.htm">PropertyUtils</a><a class="tag" taget="_blank" href="/search/BeanUtils/1.htm">BeanUtils</a> <div> BeanUtils.copyProperties VS  PropertyUtils.copyProperties  作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然;比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bean时,没有考虑到会将null转换为0,而后面的业</div> </li> <li><a href="/article/2226.htm" title="[金融与信息安全]最简单的数据结构最安全" target="_blank">[金融与信息安全]最简单的数据结构最安全</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>       现在最流行的数据库的数据存储文件都具有复杂的文件头格式,用操作系统的记事本软件是无法正常浏览的,这样的情况会有什么问题呢?        从信息安全的角度来看,如果我们数据库系统仅仅把这种格式的数据文件做异地备份,如果相同版本的所有数据库管理系统都同时被攻击,那么</div> </li> <li><a href="/article/2353.htm" title="vi区段删除" target="_blank">vi区段删除</a> <span class="text-muted">Cwind</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/vi/1.htm">vi</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E6%AE%B5%E5%88%A0%E9%99%A4/1.htm">区段删除</a> <div>区段删除是编辑和分析一些冗长的配置文件或日志文件时比较常用的操作。简记下vi区段删除要点备忘。   vi概述    引文中并未将末行模式单独列为一种模式。单不单列并不重要,能区分命令模式与末行模式即可。   vi区段删除步骤: 1. 在末行模式下使用:set nu显示行号 非必须,随光标移动vi右下角也会显示行号,能够正确找到并记录删除开始行</div> </li> <li><a href="/article/2480.htm" title="清除tomcat缓存的方法总结" target="_blank">清除tomcat缓存的方法总结</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>用tomcat容器,大家可能会发现这样的问题,修改jsp文件后,但用IE打开 依然是以前的Jsp的页面。 出现这种现象的原因主要是tomcat缓存的原因。 解决办法如下: 在jsp文件头加上 <meta http-equiv="Expires" content="0"> <meta http-equiv="kiben&qu</div> </li> <li><a href="/article/2607.htm" title="不要盲目的在项目中使用LESS CSS" target="_blank">不要盲目的在项目中使用LESS CSS</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/less/1.htm">less</a> <div> 如果你还不知道LESS CSS是什么东西,可以看一下这篇文章,是我一朋友写给新人看的《CSS——LESS》   不可否认,LESS CSS是个强大的工具,它弥补了css没有变量、无法运算等一些“先天缺陷”,但它似乎给我一种错觉,就是为了功能而实现功能。   比如它的引用功能 ? .rounded_corners{     </div> </li> <li><a href="/article/2734.htm" title="[入门]更上一层楼" target="_blank">[入门]更上一层楼</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/yii2/1.htm">yii2</a> <div>更上一层楼 通篇阅读完整个“入门”部分,你就完成了一个完整 Yii 应用的创建。在此过程中你学到了如何实现一些常用功能,例如通过 HTML 表单从用户那获取数据,从数据库中获取数据并以分页形式显示。你还学到了如何通过 Gii 去自动生成代码。使用 Gii 生成代码把 Web 开发中多数繁杂的过程转化为仅仅填写几个表单就行。 本章将介绍一些有助于更好使用 Yii 的资源: </div> </li> <li><a href="/article/2861.htm" title="Apache HttpClient使用详解" target="_blank">Apache HttpClient使用详解</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a><a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a> <div>Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会</div> </li> <li><a href="/article/2988.htm" title="zxing二维码扫描功能" target="_blank">zxing二维码扫描功能</a> <span class="text-muted">gundumw100</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/zxing/1.htm">zxing</a> <div>经常要用到二维码扫描功能 现给出示例代码 import com.google.zxing.WriterException; import com.zxing.activity.CaptureActivity; import com.zxing.encoding.EncodingHandler; import android.app.Activity; import an</div> </li> <li><a href="/article/3115.htm" title="纯HTML+CSS带说明的黄色导航菜单" target="_blank">纯HTML+CSS带说明的黄色导航菜单</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a> <div>HoverTree带说明的CSS菜单:纯HTML+CSS结构链接带说明的黄色导航   在线体验效果:http://hovertree.com/texiao/css/1.htm代码如下,保存到HTML文件可以看到效果:   <!DOCTYPE html > <html > <head> <title>HoverTree</div> </li> <li><a href="/article/3242.htm" title="fastjson初始化对性能的影响" target="_blank">fastjson初始化对性能的影响</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/fastjson/1.htm">fastjson</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">序列化</a> <div>之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营。对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快。。。   网上的说法:   fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 </div> </li> <li><a href="/article/3369.htm" title="基于Mybatis封装的增删改查实现通用自动化sql" target="_blank">基于Mybatis封装的增删改查实现通用自动化sql</a> <span class="text-muted">mengqingyu</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a> <div>1.基于map或javaBean的增删改查可实现不写dao接口和实现类以及xml,有效的提高开发速度。 2.支持自定义注解包括主键生成、列重复验证、列名、表名等 3.支持批量插入、批量更新、批量删除 <bean id="dynamicSqlSessionTemplate" class="com.mqy.mybatis.support.Dynamic</div> </li> <li><a href="/article/3496.htm" title="js控制input输入框的方法封装(数字,中文,字母,浮点数等)" target="_blank">js控制input输入框的方法封装(数字,中文,字母,浮点数等)</a> <span class="text-muted">qifeifei</span> <a class="tag" taget="_blank" href="/search/javascript+js/1.htm">javascript js</a> <div>在项目开发的时候,经常有一些输入框,控制输入的格式,而不是等输入好了再去检查格式,格式错了就报错,体验不好。 /** 数字,中文,字母,浮点数(+/-/.) 类型输入限制,只要在input标签上加上 jInput="number,chinese,alphabet,floating" 备注:floating属性只能单独用*/     funct</div> </li> <li><a href="/article/3623.htm" title="java 计时器应用" target="_blank">java 计时器应用</a> <span class="text-muted">tangqi609567707</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a> <div>mport java.util.TimerTask;   import java.util.Calendar;   public class MyTask extends TimerTask {        private static final int </div> </li> <li><a href="/article/3750.htm" title="erlang输出调用栈信息" target="_blank">erlang输出调用栈信息</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a> <div>在erlang otp的开发中,如果调用第三方的应用,会有有些错误会不打印栈信息,因为有可能第三方应用会catch然后输出自己的错误信息,所以对排查bug有很大的阻碍,这样就要求我们自己打印调用的栈信息。用这个函数:erlang:process_display (self (), backtrace).需要注意这个函数只会输出到标准错误输出。 也可以用这个函数:erlang:get_s</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>