(转贴)如何防止IE缓存jsp文件

如何防止IE缓存jsp文件

[ 繁?中文 ] | 文章类别:JSP技巧 | 文章等级:  | 发表日期:2001-1-10  星期三

[ 计数器 | 精彩博客 | 魔法表情 | 博客申请 | 源码下载 | IP查询 | 投票调查 | Html2Js ]

--------------------------------------------------------------------------------

 

转自:动态网制作指南 www.knowsky.com1, 使用java提供的方法,在jsp或者servlet中都可以

<%

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);

%>

2, 使用HTML标记,如下面:

<HEAD>

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">

<META HTTP-EQUIV="Expires" CONTENT="0">

</HEAD> 

HttpServletRequest的一些方法

配置tomcat5.0的端口为:80,应用的context path="",应用结果如下:

  System.out.println("request url is: " + request.getRequestURI()); (Returns the part of this request's URL from the protocol name up to the query string in the first line of the HTTP request.)

  System.out.println("PathInfo is: " + request.getPathInfo());

  System.out.println("getQueryString is: " + request.getQueryString());

  System.out.println("getPathTranslated()is: " + request.getPathTranslated());

  System.out.println("getServletPath()  is: " + request.getServletPath()); (Returns the part of this request's URL that calls the servlet. This includes either the servlet name or a path to the servlet, but does not include any extra path information or a query string.在Struts中的有关配置:web.xml中:

    <servlet-name>action</servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

  <servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

  </servlet-mapping>

)

分别得到下面的结果:

request url is: /disGoalContentAction.do

PathInfo is: null

getQueryString is: goalID=619&naviStr=a10

getPathTranslated()is: null

getServletPath()  is: /disGoalContentAction.do

配置tomcat5.0的端口为:8080,应用的context path="/learndiary",应用结果如下:

request url is: /learndiary/disGoalContentAction.do

PathInfo is: null

getQueryString is: goalID=313&naviStr=a10

getPathTranslated()is: null

getServletPath()  is: /disGoalContentAction.do

从下面的网址可以得到一些有关request header的知识

http://web-sniffer.net/?url=http%3A%2F%2Fwww.learndiary.com%2FdisDiaryContentAction.do%3FsearchDiaryID%3D%26goalID%3D1219%26naviStr%3Da10a21105&submit=Submit&http=1.1&gzip=yes&type=GET&ua=Mozilla%2F4.0+%28compatible%3B+MSIE+6.0%3B+Windows+NT+5.0%3B+.NET+CLR+1.1.4322%29+Web-Sniffer%2F1.0.22

HttpSession中isNew() 和 invalidate()的用法

  isNew()是指是否一个新创的session,当用户访问一个支持session的jsp网页时,session被创建,尽管有时session里面并没有任何东西。

  invalidate()是指清空session对象里的东西,并不指清除这个session对象本身。

  所以,要判断一个session里面是否存在自己想要的东西(这个session是否有效),是不能用isNew()的,应该用UserInfo userInfo=(UserInfo)session.getAttribute("USERINFO");if (userInfo!=null)之类的来判断。

jsp最佳实践系列文章(IBM技术文库)

  今天前面两篇介绍jsp的日记实际均源自Java“知名人士”Brett McLaughlin 介绍jsp应用的系列文章,这里把网址收集在这里,有空的时候可以好好的来欣赏一下。顺便练习一下英语阅读能力。

  网址:http://www-128.ibm.com/developerworks/views/java/libraryview.jsp?search_by=JSP%20best%20practices:

  我的前两篇引用这里面文章的日记的地址:

  1、http://www.learndiary.com/disDiaryContentAction.do?goalID=1140

  2、http://www.learndiary.com/disDiaryContentAction.do?goalID=1141

问题:中“flush”的作用?缓冲区?

  这是一篇介绍用 jsp:include 控制动态内容的文章,但是,我对其中的“flush”参数的作用不清楚?以后可以慢慢解决。

 

  用 jsp:include 控制动态内容

 

  JSP 最佳实践:用 jsp:include 控制动态内容 英文原文

用于构建动态网站的简单 JSP 标记

级别:初级

Brett McLaughlin(brett@oreilly.com)

作家,O'Reilly and Associates

2003 年 7 月

本文是 Java“知情人士”Brett McLaughlin 继第一篇 JSP 最佳实践文章后的后续文章,在文中,作者向您演示了如何扩展 JSP 技术中用于动态内容的包含功能。了解静态 include 伪指令和动态 jsp:include 元素之间的差异,搞清楚如何混合搭配这二者以获取最优性能。

在新的 JSP 最佳实践系列的前一篇文章中,您了解了如何使用 JSP include 伪指令将诸如页眉、页脚和导航组件之类的静态内容包含到 Web 页面中。和服务器端包含一样,JSP include 伪指令允许某个页面从另一个页面提取内容或数据。清单 1 重温了 include 伪指令。

清单 1. JSP include 伪指令

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

<title>newInstance.com</title>

<meta http-equiv="Content-Type"

content="text/html; charset=iso-8859-1" />

<link href="/styles/default.css"

rel="stylesheet" type="text/css" />

</head>

<body>

<%@ include file="header.jsp" %>

<%@ include file="navigation.jsp" %>

<%@ include file="bookshelf.jsp" %>

<%@ include file="/mt-blogs/index.jsp" %>

<%@ include file="footer.jsp" %>

</body>

</html>

]]>

