posted @
2007-08-14 10:07 jadmin 閱讀(76) |
評論 (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 閱讀(69) |
評論 (0) |
編輯 收藏
posted @
2007-08-14 10:06 jadmin 閱讀(82) |
評論 (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 閱讀(70) |
評論 (0) |
編輯 收藏
posted @
2007-08-14 09:21 jadmin 閱讀(68) |
評論 (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()方法即可,而不需要一堆回傳值。
posted @
2007-08-14 09:19 jadmin 閱讀(87) |
評論 (0) |
編輯 收藏
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 閱讀(61) |
評論 (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 閱讀(49) |
評論 (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 閱讀(66) |
評論 (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 閱讀(46) |
評論 (0) |
編輯 收藏