posts - 495,  comments - 11,  trackbacks - 0
           
           
          posted @ 2007-08-14 10:07 jadmin 閱讀(77) | 評論 (0)編輯 收藏

          Struts 框架帶有幾個自定義標簽庫(有關 Struts 的更多信息的鏈接請參閱 參考資料 )。這些庫中的一個標簽可以創建一個支持改寫 URL 的鏈接并用 jsessionid 對改寫的連接編碼。

          不過有一個問題:如果希望傳遞一組請求參數(如查詢字符串),也許必須為此創建一個 Java scriptlet。真是亂!下面的清單 (search_results.jap) 展示了一個 JSP 頁,它被迫加入了這樣一個 scriptlet。

           <%@ taglib uri="struts-html" prefix="html" %> <jsp:useBean class="java.util.HashMap" id="deleteParams" /> <% deleteParams.put("id", cd.getId()); deleteParams.put("method","delete"); %> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td> 

          search_results.jsp 創建一個 hashmap 并向這個 map 傳遞兩個屬性。在下面幾小節,我們將創建一個不用 Java 代碼完成這項工作的自定義標簽。我們的標簽將定義如下的一個 hashmap:

           <map:mapDefine id="deleteParams"> <map:mapEntry id="id" name="cd" property="id"/> <map:mapEntry id="method" value="delete"/> </map:mapDefine> <!-- Pass the map named deleteParams to html:link to generate the request parameters--> <html:link action="/deleteCD" name="deleteParams">delete </html:link> </font></td> 

          這將使我們可以容易地創建小型 map。

          這個例子將展示幾個關鍵概念,包括使用嵌套標簽和定義 scriplet 變量。首先我將解釋這個標簽是如何工作的。然后在以后的幾節中建立這些概念,并介紹如何編寫這個標簽的不同形式,使它們處理其正文并控制執行流程。

          posted @ 2007-08-14 10:07 jadmin 閱讀(70) | 評論 (0)編輯 收藏
           
          posted @ 2007-08-14 10:06 jadmin 閱讀(85) | 評論 (0)編輯 收藏
          一、基本概念:
          *************************************************************************************
          1.標簽(Tag):
          標簽是一種XML元素,通過標簽可以使JSP網頁變得簡潔并且易于維護,還可以方便地實現同一個JSP文件支持多種語言版本。由于標簽是XML元素,所以它的名稱和屬性都是大小寫敏感的

          2.標簽庫(Tag library):
          由一系列功能相似、邏輯上互相聯系的標簽構成的集合稱為標簽庫。

          3.標簽庫描述文件(Tag Library Descriptor):
          標簽庫描述文件是一個XML文件,這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系。它是一個配置文件,和web.xml是類似的。

          4.標簽處理類(Tag Handle Class):
          標簽處理類是一個Java類,這個類繼承了TagSupport或者擴展了SimpleTag接口,通過這個類可以實現自定義JSP標簽的具體功能
          *************************************************************************************


          二、自定義JSP標簽的格式:
          *************************************************************************************
          1.<% @ taglib prefix=”someprefix” uri=”/sometaglib” %>
          ?? 為了使到JSP容器能夠使用標簽庫中的自定義行為,必須滿足以下兩個條件:
          ??? 1.從一個指定的標簽庫中識別出代表這種自定義行為的標簽
          ??? 2.找到實現這些自定義行為的具體類

          ??? 第一個必需條件-找出一個自定義行為屬于那個標簽庫-是由標簽指令的前綴(Taglib?? Directive's Prefix)屬性完成,所以在同一個頁面中使用相同前綴的元素都屬于這個標簽庫。每個標簽庫都定義了一個默認的前綴,用在標簽庫的文檔中或者頁面中插入自定義標簽。所以,你可以使用除了諸如jsp,jspx,java,servlet,sun,sunw(它們都是在JSP白皮書中指定的保留字)之類的前綴。
           
           uri屬性滿足了以上的第二個要求。為每個自定義行為找到對應的類。這個uri包含了一個字符串,容器用它來定位TLD文件。在TLD文件中可以找到標簽庫中所有標簽處理類的名稱

          2.<someprefix:sometag key=”somevalue”/>
           當web應用程序啟動時,容器從WEB-INF文件夾的目錄結構的META-INF搜索所有以.tld結尾的文件。也就是說它們會定位所有的TLD文件。對于每個TLD文件,容器會先獲取標簽庫的URI,然后為每個TLD文件和對應的URI創建映射關系。
          在JSP頁面中,我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
          *************************************************************************************


          三、自定義JSP標簽的處理過程:
          *************************************************************************************
          1.在JSP中引入標簽庫:<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>
          2.在JSP中使用標簽庫標簽:<prefix : tagname attribute=”tagattribute”>
          3.Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值
          4.Web容器根據uri屬性在web.xml找到對應的<taglib>元素
          5.從<taglib>元素中獲得對應的<taglib-location>元素的值
          6.Web容器根據<taglib-location>元素的值從WEB-INF/目錄下找到對應的.tld文件
          7.從.tld文件中找到與tagname對應的<tag>元素
          8.湊<tag>元素中獲得對應的<tag-class>元素的值
          9.Web容器根據<tag-class>元素的值創建相應的tag handle class的實例
          10. Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
          *************************************************************************************


          四、創建和使用一個Tag Library的基本步驟:
          *************************************************************************************
          1.創建標簽的處理類(Tag Handler Class)
          2.創建標簽庫描述文件(Tag Library Descrptor File)
          3.在web.xml文件中配置<tag>元素
          4.在JSP文件中引人標簽庫
          *************************************************************************************


          五、TagSupport類簡介:
          *************************************************************************************
          1.處理標簽的類必須擴展javax.servlet.jsp.TagSupport.
          2.TagSupport類的主要屬性:

          A.parent屬性:代表嵌套了當前標簽的上層標簽的處理類
          B.pageContex屬性:代表Web應用中的javax.servlet.jsp.PageContext對象

          3.JSP容器在調用doStartTag或者doEndTag方法前,會先調用setPageContext和setParent方法,設置pageContext和parent。因此在標簽處理類中可以直接訪問pageContext變量

          4.在TagSupport的構造方法中不能訪問pageContext成員變量,因為此時JSP容器還沒有調用
          ?? setPageContext方法對pageContext進行初始化
          *************************************************************************************


          六、TagSupport處理標簽的方法:
          *************************************************************************************
          1.TagSupport類提供了兩個處理標簽的方法:
          ?? public int doStartTag() throws JspException
          ?? public int doEndTag()??? throws JspException

          2.doStartTag:但JSP容器遇到自定義標簽的起始標志,就會調用doStartTag()方法。????
          ?? doStartTag()方法返回一個整數值,用來決定程序的后續流程。
          ?? A.Tag.SKIP_BODY:表示<prefix:someTag>…</prefix:someTag>之間的內容被忽略
          ?? B.Tag.EVAL_BODY_INCLUDE:表示標簽之間的內容被正常執行

          3.doEndTag:但JSP容器遇到自定義標簽的結束標志,就會調用doEndTag()方法。doEndTag
          ?? ()方法也返回一個整數值,用來決定程序后續流程。
          ??? A.Tag.SKIP_PAGE:表示立刻停止執行網頁,網頁上未處理的靜態內容和JSP程序均被
          ????? 忽。略任何已有的輸出內容立刻返回到客戶的瀏覽器上。
          ??? B.Tag_EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁
          *************************************************************************************


          七、用戶自定義的標簽屬性:
          *************************************************************************************
          如果在標簽中還包含了自定義的屬性,例如:
          <prefix:Mytag attribute1="value1">
          ???? ...
          </prefix:Mytag>
          那么在標簽處理類中應該將這個屬性作為成員變量,并且分別提供設置和讀取屬性的方法。
          *************************************************************************************


          八、創建標簽處理類的步驟:
          *************************************************************************************
          1.創建包含JSP網頁靜態文本的文件(即是要替換自定義JSP標簽的文本)
          2.在Web應用啟動時裝載靜態文本
          3.創建標簽處理類
          *************************************************************************************


          九、如何創建包含JSP網頁靜態文本的文件:????
          *************************************************************************************
          1.使用java.util.Properties類來存放要替換網頁中自定義JSP標簽的靜態文本
          2.Properties類代表了一系列屬性的集合,其實例既可以被保存到流中,也可以從流中加??
          ?? 載。這些文本以key/value的形式存放在WEB-INF目錄下,例如key=value,在屬性列表中
          ?? 這些key/value都是String類型的
          *************************************************************************************

          十、Properties類的常用API:
          *************************************************************************************
          1.setProperty(String key, String value):調用Hashtable類的put方法添加屬性
          2.getProperty(String key):獲取屬性列表中key對應的屬性值
          3.load(InputStream in):從輸入流對象InputStream中讀取屬性列表(Properties list)
          4.store(OutputStream out,String comment):使用適當的格式將屬性列表的屬性對寫入輸
          ?? 出流對象中,默認使用ISO-88590-1編碼格式,以行的方式處理輸入。屬性的key/value之
          ?? 間以”=、:”配對,以回車、換行分隔key/value對
          *************************************************************************************

          十一、ServletContext類的常用API:
          *************************************************************************************
          1.getContext(String uripath):返回服務器中uripath所代表的ServletContext對象
          2.getInitParameter(String name):返回ServletConfig對象中name參數的值
          3.getMineType(String file):返回file參數代表的文件的MIME類型
          4.getRequestDispatcher(String path):返回path代表的RequestDispacher對象
          5.getResourceAsStream(String path):以輸入流的形式返回path對應的資源,在輸入留中對象可以為任意形式的數據,path參數必須以“/”開始且相對于Context Root
          *************************************************************************************

          十二、如何使用ServletContxt讀取并保存屬性文件:
          *************************************************************************************
          1.創建java.util.Properties類對象
          2.獲取ServletContext對象
          3.將屬性文件以輸入流的形式讀入到某個輸入流對象中
          4.將輸入流對象加載到Properties對象中
          5.將Properties對象保存到ServletContext對象中
          *************************************************************************************

          十三、如何在Web應用啟動時裝載靜態文本:
          *************************************************************************************
          1.創建繼承了HttpServlet類的子類,在web.xml中配置這Servlet時設置load-on-startup屬性:
          <servlet>
          <servlet-name>someclass</servlet-name>
          <servlet-class>somepackage.SomeClass</servlet-clas
          <load-on-startup>1</load-on-startup>
          </servlet>
          2.在這個Servlet的init()方法中創建java.util.Properties類
          3.獲取當前Web應用的ServletContext對象
          4.將WEB-INF目錄下的屬性文件讀入到輸入流InputStream中:
          InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");
          5.將輸入流加載到屬性對象中
          ?????? ps.load(in);????????
          6.將屬性對象保存到上下文中。
          context.setAttribute("attributeName",ps);
          *************************************************************************************

          十四、如何創建標簽處理類:
          *************************************************************************************
          1.引入必需的資源:
          ?????? import javax.servlet.jsp.*;
          ???? import javax.servlet.http.*;
          ???? import java.util.*;
          ???? import java.io.*;
          2.繼承TagSupport類并覆蓋doStartTag()/doEndTag()方法
          3.從ServletContext對象中獲取java.util.Properties對象
          4.從Properties對象中獲取key對應的屬性值
          5.對獲取的屬性進行相應的處理并輸出結果
          *************************************************************************************

          十五、創建標簽庫描述文件(Tag Library Descriptor):
          *************************************************************************************
          1.標簽庫描述文件,簡稱TLD,采用XML文件格式,定義了用戶的標簽庫。TLD文件中的元素可以分成3類:
          ???? A.<taglib>:標簽庫元素
          ???? B.<tag>:標簽元素
          ???? C.<attribute>:標簽屬性元素

          2.標簽庫元素<taglib>用來設定標簽庫的相關信息,它的常用屬性有:
          ???? A.shortname:???? 指定Tag Library默認的前綴名(prefix)
          ???? B.uri:???????????? 設定Tag Library的惟一訪問表示符

          3.標簽元素<tag>用來定義一個標簽,它的常見屬性有:
          ???? A.name:???????? 設定Tag的名字
          ???? B.tagclass:???? 設定Tag的處理類
          ???? C.bodycontent:???? 設定標簽的主體(body)內容
          ???????????? 1).empty:表示標簽中沒有body
          ???????????? 2).JSP:表示標簽的body中可以加入JSP程序代碼
          ???????????? 3).tagdependent:表示標簽中的內容由標簽自己去處理

          4.標簽屬性元素<attribute>用來定義標簽的屬性,它的常見屬性有:
          ???? A.name:屬性名稱
          ???? B.required:屬性是否必需的,默認為false
          ???? C.rtexprvalue:屬性值是否可以為request-time表達式,也就是類似于<%=…%>的表達式
          *************************************************************************************

          十六、在Web應用中使用標簽:
          *************************************************************************************
          1.如果Web應用中用到了自定義JSP標簽,則必須在web.xml文件中加入<taglib>元素,它用于聲明所引用的標簽所在的標簽庫
          ???? <taglib>
          ???????? <taglib-uri>/sometaglib</taglib-uri>
          ???????? <taglib-location>/WEB-INF/someTLD.tld</taglib-location>
          ???? </taglib>

          2.<taglib-uri>:設定Tag Library的惟一標示符,在Web應用中將根據它來引用Tag Libray
          3.<taglib-location>:指定和Tag Library對應的TLD文件的位置
          4.在JSP文件中需要加入<% @ taglib% >指令來聲明對標簽庫的引用。例如:
          <% @ taglib prefix = “somePrefix” uri = "/someuri" %>

          5.prefix表示在JSP網頁中引用這個標簽庫的標簽時的前綴,uri用來指定Tag Library的標識符,它必須和web.xml中的<taglib-uri>屬性保持一致。
          *************************************************************************************
          posted @ 2007-08-14 10:05 jadmin 閱讀(72) | 評論 (0)編輯 收藏
           
          posted @ 2007-08-14 09:21 jadmin 閱讀(71) | 評論 (0)編輯 收藏

          JSP2.0中為了簡化標簽的復雜性,增加了制作Simple Tag的標簽類SimpleTagSupport類。
          SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可,而不需要一堆回傳值。

          舉例說明:
          例1:HelloSimpleTag標簽
          第一步:制作標簽處理類
          HelloSimpleTag.java

          package com.newould.taglib;

          import java.io.*;
          import javax.servlet.jsp.*;
          import javax.servlet.jsp.tagext.*;

          public class HelloSimpleTag extends SimpleTagSupport {

          public void doTag() throws JspException, IOException {
          ??
          ????? JspWriter out = getJspContext().getOut();
          ????? out.println("Hello Simple Tag");
          }
          }

          第二步:編寫標簽性質文件
          MyTaglib.tld

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

          <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
          ?????? version="2.0">
          ????
          ?????? <description>My Taglib by JavaWorld.com.tw</description>
          ?????? <tlib-version>1.0</tlib-version>
          ?????? <jsp-version>2.0</jsp-version>
          ?????? <short-name>Mytaglib</short-name>
          ?????? <uri></uri>
          ......

          <tag>
          ???????? <description>Hello Simple Tag</description>
          ???????? <name>HelloSimpleTag</name>
          ???????? <tag-class>com.newould.taglib.HelloSimpleTag</tag-class>
          ???????? <body-content>empty</body-content>
          ?????? </tag>
          </taglib>

          第三步:編寫Jsp網頁
          HelloSimpleTag.jsp

          <%@ page contentType="text/html;charset=GB2312" %>
          <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

          <html>
          <head>
          <title>HelloSimpleTag.jsp</title>
          </head>
          <body>

          <h2>Simple Tag 標簽</h2>

          <h1><mytag:HelloSimpleTag /></h1>

          </body>
          </html>

          =================================================================

          例2:AddSimpleTag標簽
          第一步:制作標簽處理類
          AddSimpleTag.java

          package com.newould.taglib;

          import java.io.*;
          import javax.servlet.jsp.*;
          import javax.servlet.jsp.tagext.*;

          public class AddSimpleTag extends SimpleTagSupport {

          private int num1 = 0;
          private int num2 = 0;

          public void setNum1(int num1) {
          ????? this.num1 = num1;
          }

          public void setNum2(int num2) {
          ????? this.num2 = num2;
          }

          public void doTag() throws JspException, IOException {

          ????? JspContext ctx = getJspContext();
          ????? JspWriter out = ctx.getOut();
          ???
          ????? int sum = num1 + num2;
          ????? ctx.setAttribute("sum", Integer.toString(sum));
          ??
          ????? out.println(num1 + " + " + num2 + " = " + sum);
          }
          }

          第二步:編寫標簽性質文件
          MyTaglib.tld

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

          <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
          ?????? version="2.0">
          ????
          ?????? <description>My Taglib by JavaWorld.com.tw</description>
          ?????? <tlib-version>1.0</tlib-version>
          ?????? <jsp-version>2.0</jsp-version>
          ?????? <short-name>Mytaglib</short-name>
          ?????? <uri></uri>
          ......

          <tag>
          ???????? <description>Add Simple Tag</description>
          ???????? <name>Add</name>
          ???????? <tag-class>com.newould.taglib.AddSimpleTag</tag-class>
          ???????? <body-content>empty</body-content>
          ??????
          ???????? <attribute>
          ?????????? <name>num1</name>
          ?????????? <required>true</required>
          ?????????? <rtexprvalue>true</rtexprvalue>
          ???????? </attribute>

          ???????? <attribute>
          ?????????? <name>num2</name>
          ?????????? <required>true</required>
          ?????????? <rtexprvalue>true</rtexprvalue>
          ???????? </attribute>
          ????????????
          ?????? </tag>
          ???
          </taglib>

          第三步:編寫Jsp網頁
          AddSimpleTag.jsp

          %@ page contentType="text/html;charset=GB2312" %>
          <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

          <html>
          <head>
          <title>AddSimpleTag.jsp</title>
          </head>
          <body>

          <h2>AddSimpleTag 標簽</h2>

          <h1><mytag:Add num1="5" num2="9" /></h1>

          最后結果:${sum}

          </body>
          </html>

          =================================================================

          例3 RepeatSimpleTag標簽
          RepeatSimpleTag標簽 主要是用來重復顯示某段文字。
          這個例子在處理上與前兩個例子有點不同

          第一步:制作標簽處理類
          RepeatSimpleTag.java

          package com.newould.taglib;

          import java.io.*;
          import javax.servlet.jsp.*;
          import javax.servlet.jsp.tagext.*;

          public class RepeatSimpleTag extends SimpleTagSupport {

          private int count = 0;//重復的次數
          private JspFragment fragment;//重復的內容

          public void setCount(int count) {
          ????? this.count = count;
          }

          public void setFragment(JspFragment fragment) {
          ????? this.fragment = fragment;
          }

          public void doTag() throws JspException, IOException {

          ????? JspContext ctx = getJspContext();
          ????? JspWriter out = ctx.getOut();
          ???
          ????? for(int i=0 ; i<count ; i++) {
          ?????? fragment.invoke(null);//表示將fragment的內容顯示出來
          ????? }
          }
          }

          第二步:編寫標簽性質文件
          MyTaglib.tld

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

          <taglib xmlns=" ?????? xmlns:xsi=" ?????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
          ?????? version="2.0">
          ????
          ?????? <description>My Taglib by JavaWorld.com.tw</description>
          ?????? <tlib-version>1.0</tlib-version>
          ?????? <jsp-version>2.0</jsp-version>
          ?????? <short-name>Mytaglib</short-name>
          ?????? <uri></uri>
          ......

          <tag>
          ???????? <description>Repeate Simple Tag</description>
          ???????? <name>Repeat</name>
          ???????? <tag-class>com.newould.taglib.RepeatSimpleTag</tag-class>
          ???????? <body-content>empty</body-content>
          ??????
          ???????? <attribute>
          ?????????? <name>count</name>
          ?????????? <required>true</required>
          ?????????? <rtexprvalue>true</rtexprvalue>
          ???????? </attribute>

          ???????? <attribute>
          ?????????? <name>fragment</name>
          ?????????? <required>true</required>
          ?????????? <fragment>true</fragment>
          ???????? </attribute>
          ?????? </tag>????
          ???
          </taglib>

          注意:<fragment>true</fragment>,一定要這樣設定fragment屬性。

          第三步:編寫Jsp網頁
          RepeatSimpleTag.jsp

          <%@ page contentType="text/html;charset=GB2312" %>
          <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag" %>

          <html>
          <head>
          <title>RepeatSimpleTag.jsp</title>
          </head>
          <body>

          <h2>RepeatSimpleTag 標簽</h2>

          <mytag:Repeat count="5" >
          <jsp:attribute name="fragment">
          重復執行 ....<br>
          </jsp:attribute>
          </mytag:Repeat>
          </body>
          </html>

          =================================================================

          DynamicAttributes接口
          只要制作的標簽實現了DynamicAttributes接口就有動態屬性的功能。
          例如:我們要做多個數的累加運算,則AddSimpleTag標簽就可以通過實現DynamicAttributes接口就可以實現了.

          實現DynamicAttributes接口,必須實現setDynamicAttributes()方法,此方法用來接收動態屬性.

          舉例:第一步:制作標簽處理類

          package com.newould.taglib;

          import java.io.*;
          import java.util.*;
          import javax.servlet.jsp.*;
          import javax.servlet.jsp.tagext.*;

          public class DynamicAdd extends SimpleTagSupport implements DynamicAttributes {

          //用來接收動態屬性
          private ArrayList keys = new ArrayList();
          private ArrayList values = new ArrayList();

          public void doTag() throws JspException, IOException {

          ????? JspContext ctx = getJspContext();
          ????? JspWriter out = ctx.getOut();
          ???
          ????? float num = 0;
          ????? float sum = Float.parseFloat((String)values.get(0));
          ????? out.print(sum);
          ???
          ????? for (int i = 1 ; i < keys.size() ; i++) {
          ?????? String temp = (String)values.get(i);
          ?????? num = Float.parseFloat(temp);
          ?????? sum = sum + num;
          ?????? out.print(" + " + num);
          ????? }
          ???
          ????? out.print(" = " + sum);
          ????? ctx.setAttribute("sum", Float.toString(sum));
          ???
          }

          public void setDynamicAttribute(String uri, String name, Object value) throws JspException {
          ????? keys.add(name);
          ????? values.add(value);
          }
          }

          第二步:編寫標簽性質文件
          <tag>
          ???????? <description>DynamicAttribute</description>
          ???????? <name>DynAdd</name>
          ???????? <tag-class>com.newould.taglib.DynamicAdd</tag-class>
          ???????? <body-content>empty</body-content>

          ???????? <dynamic-attributes>true</dynamic-attributes>
          ?????? </tag>????

          第三步:編寫Jsp網頁
          <%@ page contentType="text/html;charset=GB2312" %>
          <%@ taglib prefix="JSPBook" tagdir="/WEB-INF/tags/" %>
          <%@ taglib prefix="c" uri="

          <html>
          <head>
          <title>CH16 - DynAdd.jsp</title>
          </head>
          <body>

          <h2>Tag File 范例</h2>

          <JSPBook:DynAdd num1="111" num2="222" num3="444" >

          <jsp:attribute name="great">
          ????? <font color="red">SUM:${sum} ...</red>
          </jsp:attribute>
          <jsp:attribute name="less">
          ????? <font color="blue">SUM:${sum} ...</red>
          </jsp:attribute>
          </JSPBook:DynAdd>

          </body>
          </html>
          JSP2.0中為了簡化標簽的復雜性,增加了制作Simple Tag的標簽類SimpleTagSupport類。
          SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可,而不需要一堆回傳值。

          struts2.0簡單的例子

          今天在apache網站上無意中看到了struts項目2.0.1正式發布了,懷著欣喜的心情我下載了stuts2.0.1完整包。 Struts2.0.1是struts項目和WebWork2.2項目的合并版本,集成了兩大流行MVC框架的優點,對struts框架來說是一個大的提升,同時也更大程度地簡化了開發人員的開發過程。我簡單地研究了一下這個新版本,現在給大家介紹一個入門級的小例子,希望能對學習這個新版本的朋友有點幫助。
          這個例子完成了一次URL調用返回結果頁面的過程。
          首先,要從apache網站上下載struts2.0.1的完整包(可以從這里下載:http://struts.apache.org/downloads.html),解壓后需要找到下列幾個文件:
          commons-logging-1.0.4.jar
          freemarker-2.3.4.jar
          ognl-2.6.7.jar
          struts2-api-2.0.1.jar
          struts2-core-2.0.1.jar
          xwork-2.0-beta-1.jar
          然后,我們就開始做第一個例子,我們就使用經典的“HelloWorld”的名字吧!
          1. 制作目錄結構
          如下圖所示:
          stuts2是web應用的根目錄。
          2. 拷貝引用文件
          將上面列舉的jar文件拷貝到步驟1中制作的目錄struts2\WEB-INF\lib中。
          3. 制作jsp文件HelloWorld.jsp

          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
          <title>Hello World!</title>
          </head>
          <body>
          <h2><s:property value="message" /></h2>
          </body>
          </html>

          將該文件拷貝到步驟1中制作的目錄struts2\example中。
          4.制作java文件HelloWorld.java

          package example;

          /** *//**
          * <code>Set welcome message.</code>
          */

          import com.opensymphony.xwork2.ActionSupport;
          public class HelloWorld extends ActionSupport ...{

          public static final String MESSAGE = "Struts is up and running ...";

          public String execute() throws Exception ...{
          setMessage(MESSAGE);
          return SUCCESS;
          }


          private String message;

          public void setMessage(String message)...{
          this.message = message;
          }


          public String getMessage() ...{
          return message;
          }

          }

          使用下面的命令編譯這個java文件:
          set CLASSPATH=yourdirectory\xwork-2.0-beta-1.jar
          javac HelloWorld.java
          將編譯后的HelloWorld.class文件拷貝到步驟1中制作的目錄struts2\WEB-INF\classes\example中。
          5.制作web應用的描述文件web.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
          ?????? xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
          ?????? xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          ?????? version
          ="2.4">

          <display-name>Struts Blank</display-name>

          <filter>
          <filter-name>struts2</filter-name>
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
          </filter>

          <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>

          <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          </welcome-file-list>
          </web-app>

          將該文件拷貝到步驟1中制作的目錄struts2\WEB-INF中。
          6.制作MANIFEST.MF文件(從其它地方隨便找一個即可)
          將該文件拷貝到步驟1中制作的目錄struts2\META-INF中。
          7.制作struts配置文件struts.xml和struts.properties
          struts.xml文件:

          <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd"
          >
          <struts>
          <package name="abc" namespace="/example" extends="struts-default">
          <action name="HelloWorld" class="example.HelloWorld">
          <result>/example/HelloWorld.jsp</result>
          </action>
          <!-- Add your actions here -->
          </package>
          </struts>

          struts.properties文件:
          struts.devMode = true
          struts.enable.DynamicMethodInvocation = false
          將這兩個文件拷貝到步驟1中制作的目錄struts2\ WEB-INF\classes中。
          好了整個例子的文件我們都搞定了。
          最后,你可以將制作好的web應用struts2拷貝到tomcat下運行。
          訪問http://localhost:8080/struts2/example/HelloWorld.action如果能夠看到頁面上的“Struts is up and running ...”提示信息說明你的例子是正確的。

          Struts2與Struts1的對比

          (轉自:javaeye)

          Action 類:
          ? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
          ? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。

          線程模式:
          ? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。
          ? Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)

          Servlet 依賴:
          ? Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
          ? Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。

          可測性:
          ? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
          ? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。

          捕獲輸入:
          ? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)。
          ? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。

          表達式語言:
          ? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
          ? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL).

          綁定值到頁面(view):
          ? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
          ? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
           
          類型轉換:
          ? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
          ? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

          校驗:
          ? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
          ? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

          本文轉自:http://blog.csdn.net/paulsen1980/archive/2007/05/18/1614643.aspx

          posted @ 2007-08-13 02:29 jadmin 閱讀(66) | 評論 (0)編輯 收藏
          1、web.xml文件
          <?xml version="1.0" encoding="UTF-8"?>
          <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee <display-name>
          struts2</display-name>
          <filter>
          <filter-name>struts2</filter-name>
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
          </filter>
          <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>
          <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>default.html</welcome-file>
          <welcome-file>default.htm</welcome-file>
          <welcome-file>default.jsp</welcome-file>
          </welcome-file-list>
          </web-app>

          其中,綠底色的部分是通用的部分。

          2、struts.xml文件
          這個文件的配置是最為重要的,也是比較容易出問題的地方,初學者對其中很多的參數不太明白,導致調試時候經常出錯。下面先給出一個配置的代碼:
          <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "
          <struts>
          <include file="struts-default.xml"/>
          <package name="package1" extends="struts-default">
          <action name="Hello" class="tutorial.HelloWorld">
          <result>HelloWorld.jsp</result>
          </action>
          <action name="HelloWorld" class="package1.HelloWorld">
          <result>HelloWorld.jsp</result>
          </action>
          </package>
          </struts>
          1)對于<include file="struts-default.xml"/>這行代碼,可以要也可以不要。
          2)package的name是可以虛構的,并不一定要在classes目錄下要有一個與這個name名對應的包名;像上面的配置文件中的name="package1"可以隨便改成name="aaa"等是不影響結果的,只不過這個package名可以使得多個action聚合在一起,對大型的模塊設計的時候是很有幫助的。
          3)<action name="HelloWorld" class="package1.HelloWorld">中的HelloWorld這個name并不一定要與package1包中的類名相同,比如<action name="Hello" class="tutorial.HelloWorld">這樣兩個名字完全不一樣是可以的,但是"Hello"這個name必須與輸入的jsp頁面里面的action內容是一致的,如<s:form action="Hello">
          4)從上面的配置文件可以看出,在classes目錄下面有兩個包,一個是tutorial,一個是package1。

          3、struts.properties文件
          這個文件最簡單,它與struts.xml文件一樣,都是位于classes目錄下面。其內容為:
          struts.devMode = true
          struts.enable.DynamicMethodInvocation = false的

          4、建議初學者先看看為Struts 2.0做好準備這篇文章,這里每個步驟講的非常的詳細,但是有些細節作者沒有寫出來,讓很多初學者調試的時候出很多錯誤,比如The requested resource (/項目名/HelloWorld) is not available.,java.lang.NullPointerException等等。
          1)關于工具web tools platform,這是一個eclipse集成了很多web開發下所需工具的一個比較好的平臺,它在eclipse的網站下面
          http://www.eclipse.org/webtools/有下載。打開這個頁面的右邊download欄目下面有wtp的下載,點擊這個去下載,如果不行,就再仔細找找了。
          2)如果出現The requested resource (/項目名/HelloWorld) is not available.的話,就仔細找找看是不是輸入的時候把配置文件等等地方寫錯了,對于初學者最容易把其中的字母搞錯,比如struts是不寫成了其它的形式,反正出現這個錯誤就是說訪問的資源不存在,那就肯定要么是配置文件出錯了,要么是你的類文件沒有放在classes目錄下面,無外這兩種情況。錯了不要緊,沒有錯誤,哪會有進步呢。
          3)如果你真的發現什么錯誤都沒有,但就是盡管調試了半天還是調試不成功,那就考慮你的JDK版本是不是和你下載的wtp搭配了,建議把原來低版本的JDK卸載,裝上新去下載的JDK,寫這篇博客時,最新版本是jdk-1_5_0_10。如果還不行,你就把tomcat或者其它的web服務器換版本,總之要不怕錯誤和失敗,要勤于不斷的調試。
          posted @ 2007-08-13 01:41 jadmin 閱讀(51) | 評論 (0)編輯 收藏


          啟動服務:
          1通過控制面板里的服務選項
          2通過命令行
           net start mysql??? ->啟動數據庫
           net stop mysql???? ->關閉數據庫

          連接數據庫
          mysql -u用戶名 -p密碼

          查看服務器上當前存在什么數據庫
          show databases;

          創建數據庫
          create database 數據庫名;
          如我要創建一個名為gbook的數據庫 
          create database gbook;

          刪除數據庫
          drop database 數據庫名;
          如:
          drop database gbook;

          選擇要使用的數據庫
          use 要使用的數據庫名;
          如:
          use gbook;

          查看當前使用的數據庫中存在的表
          show tables;

          創建一個數據庫表
          create table person
          {
          ??? id varchar(32) not null primary key,
          ??? name varchar(20) not null,
          ??? password varchar(20) not null
          };

          顯示數據庫中某個表的結構
          describe 表名;

          導入數據庫創建腳本文件命令(如D:\mysql.sql)
          先建立一個空數據庫->選擇它->導入腳本命令 如:
          create database gbook;
          source d:/mysql.sql;

          刪除表
          drop table 表名;

          刪除數據庫中某表的全部記錄
          delete from 表名;
          如:
          delete from gbook;

          向表中插入數據(以前面的person表為例)
          insert into 表名 values(對應的數據值);
          如:
          insert into person values('LXH','李興華','moolee');

          更新表中的數據
          update person set password='zzzzz';

          查看當前數據庫服務器的版本
          select version();

          查看數據庫服務器上的所有用戶
          select user();

          查看當前日期時間
          select now();

          使用load命令向數據庫的表中插入數據
          load data local infile '路徑' into table 表名;
          如:
          load data local infile 'f:/person.txt' into table person;
          person.txt中則單純的列出了許多表中的對應數據,如:
          mldn???????? 陳華   1569
          god????????? 黃雨   123456
          admin??????? 陳天賜  admin888

          列出表中所有記錄
          select * from 表名;
          如:
          select * from person;

          從表中只選擇特定的行
          select * from person where id='lxh';
          select * from person where id='lxh' and name='李興華';

          選擇表中特定的列(可以是多列哦,記得以,分開)
          select name from person;

          用distinct檢索出每個唯一的輸出記錄
          select distinct name from person;

          計算總的記錄數
          select count(*) from person;
          count()函數是查詢數據庫中的指定表有多少列

          posted @ 2007-08-12 23:21 jadmin 閱讀(70) | 評論 (0)編輯 收藏
          JSTL是一個不斷完善的開放源代碼的JSP標簽庫,是由apache的jakarta小組來維護的。JSTL只能運行在支持JSP1.2和Servlet2.3規范的容器上,如tomcat 4.x。但是在即將推出的JSP 2.0中是作為標準支持的。

          JSTL 1.0 發布于 2002 年 6 月,由四個定制標記庫(core、format、xml 和 sql)和一對通用標記庫驗證器(ScriptFreeTLV 和 PermittedTaglibsTLV)組成。core 標記庫提供了定制操作,通過限制了作用域的變量管理數據,以及執行頁面內容的迭代和條件操作。它還提供了用來生成和操作 URL 的標記。顧名思義,format 標記庫定義了用來格式化數據(尤其是數字和日期)的操作。它還支持使用本地化資源束進行 JSP 頁面的國際化。xml 庫包含一些標記,這些標記用來操作通過 XML 表示的數據,而 sql 庫定義了用來查詢關系數據庫的操作。

          兩個 JSTL 標記庫驗證器允許開發人員在其 JSP 應用程序中強制使用編碼標準。可以配置 ScriptFreeTLV 驗證器以在 JSP 頁面中禁用各種類型的 JSP 腳本元素 — scriptlet、表達式和聲明。類似地,PermittedTaglibsTLV 驗證器可以用來限制可能由應用程序的 JSP 頁面訪問的定制標記庫集(包括 JSTL 標記庫)。

          盡管 JSTL 最終將會成為 J2EE 平臺的必需組件,但目前只有少數應用程序服務器包括它。JSTL 1.0 的參考實現可作為 Apache 軟件基金會(Apache Software Foundation)的 Jakarta Taglibs 項目(請參閱參考資料)的一部分而獲得。可以將該參考實現中的定制標記庫合并到任何支持 JSP 1.2 和 Servlet 2.3 規范的服務器,以添加對 JSTL 的支持。

          如果要使用JSTL,則必須將jstl.jar和 standard.jar文件放到classpath中,如果你還需要使用XML processing及Database access (SQL)標簽,還要將相關JAR文件放到classpath中,這些JAR文件全部存在于下載回來的zip文件中。這個zip文件可以從http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/jakarta-taglibs-standard-1.0.zip下載

          JSTL的優點
          1、 在應用程序服務器之間提供了一致的接口,最大程序地提高了WEB應用在各應用服務器之間的移植。
          2、 簡化了JSP和WEB應用程序的開發。
          3、 以一種統一的方式減少了JSP中的scriptlet代碼數量,可以達到沒有任何scriptlet代碼的程序。在我們公司的項目中是不允許有任何的scriptlet代碼出現在JSP中。
          4、 允許JSP設計工具與WEB應用程序開發的進一步集成。相信不久就會有支持JSTL的IDE開發工具出現。
          posted @ 2007-08-09 17:20 jadmin 閱讀(49) | 評論 (0)編輯 收藏
          僅列出標題
          共50頁: First 上一頁 33 34 35 36 37 38 39 40 41 下一頁 Last 
          主站蜘蛛池模板: 东兰县| 改则县| 吴桥县| 襄汾县| 平乡县| 常州市| 社旗县| 无棣县| 百色市| 高碑店市| 舒城县| 兰溪市| 广宗县| 潼关县| 连州市| 明光市| 遵化市| 辽阳市| 满城县| 西林县| 海伦市| 平利县| 泗洪县| 察隅县| 阿鲁科尔沁旗| 铁岭县| 新田县| 康马县| 辰溪县| 太白县| 根河市| 靖江市| 无棣县| 即墨市| 民权县| 万载县| 岱山县| 额尔古纳市| 勃利县| 太保市| 石泉县|