您需要什么

本系列中的所有最佳实践都基于 JavaServer Pages 技术。要运行其中的任何最佳实践,都需要在您的本地机器或测试服务器上安装符合 JSP 技术的 Web 容器。您还需要使用文本编辑器或 IDE 来对 JSP 页面编码。

虽然 include 非常适于将静态内容并入 Web 页面,但对于动态内容却不尽如人意。我们在前一篇文章中在试图重新装入高速缓存文件时发现了这一问题。与大多数页眉文件及页脚文件不同,动态内容变化频繁,必须时刻更新。我们将首先扼要地重述一下 include 伪指令的局限性,然后我将向您演示如何用 jsp:include 标记来扩展 JSP 的包含能力。

高速缓存问题

JSP include 伪指令的不足之处有一个是:它会导致 Web 浏览器高速缓存所有页面。在处理诸如页脚、版权声明或一组静态链接之类的静态组件时,这是有意义的。这些文件不会改变,因此没有理由让 JSP 解释器不断地重新轮询其中的数据。凡是可能的地方,都应该实现高速缓存,因为它改善了应用程序的性能。

JSP 测试和开发

在构建 Web 应用程序或网站时,可能需要大量更新页眉、页脚和导航链接。仅仅为了看到对所包含文件所做的更改,而被迫不断地关闭浏览器或清除其高速缓存,这可能是件痛苦的事情。另一方面,为了结束开发周期,而不得不彻底检查一遍并修改数百个使用了 include 伪指令的页面,这也是一件痛苦的事情。我的建议是,在测试期间禁用浏览器高速缓存。在大多数情形下,这样做能够彻底解决问题。也有极少数情形,这样做并不奏效,这时可以在浏览器或服务器上不断地重新启动 Web 容器来确保不进行高速缓存。

但是,有时侯,进行高速缓存会得不偿失。如果提入的内容来自使用动态数据(如 Weblog 或数据库驱动的 JSP 文件)的程序,甚至如果所包含的内容是经常变化的 HTML(如时间戳记),那么每当装入 Web 页面时,都需要显示这些文件或程序的最新版本。遗憾的是,JSP include 伪指令并不具备这一功能。在测试和开发周期(请参阅侧栏“JSP 测试和开发”)中,在浏览器中禁用高速缓存通常能够解决这一问题。但是,对于实际使用的应用程序而言,性能是任何设计决策过程中的一项重要因素,禁用高速缓存并不是一种可行的长远之计。更好的解决方案是使用 jsp:include 标记。

jsp:include 标记

jsp:include 只不过是一个不同于 include 的伪指令而已。jsp:include 的优点在于:它总是会检查所含文件中的变化。过一会儿我们将研究这一新标记的工作方式。但首先看一下两种 include 各自的代码,以便能够看到二者之间的异同。

清单 2 显示了一个简单页面,它使用了原始的 JSP include 伪指令。

清单 2. JSP include 伪指令

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

<title>JSP include element test</title>

</head>

<body>

This content is statically in the main JSP file.<br />

<%@ include file="included.html" %>

</body>

</html>

]]>

清单 3 是同一个页面,只不过这里转成使用 jsp:include 标记。

清单 3. 转成使用 jsp:include

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

<title>JSP include element test</title>

</head>

<body>

This content is statically in the main JSP file.<br />

<jsp:include page="included.html" flush="true" />

</body>

</html>

]]>

您应该注意这两种代码类型之间的两大区别。首先,jsp:include 元素不使用属于 include 伪指令的 %@ 语法。实际上,jsp 前缀让 JSP 编译器知道:它应该寻找标准 JSP 标记集中的元素。其次,指定要包含的文件的属性从 file 变成了 page。如果愿意,可以自己测试一下新标记的结果。只需更改上一篇文章(请参阅参考资料)中 included.html 文件的内容,然后重新装入浏览器页面,就会立即看到新内容。

flush 属性

您可能已注意到 jsp:include 代码示例中的 flush 属性。顾名思义,flush 指示在读入包含内容之前是否清空任何现有的缓冲区。JSP 1.1 中需要 flush 属性,因此,如果代码中不用它,会得到一个错误。但是,在 JSP 1.2 中,flush 属性缺省为 false。由于清空大多数时候不是一个重要的问题,因此,我的建议是:对于 JSP 1.1,将 flush 设置为 true;而对于 JSP 1.2 及更高版本,将其设置为关闭。

jsp:include 是如何工作的

如果您有点爱刨根问底,那么可能十分想知道 jsp:include 标记的行为为什么与 include 伪指令不同。道理其实十分简单:jsp:include 包含的是所包含 URI 的响应,而不是 URI 本身。这意味着:对所指出的 URI 进行解释,因而包含的是生成的响应。如果页面是 HTML,那么将得到一点也没有变化的 HTML。但是,如果是 Perl 脚本、Java servlet 或者 CGI 程序,那么得到的将是从该程序解释而得的结果。虽然页面通常就是 HTML,但实际程序恰好是达到目的的手段。而且,由于每次请求页面的时候都会进行解释,因此从来不会象使用 include 伪指令时那样高速缓存结果。虽然这只是很小的变动,但它却导致了您所见到的行为中的全部差异。

一种混合搭配的解决方案

include 伪指令在某些网站上有其用武之地。例如,如果站点包含一些(如果有变化,也很少)几乎没有变化的页眉、页脚和导航文件,那么基本的 include 伪指令是这些组件的最佳选项。由于 include 伪指令采用了高速缓存,因此只需放入包含文件一次,其内容就会被高速缓存,其结果会是极大地提高了站点的性能。

然而,对于现在许多 Web 应用程序或站点而言,地毯式的高速缓存并不能解决问题。虽然页眉和页脚可能是静态的,但是不可能整个站点都是静态的。例如,从数据库提取导航链接是很常见的,并且许多基于 JSP 技术的站点还从其它站点或应用程序上的动态 JSP 页面提取内容。如果正在处理动态内容,那么需要采用 jsp:include 来处理该内容。

当然,最好的解决方案是经常把这两种方法混合搭配使用,将每种构造用到最恰当的地方。清单 4 是混合搭配包含解决方案的一个示例。

清单 4. 混合搭配解决方案

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

<title>newInstance.com</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<link href="/styles/default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<jsp:include page="header.jsp" flush="true">

<jsp:param name="pageTitle" value="newInstance.com"/>

<jsp:param name="pageSlogan" value=" " />

</jsp:include>

<%@ include file="/navigation.jsp" %>

<jsp:include page="bookshelf.jsp" flush="true" />

<jsp:include page="/mt-blogs/index.jsp" flush="true" />

<%@ include file="/footer.jsp" %>

</body>

</html>

]]>

上面的代码显示了前一篇文章中的示例索引页面。导航链接和页脚是静态内容,一年最多更改一次。对于这些文件,我使用了 include 伪指令。内容窗格包含 Weblog 和“bookshelf”组件,它们是动态生成的。这两个组件需要一直更新,因此对它们,我使用了 jsp:include 标记。header.jsp 文件有点奇怪。这个组件是从另一个本质上是静态的 JSP 页面提取的。但是,正如您将注意到的那样,它从包含页提取页“标语”,然后将它显示出来。要处理这一共享信息,我们必须向页眉文件传入参数。而要处理那些参数,就必须使用 jsp:include 元素。

如果您想了解有关那些参数的内容,请放心,后续文章不久就将能满足您的需要。在下一篇文章中,我将解释 JSP 参数以及它们是如何与 JavaBeans 组件交互的。届时,我们网上见。

 

jsp页面间传递参数(转自网络)

  我想在几个jsp页面间接力传递一个LinkedList参数,这个参数在经过不同的页面时会发生变化。我在网络上发现了实现这种应用的两种方法,特地把它贴在这里备忘:

  第一种方法,使用jsp内置的Session对象来传递:(转自:http://www.7880.com/Info/Article-4616cf60.html)

JSP学习笔记(六)-----在多个JSP页面之间传递参数【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2005-02-20 人气:4084 出处:CSDN

 

1.       怎么在多个JSP页面之间进行参数传递?需要使用JSP的内置作用域对象session。利用它的两个方法setAttribute(),getAttribute()

2.       下面的这个实例实现了把第一个JSP页面的参数传递给第三个页面的功能

3.       代码如下:1.jsp

<html>

       <form method=get action=2.jsp>

       what's your name<input type=text name=username>

       <input type=submit value=submit>

       </form>

</html>

 

4.       2.jsp

<html>

      

       <form method=post action="3.jsp?pass=11">

       <%

              String name=request.getParameter("username");

              session.setAttribute("username",name);

       %>

       Your name is:<%=request.getParameter("username")%>

       <br>what's your hobby<input type=text name=hobby>

       <input type=submit value=submit>

       </form>

</html>

 

5.       3.jsp

<html>

       your name is:<%=session.getAttribute("username")%>

       <br>

       your hobby is:<%=request.getParameter("hobby")%>

       <br>

       your password is:<%=request.getParameter("pass")%>

       <br>

       </form>

</html>

   第二种方法,利用JavaBean和JSP技术在Web页面中保存和传递数据,(转自:http://www.cnblogs.com/bjzhanghao/archive/2004/08/07/30950.html)

[翻译]JavaBean组件与JSP技术结合

Web架构师Brett McLaughlin向我们展示了怎样利用JavaBean和JSP技术在Web页面中保存和传递数据,以及如何设计可以得到更大的灵活性。

到目前为止,在JSP最佳实践系列里,我们已经讨论了相当一部分基础知识。在前面的两个章节里,你应该学会了如何使用JSP的include机制将网站以外的内容包含在页面或应用程序里。共有两种不同类型的include:静态的include命令和动态的jsp:include标记。

同时,我们还没有涉及到在父页面(在我们的例子中是网站的首页)和被包含内容之间的通信问题。而实际上这种情况是非常普遍的。当你开始建立一个真正的网站或者web应用程序时,通常你会需要这样的通讯机制,举个例子,你的网站可能会在首页产生一些标题一类的小段文字,这些文字要出现在页眉或页脚页面中。在这一部分里,你将学到如何在页面间传递数据,以及如何在被包含的页面中使用这些数据。

注:这部分的全部例子都基于JavaServer Pages技术,为了能运行它们,你需要建立一个JSP兼容的web容器,在你本地计算机或某个用于测试的服务器上都可以。同时,你还要有一个文本编辑器或者集成环境来编写你的JSP页面。

用于保存数据的JavaBean

让我们假想这样的一个网站,在这个网站里每个页面有一小句“口号”(例如“书:装满知识的容器”或者“唱片:值得一听”)和一个标题。父页面(有时也被称作主页面)决定了每一页的口号,但真正产生html输出这个口号的是页眉页面,它是被包含的。要实现这个目的,父页面必须能够把口号传递给页眉页面,页眉页面得到这个口号,将它以页面标题的形式输出。

首先我们需要某种对象来保存被传递的数据,恰好(这并非偶然)JavaBean组件就是这样一个合适的选择,它与JSP技术配合得天衣无缝,简单的使用取值方法和赋值方法就可以控制你要的数据。稍有java编程经验的读者可能已经想到,get()就是一个取值方法,因为它读取数据;而set()是一个赋值方法,因为它改变数据。

列表1展示了我们所需要的一个JavaBean的代码,PageHeaderinfo包含了网站页眉信息。

<![CDATA[

package com.newInstance.site.beans;

import java.io.Serializable;

public class PageHeaderInfo implements Serializable {

     /** The title of the page */

     private String pageTitle;

     /** The slogan of the page */

     private String pageSlogan;

     public String getPageTitle() {

       return pageTitle;

     }

     public void setPageTitle(String pageTitle) {

       this.pageTitle = pageTitle;

     }

     public String getPageSlogan() {

       return pageSlogan;

     }

     public void setPageSlogan(String pageSlogan) {

       this.pageSlogan = pageSlogan;

     }

}

]]>

作为第一个练习,将这个文件保存为PageHeaderInfo.java并编译它。接下来,把得到的class文件PageHeaderInfo.class放在你的web应用程序的WEB-INF/classes目录下。请确保目录包含了包的结构,例如:

$<TOMCAT-ROOT>/webapps/$<WEB-APP-NAME>/WEB-INF/classes/com/newInstance/  site/beans/PageHeaderInfo.class

你可以使用类似这样的路径安排web应用程序中用到的类。按以上步骤做到这里,下面就可以向PageHeaderInfo里存入数据然后在不同的JSP页面中获取了。

传递已保存的数据

在我们的网站里,页眉页面包含向不同页面传递不同口号的代码。查看前面的章节就会发现,页眉页面(header.jsp)是通过jsp:include标记被包含的文件。列表2展示了网站首页如何通过标记把数据传递给header.jsp文件。

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

     <title>newInstance.com</title>

     <meta http-equiv="Content-Type"

       content="text/html; charset=iso-8859-1" />

     <link href="/styles/default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<jsp:include page="header.jsp" flush="true">

     <jsp:param name="pageTitle" value="newInstance.com"/>

     <jsp:param name="pageSlogan"

       value="Java and XML :: Turning theory into practice" />

</jsp:include>

<%@ include file="/navigation.jsp" %>

<jsp:include page="bookshelf.jsp" flush="true" />

<jsp:include page="/mt-blogs/index.jsp" flush="true" />

<%@ include file="/footer.jsp" %>

</body>

</html>

]]>

可以看出,标题是被传递过去作为口号的。

你可能已经注意到了,在你建立页面的时候,不一定需要JavaBean组件实际存在。我总是先写好JavaBean,有一个很好的理由:JSP参数名必须与JavaBean属性名匹配,先完成JavaBean可以保证你在编写JSP页面时使用合适的参数名称。

获得数据

当你完成了JSP参数和JavaBean属性的编码,一旦数据被传递给header.jsp,这个页面就可以开始获取数据了。列表3展示了header.jsp页面。它的大部分内容是html,请注意里面的JSP脚本,在你研究过这些代码后我会在后面向你解释。

<![CDATA[

<!-- Begin header section -->

<%@ page language="java" contentType="text/html" %>

<jsp:useBean id="pageHeaderInfo"

class="com.newInstance.site.beans.PageHeaderInfo">

     <jsp:setProperty name="pageHeaderInfo" property="*" />

</jsp:useBean>

<table width="100%" border="0" cellspacing="0" cellpadding="0">

     <tr>

       <td width="91" height="50" align="right" valign="top"

           bgcolor="#330066"><font color="#FFFFFF"><img

           src="/images/header-lions.gif"

           width="90" height="60"></font></td>

       <td colspan="3" align="left" valign="top"

           bgcolor="#000000"><table width="100%" height="60" border="0"

           cellpadding="0" cellspacing="0">

           <tr>

             <td width="261" rowspan="2"><img

               src="/images/header-title.gif" width="261" height="60"></td>

             <td class="pagetitle" width="249" height="55" align="right"

               valign="bottom"><jsp:getProperty name="pageHeaderInfo"

               property="pageSlogan"/></td>

             <td width="10" height="55"> </td>

           </tr>

           <tr>

             <td height="5"><img src="/images/spacer.gif" width="1"

               height="5"></td>

             <td height="5"><img src="/images/spacer.gif" width="1"

               height="5"></td>

           </tr>

         </table></td>

       <td width="141" bgcolor="#000000">

         <font color="#FFFFFF"> </font>

       </td>

     </tr>

<!-- End header section -->

]]>

第一行代码标识了该页面为一个JSP页面,然后通过jsp:useBean标记声明需要访问PageHeaderInfo这个JavaBean,id属性为这个bean指定了一个名称,通过该名称可以在JSP页面中使用bean;class属性指定了JavaBean类的全名。相邻的jsp:setProperty标记说明了JavaBean(通过id属性标识)的所有属性都以请求数据赋值,也就是说,为这个bean里的每个属性(例如pagetitle和pageslogan)寻找名称对应的请求参数来赋值。这些请求参数可以来自客户端的浏览器,也可以来自包含这一页的其他JSP页面。在这种情况下,唯一的请求数据是由父页面创建的。对于我们的网站,首页(index.jsp)发送pagetitle和pageslogan,其值分别为“newinstance.com”和“Java and XML: Turning theory into practice”。

一旦bean的属性被赋值后,页面就可以使用这些数据了。对于header.jsp,在后面的代码里可以看到,通过jsp:getProperty标记使用了这些数据。Jsp;getProperty标记通过name参数标识从哪个对象取数据,通过property参数标识取对象的哪一个属性。取得的数据值自动插入到页面的输出,也就是输出到父页面里,从而得到一个无缝的、动态的页面口号,在JSP页面间传递数据就是这么简单!你可以为一个JSP页面增加任意多的bean,每一个bean都可以有任意多的属性,足以应付任何复杂的请求数据。

处理需求变化

改变是软件开发者最大的烦恼,你写好了你的bean,在JSP页面里也写好了使用它们的代码,这时web应用程序的需求似乎不可避免的会发生变化。如果这个改变要求更多的属性(大多数情况都是如此),你不得不改写你的JavaBean源代码,重新编译它,还要确定JSP页面能够正确访问新生成的bean类。有些情况下,你可以不必对bean进行处理,如果保存或获取属性页面不再使用了(也就是说,即使那个页面还在站点的目录里,但你不再使用该页面),这时你可以不用去管原来的代码即可。实际上,我就遇到过这种情况!

我的个人网站的页眉页面header.jsp用于生成html的头部,以前有一段时间里,这一页向我的其他页面头部里的title标记里插入一个标题,后来我做了修改,在header.jsp里不再使用页面标题了。但我并没有从PageHeaderInfo里把pageTitle移除;实际上,我甚至在大部分JSP页面里连jsp:param标记都没有移除,这个标记的作用本来是为页面设置标题的。我认为花这些工夫不值得,因为我确信保留这些数据不会带来任何坏的影响(也许某一天我还会重新用到呢!)。因此,如果你遇到同样的情况,不用浪费时间了--有处理这些琐事的时间不如用来为你的web应用程序增加些新的、有趣的、实用的功能。

下一次

当你熟练掌握了在JSP页面间传递数据的方法后,试着自己写一些有用的JavaBean并且看看能不能把它们用在你的站点里。通过和这些bean的接触,还有jsp:useBean、jsp:param以及jsp:get/setProperty的使用,你应该能够做出一些很酷的功能了!在下次的最佳实践里,我将向你展示使用JSP向站点增加外部内容的方法,JSTL标记和我们熟悉的include标记差不多,它使得JSP更灵活和更高效。在这之前,请用功准备,到时再见!

(这篇文章是一年前翻译的,当时想找翻译的活做,也是未果。请参考英文原文。)

posted on 2004-08-07 10:40 八进制 阅读(935) 评论(1)  编辑 收藏 收藏至365Key

 

(转帖)用JSTL实现JSP应用程序快速开发 作者

转帖者注:由于本站留言板只有管理员才能查看,且没有明确的说明这个限制。致使hard在留言板中提交的这篇文章不能被大家看见,真是对不起。我会在留言板上明确标明这个限制。以后的留言板也许会作一些改进。

以下是hard提交文章的正文。

标题: 用JSTL实现JSP应用程序快速开发  作者: hard  创建时间: 2005-09-03 11:03:27  删除 

内容

在这篇文章中,我将为大家介绍一种基于JSP且灵活有趣的技术,那就是JSTL.JSTL全称为Java Server Pages Standard Tag Library.虽然JSP已经变的非常流行,但JSTL在基于SQL数据库的简单、快速的前后台开发中还是没有被广泛的应用。一旦你了解了JSTL,你就会了解到它的优点,并发现在你作为程序员的日常工作中,它已经被应用到了很多方面。我这里假设你已经熟悉HTML,能理解基本的SQL语句,和Jsp的基础知识。因为下面的内容要涉及到这些知识。

  JSTL是一个已经被标准化的标记库集合,她支持迭代、条件、XML文档的解析,国际化,和利用SQL与数据库交互的功能。起初,JSTL规范一直由JCP(Java Community process program)组织下的JSR #52 发展完善,"JCP肩负着Java 技术发展的重任"--官方网站这样评价。JCP作为一个开放性的组织,他同时吸收正式的会员和非正式会员.JCP对于Java技术规范的形成与发展发挥了重要的主导作用。JSTL主要包括四个基本部分的标记库:Core,XML,国际化,和对SQL的支持。由于这篇文章的主要是以其中的SQL部分的应用来快速了解JSTL,所以我们这篇文章只介绍了 Core和SQl标签库的一些基本功能。

  这项技术简单而且功能强大,足以和PHP、ColdFusion一较高下.他在拓展Java的应用领域方面有足够的能力,这些领域不只包括大型的可再升级的Web应用程序,对于仅拥有简单主页的Web程序一样没问题。这允许你在建立站点的时候可以避免那些经常考虑的XML的集成和与数据库的连接。正如我刚才提到的一样,JSTL的关键点就是简单易用。还有,那就是JSTL是基于JSP构建的, 他允许我们使用所有的Java技术,这一点我们有必要记住。

  开始之前,我们需要弄清楚怎样才能运行JSTL.由于是基于JSP技术的,所以我们运行它就需要一个能够编译JSP的容器,这里我们使用免费的JSP容器:TOMCAT(http://jakarta.apache.org/tomcat/index.html).至于如何安装这个产品已经超出了本文所讲述的范围。毫无疑问,这个软件产品现在已经很普及了,而且关于如何安装的文档资料也是很多。这里假设您已经安装并成功配置了这个容器,你只需再安装JSTL运行所需文件即可,它可以从这里下载http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html你不需要真正的安装它,只需要将其中的.JAR文件包含到你的应用程序的WEB-INF/lib目录下即可,稍后我会具体说到该怎么做.

  因为我们要在一个支持标准SQL的数据库上运行程序,你需要在你的电脑上安装有一个数据库。数据库的类型有许多种,这里我选择了MySql。我之所以选择他的原因在于首先,我们需要展示JSTL对于构造简单快速的应用程序领域所起的作用,同时能和一直在这个领域处于主导地位的PHP+MySql有所比较;第二点那就是MySql是可以免费下载并包含有一个针对JAVA的JDBC驱动.总之,为了使用下面的例子,你需要下载一个MYSQL服务器(http://www.mysql.com/products/mysql/index.html; MySql Connector/J JDBC驱动程序http://www.mysql.com/products/connector-j/index.html;还有就是MySql control center http://www.mysql.com/products/connector-j/index.html),这个产品可以让你非常容易的操作管理Mysql数据库文件。全部下载完成后,你需要安装mysql和mysql Control Center。另外还有就是mysql的JDBC驱动需要放到你的web应用程序中的/Web-INF/lib目录中。

  在创建程序代码之前,你需要创建并填写数据库表。关于这方面的主题文章也相当广泛,具体如何操作超出了本文的范围。这里我推荐给你我们上面提及的一个可视化的管理工具 MySQL Control Center.你可以用他来创建一个用来运行程序的测试用户,数据库以及创建一个测试表,并填写若干记录。关于登陆名及密码 数据库名称这些配置环境参数,你应该记住他们,稍后需要应用到我们的代码中。

  现在,你就可以准备创建自己的第一个JSTL应用程序了它需要我们做下面一些事情:

  整个实例程序代码包括两个文件Hello.jsp和 Continue.jsp

  Hello.jsp文件允许你输入数据库名称、登陆名称、登陆密码、数据库表名。Continue.jsp:接受Hello.jsp中的数据信息并且连接数据库,并对数据库中的表执行一个Select请求.

  下面是这个系统所有的代码文件,我将逐一进行解释。这些代码相当简单,对于代码的结构,我相信你即使没有我的解释你也能理解的.

1: <!-- Hello.jsp -->

2: <html>

3: <head>

4: <title>Hello</title>

5: </head>

6: <body bgcolor="#ffffff">

7: <h1>Please, enter all necessary information and click OK.</h1>

8: <form method="post" action="Continue.jsp">

9: <br>Your login to database:

<input type="text" name="login" size="15">

10: <br>Your password to database:

<input type="password" name="password" size="15">

11: <br>Your database name:

<input type="text" name="database" size="15">

12: <br>Your database table:

<input type="text" name="table" size="15">

13: <br><br><input type="submit" name="submit" value=" OK ">

14: </form>

15: </body>

16: </html>

  (请注意文本左侧的数字只是为你提供一些标记信息,你不需要将他们输入到你的代码文件中。)

  上面就是所有Hello.jsp的源代码,很惊奇吧,他仅仅是纯粹的HTML代码,就这么简单,我想应该没有注释的必要了.我之所以将这些代码片段包含进文章中就是为了展示一下JSTL集成到那些需要快速扩充额外功能的HTML站点中是多么的简单.让我再为你展示一下Continue.jsp的全部代码,看过之后,你就会对 JSTL有些了解了。

1: <!-- Continue.jsp -->

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

3: <@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>

4: <c:set var="h" value="localhost"/>

5: <c:set var="l" value="${param.login}"/>

6: <c:set var="p" value="${param.password}"/>

7: <c:set var="d" value="${param.database}"/>

8: <c:set var="t" value="${param.table}"/>

9: <html>

10: <head>

11: <title>Continue</title>

12: </head>

13: <body bgcolor="#ffffff">

14: <sql:setDataSource driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://${l}/${d}?user=${u}&password=${p}"/>

15: <sql:query var="result">

16: SELECT * FROM <c:out value="${t}"/>

17: </sql:query>

18: <c:forEach var="row" items="${result.rowsByIndex}">

19: <c:out value="${row[0]}"/> <br>

20: </c:forEach>

21: </body>

22: </html>

(请注意文本左侧的数字只是为你提供一些标记信息,你不需要将他们输入到你的代码文件中。)

  这就是我们所有的代码了,是不是非常不错?现在我门来解释一下上面这些代码的作用。

  行1 是 HTML 的注释说明。

  行2--3 这些 JSP 标签是为了引用外部的 标签库,更确切的说这里是引用了JSTL库中的 Core 和SQL标签库部分。我们为他们都设置了前缀名称,以便于我们通过这些前缀名称访问被引入的标签库中的功能方法。

  行4---8正如 Hello.jsp 真正运行的样子,他将请求continue.jsp,Continue.jsp获得请求后就需要得到并解析来自Hello.jsp的若干变量,我们使用了这样的方式${param.YOUR_VAR}。在第4行<c:set标签,将变量${h}设置为 "localhost",第五行变量${l}将获取我们在 Hello.jsp中的login文本域中输入的信息,第6,7,8行的变量将分别获得来自Hello.jsp中用户所输入的密码,数据库名称,数据表名称。

  行9--13是一些我经常用来常见HTML网页头的简单的HTML标签,马上,重要的功能马上要到了。

  行14,我们试图用我们先前获得的mysql驱动程序(com.mysql.jdbc.Driver)建立数据库连接,在URL中,我们指明数据库连接所需要的参数,象数据库名称,主机名称,登陆名及登陆密码。依此,我们可以用其它任何的JDBC驱动程序连接其相对的数据库。如果我们需要连接其他的SQL数据库,只需更改这个 URL就够了。

  行15--17 这里我们执行了一个Select 查询,请特别注意第16行,我们使用了另一个JSTL功能函数<c:out 用来输出我们所获取的数据表名称,这里我们同样可以使用其他的SQL命令,比如说 INSERT,DELETE,等等。要执行这些没有返回值的查询请求,你就需要使用<sql:update JSTL功能函数了。他可以直接执行他们就象<SQL:query一样,只是执行它是不需要特别指定结果变量来存储语句执行返回的结果。

  行18--20 既然我们执行了上面的SELECT查询语句,我们就应该把他的返回结果显示出来。<c:forEach 就是JSTL 中一个具有迭代功能的函数,执行它时,我们通过${result.rowsByIndex}将返回的每一个数据行信息返回给变量${row},紧接着在第19行, 我们通过<c:out value="${row[0]}"/>显示返回的每个数据行的第一个数据列中的值。只要你的数据表中包含的字段,你都可以通过改变变量 ${row}中的数字大小来对请求表中的任意一个字段中的值对他们进行访问。

  行21--22是HTML 页脚

  在你亲自创建JSTL应用程序过程中,可能你还没有发现它有多么的强大,但你应该能够意识到JSTL的功能函数的简单和高效性,试想有了JSTL,整合出一个基于SQL的新闻专栏是何等的快速,集成你现有的web站点是何等的容易。

  很好,我们的代码很容易理解的,即使一个非专业程序员的话,打个比方就算是一个设计师也能够读懂它,理解它,还可能进行部分的修改,起码是页面布局上的修改。

  正如我们开始的时候所提到的,为了使我们的JSTL代码正常的运行,我们需要安装Mysql Connector/J 中的JAR 文件,当然还有 JSTL。因为我们使用了Tomcat这个JSp 容器,你需要在Tomcat的文件目录Webapps下创建你自己的文件夹,将你的Hello.jsp 、Continue.jsp文件放在你创建的文件目录中,在你创建的目录中你还要创建一个叫做WEB-INF 的文件夹,将你的配置文件Web.xml放在里面,web.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app />

  接下来我们还需要在WEB-INF下创建一个叫做lib的子目,并将下列文件放进去:

jstl.jar

saxpath.jar

standard.jar

mysql-connector-java-3.0.9-stable-bin.jar (注意,这个名称依据你的Mysql Connector/J版本不同可能会有所变化)

  所有的这些信息您能够在JSTL或Tomcat手册中查阅的到,如果你想理解他们具体是如何运行而又为什么这么运行你就应该研读一下这些手册。不过为了帮助你快速的掌握JSTL的基本操作,相关的知识我已经作了介绍。

  如果你使用的是其他的Jsp 容器,那么就需要你阅读他们相关的手册资料。

  罗罗索索这么多,我还想再说明一点,这篇文章只是对JSTL技术的基本的介绍,并不是完全手册。JSTL中包含有许多功能丰富的函数用法来帮助你以简捷快速的方式完成你的Jsp开发,我建议大家读一些有关JSTL功能以及它如何与JavaBeans协同工作的更详细的文档资料,到最终你可能会发现他就是你期待已久的开发平台。通过阅读本篇文章,你应该已经能够创建一些简单的基于SQL 数据库的前后台应用了。

 

config eclipse platform

1.eclipse2.1;

2.eclipseuml Plugin-for eclipse2.1,www.omondo.com.It can be used to draw all diagram in UML,there is function of forward and reverse engineering between java code and class diagram.it's a community version.but for me is satisfiable;

3.tomcat Plugin;

4.easystruts.eclipse_0.6.4;

5.import learndiaryV0.9.0.3 into eclipse project.

  The key is below:

  1).copy all the *.jar file in the 'lib' folder of learndiaryV0.9.0.3 into easyStruts requirement lib and all TLD file into easyStruts requirement TLD;

  2).package the files in 'src' into 'src\com\learndiary\website' folder,and remove this folder into WEB-INF folder;

  3).remove the resource file named application.properties to src\com\learndiary\website\ApplicationResources.properties;

自责一下,三个星期没有更新

这三个星期来,第一个星期忙着改进导航能力,可是万万没有我想的那么简单,到第二周就灰心了,赶紧翻书。总结一下最近的进展。

第七章JSTL应该是重点,JSTL提供标签函数库共分为5大类:core tag library ,I18N-capable formatting tag library,SQL tag library,Function tag library。在之前我使用taglib一头雾水,现在清晰多了。core tag library按功能分类有表达式操作,流程控制,迭代操作和URL操作。其中表达式操作中,我主要使用到set和out,对于remove和catch使用很少,--我动手的时间还太少。流程控制和迭代操作,我习惯归在一起,这部分感到很别扭。URL操作中,我在csdn看到有人对redirect不明白,其实他是忽略了“redirect之后的东西不会被执行”。至于I18N-capable formatting tags library,看得很马虎,没有深入。对SQL tag library 和 Function tag library被我跳了过去,--打算下周在继续。