然而,使用可變參數(shù)時(shí),要注意幾個(gè)問(wèn)題:
1) 可變參數(shù)方法與數(shù)組參數(shù)方法重載時(shí)
public class MethodParams{ //帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //帶數(shù)組參數(shù)的方法 public void hello(String[] params) { System.out.println("執(zhí)行帶數(shù)組參數(shù)的方法,數(shù)組長(zhǎng)度為:" + params.length); } }
我們寫(xiě)個(gè)測(cè)試代碼運(yùn)行一下看看結(jié)果如何:
MethodParams mp = new MethodParams(); mp.hello("AAA","BBB","CCC");
編譯時(shí)報(bào)錯(cuò):
MethodParams.java:7: 無(wú)法在 MethodParams 中同時(shí)聲明 hello(java.lang.String[]) 和 hello(java.lang.String...) public void hello(String[] params) { ^ 1 錯(cuò)誤
結(jié)論: JDK不允許存在, 帶可變參數(shù)的方法和帶數(shù)組參數(shù)的方法在同一類(lèi)中重載。
可變參數(shù)==數(shù)組參數(shù)? 在帶可變參數(shù)的方法體時(shí),讀取可變參數(shù)列表時(shí),就是以數(shù)組的方式來(lái)讀取;
帶可變參數(shù)的方法可以傳入一個(gè)數(shù)組參數(shù),但帶數(shù)組參數(shù)的方法卻不能傳入可變參數(shù)。
2) 可變參數(shù)方法與可變參數(shù)方法重載時(shí)
//帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //帶固定參數(shù)和可變參數(shù) public void hello(String param1, String ...params) { System.out.println("執(zhí)行帶固定參數(shù)和可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); }
測(cè)試代碼跟上例中一樣,編譯時(shí)報(bào)錯(cuò):
MethodParams.java:18: 對(duì) hello 的引用不明確,MethodParams 中的 方法 hello(java.l ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String ...) 都匹配 mp.hello("AAA","BBB","CCC"); ^ 1 錯(cuò)誤
結(jié)論:JDK不允許存在,帶相同參數(shù)類(lèi)型列表(Type List)的參數(shù)列表的方法在同一類(lèi)中重載。
3)可變參數(shù)方法與無(wú)參數(shù)方法重載時(shí)
//帶可變參數(shù)的方法 public void hello(String ...params) { System.out.println("執(zhí)行帶可變參數(shù)的方法,參數(shù)個(gè)數(shù)為:" + params.length); } //不帶參數(shù)的方法 public void hello() { System.out.println("執(zhí)行不帶參數(shù)的方法"); }
我們都知道,可變參數(shù)即可帶0個(gè)或者多個(gè)參數(shù),如果帶0個(gè)參數(shù)即不帶參數(shù)時(shí),JDK會(huì)怎么處理呢?
那我們就以執(zhí)行"mp.hello()"來(lái)測(cè)試一下。編譯通過(guò),運(yùn)行正常,調(diào)用的還帶參數(shù)的hello()方法。
結(jié)論:當(dāng)可變參數(shù)方法與不帶參數(shù)的方法重載時(shí),JDK默認(rèn)調(diào)用的是無(wú)參數(shù)的方法。若類(lèi)中沒(méi)有定義無(wú)參數(shù)的方法,則會(huì)調(diào)用可變參數(shù)的方法。
提供給外部調(diào)用的cn.idchecker.check.Checker類(lèi)的相關(guān)方法如下表:
方法 | 方法作用 | 參數(shù)及返回值 |
Checker(String num) | 構(gòu)造方法 | 參數(shù)num為18位身份證號(hào)碼的字符串 |
boolean checkLength() | 驗(yàn)證身份證長(zhǎng)度是否正確 | 長(zhǎng)度為18,則返回true,否則返回false |
boolean checkBirth() | 驗(yàn)證出生生日碼是否合法 | 合法則返回true,否則返回false |
boolean checkAddr() | 驗(yàn)證地址碼是否存在 | 存在則返回true,否則返回false |
boolean checkCheckCode() | 計(jì)算校驗(yàn)碼是否正確 | 正確則返回true,否則返回false |
boolean check() | 總的身份證驗(yàn)證,驗(yàn)證順序:長(zhǎng)度 -> 生日 -> 最后一位校驗(yàn)碼 -> 地址 | 若遇到有一項(xiàng)目不合法即返回false,所有驗(yàn)證通過(guò)才返回true。驗(yàn)證后,可通過(guò)調(diào)用getErrorMsg()方法獲取錯(cuò)誤信息 |
boolean checkAll() | 總的身份證驗(yàn)證,驗(yàn)證項(xiàng)目包括長(zhǎng)度、地址、生日、最后一位校驗(yàn)碼 | 身份證合法則返回true,否則false。驗(yàn)證后,可調(diào)用getErrorMsgs()方法獲取錯(cuò)誤信息集合 |
String getBirth() | 獲取出生年月日 | 返回“2010年01月12日”格式的生日字符串通串 |
String getAddr() | 獲取公民籍貫 | 返回籍貫字符串("xx省xx市xx縣”) |
String getSex() | 獲取性別 | 返回“男”或“女” |
String getErrorMsg() | 獲取錯(cuò)誤信息 | 返回錯(cuò)誤信息字符串 |
public Set<String> getErrorMsgs() | 獲取錯(cuò)誤信息集合 | 返回錯(cuò)誤信息集合 |
用法舉例 1 :解壓縮“idchecker.zip”,將其目錄下的“idchecker.jar” 包引進(jìn)Java Project中,以下是測(cè)試程序:
運(yùn)行結(jié)果:
用法舉例 2 :將“idchecker.jar” 包引進(jìn)到Web Project的lib目錄下,以下是測(cè)試程序:
運(yùn)行結(jié)果:
從截圖中, 我們可看出,
問(wèn)題1:右邊的內(nèi)容多時(shí),會(huì)導(dǎo)致左邊露空白;或者左邊內(nèi)容多時(shí),會(huì)導(dǎo)致右邊露空白。怎么解決?
問(wèn)題2:右邊那一大塊層的寬度應(yīng)該設(shè)置多少呢?設(shè)置小了,會(huì)與右邊界不對(duì)齊,設(shè)置大了,整塊層會(huì)被擠到下一行去。怎么辦?
其實(shí),兩個(gè)問(wèn)題,都可歸結(jié)到同一個(gè)問(wèn)題,即如何使得層的高度或?qū)挾冗_(dá)到自適應(yīng)的效果?
且看下面的HTML和CSS代碼,詳細(xì)講解在CSS代碼注釋中:
運(yùn)行截圖如下:
我們來(lái)探討一下影響DIV寬度或高度的屬性有哪些?
DIV的寬度 = width + padding + border + margin |
僅從一條公式上看,可能有點(diǎn)難理解,我們通過(guò)測(cè)試代碼和截圖來(lái)觀察一下。為了測(cè)試結(jié)果觀察直觀,我們只測(cè)試一邊,即左邊,即本來(lái)padding、border、margin的寬度計(jì)算,都是左右兩邊都算在內(nèi)的,這里就只測(cè)試左邊,右邊同理。
我們?cè)贔irefox中測(cè)試,截圖如下:
我們來(lái)分析一下DIV4,如下圖:
對(duì)照上面的代碼和截圖,我們可以清楚地理解“div的寬度 = width + padding + border + margin”這條公式。
對(duì)于Web前端開(kāi)發(fā)者來(lái)說(shuō),最頭痛的事情就是因?yàn)g覽器的差異而引起的網(wǎng)頁(yè)顯示效果的差異,而對(duì)于這條寬度計(jì)算公式,在其他瀏覽器中會(huì)不會(huì)有不兼容的問(wèn)題呢?
幸好,大部分常用的瀏覽器,我機(jī)器上都安裝了,測(cè)試結(jié)果是:在Firefox、Opera、Google、IE8、IE7顯示都跟上面的截圖一樣,也就是說(shuō),在這些瀏覽器中,寬度的計(jì)算公式是:
DIV的寬度 = width + padding + border + margin |
而在IE6中測(cè)試,結(jié)果卻不是這樣,請(qǐng)看運(yùn)行截圖:
由上圖可以看出,在IE6的寬度計(jì)算是:
DIV的寬度 = width + margin |
而border和padding,是占用了width的位置。這一點(diǎn),在前端開(kāi)發(fā)中要注意。
我們都知道CSS中定位屬性position的值,除了默認(rèn)的值外,還有absolute,relative和fixed。我平時(shí)比較常用absolute和relative,而position:fixed卻沒(méi)多關(guān)注。或許是因?yàn)楫?dāng)初在CSS中文手冊(cè)中看到position:fixed旁邊有說(shuō)明“IE5.5及NS6尚不支持此屬性”吧。
前段時(shí)間,在做一個(gè)項(xiàng)目時(shí)需要使一個(gè)層相對(duì)于瀏覽器邊框固定,那時(shí)用position:absolute試了下,發(fā)覺(jué)absolute是對(duì)網(wǎng)頁(yè)邊框而言的。后來(lái),上網(wǎng)查了一些根據(jù)滾動(dòng)條的移動(dòng),動(dòng)態(tài)地改變left和top的值的JavaScript語(yǔ)句,雖然能實(shí)現(xiàn)了類(lèi)似的效果,但滾動(dòng)條移動(dòng)時(shí),那個(gè)層晃來(lái)晃去的,感覺(jué)不好看,想要一種能使層固定不動(dòng)的做法。
且看下面的代碼:
<style type="text/css"> |
我們用上面這段代碼來(lái)定義頁(yè)面上的一個(gè)層“help”(id=“help”)。這樣就能實(shí)現(xiàn)我們想要的效果了。
在IE8、Firefox、Opera、Google等瀏覽器中測(cè)試,都沒(méi)有問(wèn)題,唯獨(dú)低版本的IE中,這個(gè)屬性無(wú)效。
上期的Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(1):環(huán)境的搭建與HelloSimple中,我們建的package名為“cn.simple.action”,這些包名有一個(gè)規(guī)則的,只要包含“action,actions,struts,struts2”都會(huì)默認(rèn)被掃描到為Action類(lèi),也就是說(shuō),我們只要配置了如“cn.simple.action”、“cn.simple.struts”、“cn.simple.action.admin”等包名,就可以不用在配置文件struts.xml(Struts2.0的配置文件)中配置這些Action類(lèi)了。當(dāng)然,這些包名,也可以是別的,但要寫(xiě)一點(diǎn)點(diǎn)配置,我們就用默認(rèn)的吧。關(guān)于這方面的詳細(xì)說(shuō)明,還是強(qiáng)烈建議大家先看官方的文檔http://struts.apache.org/2.1.6/docs/convention-plugin.html。
好,我們開(kāi)始寫(xiě)我們的用戶登錄模塊吧。先寫(xiě)個(gè)loginform.jsp,記得,不要忘記我們把JSP文件放在Web-Inf/content/目錄下
<%@ page language="java" contentType="text/html; charset=UTF-8" <s:fielderror></s:fielderror> <form action="login.action" method="post"> </body> |
大家如果想用Struts 2的標(biāo)簽庫(kù)的話,也可以用Struts 2的Form標(biāo)簽,用之前,要在JSP頭配置上Struts 2標(biāo)簽庫(kù),換成Struts 2標(biāo)簽的版本后,即:
<%@ page language="java" contentType="text/html; charset=UTF-8" <s:fielderror></s:fielderror> <s:form action="login"> </body> |
接著,我們寫(xiě)一個(gè)登錄處理的Action類(lèi):loginAction.java,代碼如下:
package cn.simple.action; import org.apache.struts2.convention.annotation.Result; @Results({ private String loginName; @Override //*******Getter和Setter方法***********// public String getPassword() { |
解釋一下這個(gè)類(lèi)吧:
execute 這個(gè)方法是重寫(xiě)了父類(lèi)ActionSupport的方法,是Action默認(rèn)會(huì)執(zhí)行的方法,即訪問(wèn)…/login.action或者…/login,它默認(rèn)會(huì)執(zhí)行這個(gè)方法。 validate 在執(zhí)行execute方法之前,它會(huì)先執(zhí)行validate這個(gè)方法,檢查登錄框是否輸入正確,這個(gè)方法也是重寫(xiě)了父類(lèi)的validate方法。 getter和setter,有了setter方法,才能使action能拿到上一個(gè)JSP頁(yè)面?zhèn)鬟^(guò)來(lái)的Request域的數(shù)據(jù);有了getter方法,下一個(gè)轉(zhuǎn)發(fā)(dispatcher)過(guò)去的頁(yè)面才能拿到此Action的Request域的數(shù)據(jù)。 執(zhí)行過(guò)程是這樣:表單提交給LoginAction,LoginAction先執(zhí)行validate方法,檢驗(yàn)loginName和password是否符合要求,如果不符合,就會(huì)addFieldError (把錯(cuò)誤信息放到Field棧里),如果Field棧里有錯(cuò)誤信息的話,它就不會(huì)再執(zhí)行execute方法,直接轉(zhuǎn)發(fā)(Dispatcher)到INPUT即“input”所指定的錯(cuò)誤處理頁(yè)面,這里為location="loginform.jsp",即讓它返回到表單登錄頁(yè)去,如果剛才validate方法中驗(yàn)證正確,即Field棧中沒(méi)有錯(cuò)誤信息,就會(huì)執(zhí)行execute方法。在這里execute返回SUCCESS,即“success”,根據(jù)Result注解,就會(huì)重定向到admin/index.action這個(gè)action。 |
返回SUCCESS重定向到的后臺(tái)主頁(yè),其實(shí)簡(jiǎn)單,admin/index.jsp,代碼很簡(jiǎn)單,就在HTML中顯示一句“登錄成功”,代碼略。
這些的目錄結(jié)構(gòu)如下:
運(yùn)行一下吧:
一點(diǎn)提醒:本項(xiàng)目網(wǎng)頁(yè)的排版以精簡(jiǎn)為主,在真實(shí)的網(wǎng)站開(kāi)發(fā)中,建議用Dreamweaver可視化排版,再作必要的修改和嵌入必要的動(dòng)態(tài)標(biāo)簽。
“Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(2):用戶登錄模塊的實(shí)現(xiàn)” 講解就到此,你也試一下吧,好,敬請(qǐng)關(guān)注下文!
下載Eclipse for JavaEE(3.4 or 3.5),網(wǎng)址http://www.eclipse.org/downloads/,點(diǎn)擊下圖選中的鏈接,進(jìn)入下一個(gè)頁(yè)面,找到能夠下載的地方下載就行。
JDK6.0和Tomcat6.0,請(qǐng)大家自行下載。
另外,建議下載JSP標(biāo)準(zhǔn)標(biāo)準(zhǔn)庫(kù)JSTL,下載地址:/Files/rongxh7/jstl-jar.rar
好,暫時(shí)下載這些,以后,需要用到其他的時(shí),再下載。至于JDK6.0,Tomcat6.0,Eclipse的安裝,請(qǐng)大家自行安裝,在這里就不演示安裝過(guò)程了,如有什么問(wèn)題,再聯(lián)系我。
關(guān)于Eclipse的部分用法,如在Eclipse里配置Tomcat服務(wù)器,新建動(dòng)態(tài)Web項(xiàng)目等,請(qǐng)看我的(Eclipse圖解教程),或者上網(wǎng)找一下其他的資料學(xué)習(xí)一下。
來(lái)開(kāi)始我們的項(xiàng)目吧,先做個(gè)簡(jiǎn)單的測(cè)試,New一個(gè)Dynamic Web Project,起名為“SimpleWeb”,將Struts2.1.6的下載包解壓后得到的lib目錄,在lib目錄下,找到以面的jar包:
|
把這些包放進(jìn)項(xiàng)目的lib目錄下,同時(shí),建議也把JSTL的核心jar包也放到lib目錄,這些JSTL的包主要有:
jstl.jar |
我們先要在項(xiàng)目WEB-INF下的web.xml文件中配置Struts2應(yīng)用,配置后,web.xml全部代碼如下:
<?xml version="1.0" encoding="UTF-8"?> |
我們?cè)陧?xiàng)目的WEB-INF目錄下新建一個(gè)文件夾命名為“content”,這個(gè)文件夾名一定要這樣,如果寫(xiě)成別的,要另外配置一下,但初學(xué)的話,就按它默認(rèn)的吧。我們新建的這個(gè)content目錄,就是專門(mén)用來(lái)放JSP文件的。
我們?cè)赾ontent目錄下建一個(gè)JSP文件,命名為“hello.jsp”,內(nèi)容可以很簡(jiǎn)單,就在里面寫(xiě)一個(gè)簡(jiǎn)單的話:Hello SImple,代碼略。
這時(shí),整個(gè)項(xiàng)目的文件夾視圖如下:
我運(yùn)行Tomcat服務(wù)器,測(cè)試一下Struts2配置能不能用。首先我們?cè)诘刂窓谳斎耄?a title="http://localhost:8060/SimpleWeb2/hello.jsp" href="http://localhost:8060/SimpleWeb/hello.jsp">http://localhost:8060/SimpleWeb/hello.jsp ,很遺憾,不管用了,報(bào)錯(cuò)了:HTTP Status 404 - The requested resource (/SimpleWeb/hello.jsp) is not available.截圖如下:
正確的做法是,輸入地址: http://localhost:8060/SimpleWeb/hello.action 或者http://localhost:8060/SimpleWeb/hello 如果出現(xiàn)如下結(jié)果,就說(shuō)明Struts2配置成功了。
注意一點(diǎn),這只是在WEB-INF/content目錄下的文件是通過(guò)這種方式訪問(wèn)的;如果不是在這目錄下,而在項(xiàng)目目錄下,即Eclipse對(duì)應(yīng)項(xiàng)目的WebContent下,就不能這樣訪問(wèn)了。舉例說(shuō),在項(xiàng)目根目錄下建個(gè)hello.jsp的文件,則我們只能通過(guò)http://localhost:8060/SimpleWeb/hello.jsp來(lái)訪問(wèn)。
能通過(guò)hello.action或者h(yuǎn)ello訪問(wèn)WEB-INF/content下的hello.jsp,這種做法,是Struts2.1.6跟Struts2.0不同之處之一。使用時(shí)請(qǐng)確保你使用的Struts版本是2.1.6+。相關(guān)的命名規(guī)范與默認(rèn)的action匹配規(guī)則,請(qǐng)參考官方的文檔:http://struts.apache.org/2.1.6/docs/convention-plugin.html
我們?cè)傩陆ㄒ粋€(gè)Java類(lèi),命名為HelloAction,此類(lèi)須繼承com.opensymphony.xwork2.ActionSupport,代碼如下:
package cn.simple.action; import org.apache.struts2.convention.annotation.Result;
@Override |
讓我們?cè)俅卧L問(wèn):http://localhost:8060/SimpleWeb/hello.action 或者http://localhost:8060/SimpleWeb/hello
可以看出,在Eclipse的控制臺(tái)確定打印出了以下信息,這說(shuō)明,訪問(wèn)請(qǐng)求確定經(jīng)過(guò)了HelloAction類(lèi)。
同時(shí)頁(yè)面是跳到了WEB-INF/content/hello.jsp文件(如下圖),這說(shuō)明請(qǐng)求的確是從HelloAction類(lèi)轉(zhuǎn)發(fā)到了hello.jsp。
看來(lái),好像在不做什么配置,Struts2.1.6也會(huì)找到名為HelloAction的類(lèi)來(lái)處理…/hello.action或者…/hello的請(qǐng)求,而好像也沒(méi)有做什么配置,HelloAction會(huì)自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)給名為hello.jsp的頁(yè)面,這正是Struts2.1.6的妙用之處,全賴struts2-convention-plugin-2.1.6.jar這個(gè)插件,具體了解,可看我上面提供的官方鏈接,或者看這位帥哥的翻譯之作:struts2采用convention-plugin實(shí)現(xiàn)零配置。
看了上面的HelloAction的代碼若感到莫名其妙的話,我這里把那些默認(rèn)的、約定俗成的代碼也寫(xiě)出來(lái),這樣,修改后的HelloAction類(lèi)如下:
package cn.simple.action; import org.apache.struts2.convention.annotation.Result; @Results({ @Override |
這樣就容易明白許多了。解釋如下:
name = “success” 跟 Action里的execute()方法的返回值SUCCESS(也可寫(xiě)成“success”)對(duì)應(yīng),即若此Action類(lèi)一旦返回SUCCESS,就會(huì)跳到對(duì)應(yīng)的這個(gè)Result去處理。 location = “hello.jsp”,表示請(qǐng)求由這個(gè)Action跳轉(zhuǎn)到hello.jsp這個(gè)頁(yè)面。 type = “dispathcer”,表示轉(zhuǎn)發(fā)方式,具體解釋見(jiàn)下面。 |
其中type=”dispatcher”表示請(qǐng)求轉(zhuǎn)發(fā),還有另一種常用的叫做type=”redirect”重定向,在下文會(huì)出現(xiàn)。Struts2的請(qǐng)求轉(zhuǎn)發(fā)和重定向的區(qū)別其實(shí)跟Java Servlet里的是差不多的。Servlet里與其功能等價(jià)的的代碼片斷如下:
request.getRequestDispatcher("hello.jsp").forward(request, response); //請(qǐng)求轉(zhuǎn)發(fā) |
兩者的區(qū)別可以這樣理解:請(qǐng)求轉(zhuǎn)發(fā)(Dispatcher)在轉(zhuǎn)發(fā)到的另一頁(yè)面(如hello.jsp)還能保留Request域里的東西,而重定向(Redirect)的話,就跟它的名字“重定向”一樣,跳到了另一個(gè)頁(yè)面(如hello.jsp),不再跟原來(lái)頁(yè)面(或者一個(gè)action、或者一個(gè)Servlet,或者JSP頁(yè)面)有任何瓜葛,不會(huì)保存原來(lái)頁(yè)面Request域的東西。還有一個(gè)表面上的區(qū)別就是:請(qǐng)求轉(zhuǎn)發(fā)(Dispatcher)到另一個(gè)頁(yè)面(如hello.jsp)后,地址欄里顯示的仍然是上一個(gè)頁(yè)面(這里稱頁(yè)面不太合適)的路徑(如hello.action),而重定向則顯示的是新跳到的那個(gè)頁(yè)面的路徑。大家自己測(cè)試一下,觀察一下,其實(shí)也挺容易理解的。
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程第一期——環(huán)境的搭建與HelloSimple介紹就到此,敬請(qǐng)期待下文!
實(shí)例項(xiàng)目名:SimpleWeb
內(nèi)容提要:
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(1):環(huán)境的搭建與HelloSimple
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(2):用戶登錄模塊的實(shí)現(xiàn)
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(3):新聞管理Model層的開(kāi)發(fā)(整合iBatis)
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(4):新聞管理模塊的實(shí)現(xiàn)
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(5):用戶注冊(cè)模塊(整合Jquery)
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(6):重寫(xiě)用戶登錄模塊(整合Jquery+JSON)
…… 其他內(nèi)容,如果大家需要,請(qǐng)跟我說(shuō)一下,我會(huì)考慮加入我的教程中。
原則:不要因技術(shù)而學(xué)技術(shù),而要根據(jù)需要而學(xué):Struts 2.x有些東西是不需要用或者很少用到的,在本教程中就沒(méi)有涉及到。
(7) 配置Tomcat服務(wù)器
這里以配置Tomcat 6.0為例。
選擇Server下面的Runtime Environments:
點(diǎn)擊右邊的“Add”按鈕,進(jìn)“New Server Runtime Environment”對(duì)話框,選擇我們要配置的Tomcat版本,這里選用了Tomcat v6.0,注意要與你下載的版本一致。
Next后進(jìn)入下圖:
在Tomcat installation directory右邊的Browse按鈕,點(diǎn)擊它,進(jìn)入本地磁盤(pán)目錄,選擇你的Tomcat安裝目錄,如下:
確定后,回到剛才那個(gè)對(duì)話框,點(diǎn)擊JRE右邊的Installed JREs按鈕,進(jìn)入下圖的界面:
如果這里已經(jīng)配置了JDK,則直接選擇即行,如果沒(méi)有配置的話,就點(diǎn)右邊的“Add”,添加一個(gè)標(biāo)準(zhǔn)的JRE
Next,下圖,點(diǎn)右邊的Directgry瀏覽本地文件系統(tǒng),找到JDK的安裝目錄。
好,確定 – finish,下一步,完成。如下圖:
(8) 項(xiàng)目的新建、添加jar包、運(yùn)行。
一般我們用這個(gè)工具來(lái)做Web項(xiàng)目,就建一個(gè)動(dòng)態(tài)Web工程吧:
如果上圖的選項(xiàng)中沒(méi)有Dynamic Web Project的話,可在最下面Other那里找到,又或者通過(guò)定制菜單將這一項(xiàng)顯示在這里,關(guān)于如何定制菜單,請(qǐng)看我的[圖解教程]Eclipse不可不知的用法之三:定制視圖與New菜單項(xiàng)。
進(jìn)入下圖界面,在Project name中輸入工程名,這里起名為“HelloWorld”,在Target runtime中選擇剛才我們配置的Tomcat 6.0服務(wù)器。如下圖:
行了,完成。
關(guān)于如何把外部的jar包引進(jìn)我們的項(xiàng)目中來(lái),這個(gè)其實(shí)很簡(jiǎn)單,復(fù)制那些jar文件,在下圖的lib目錄下右鍵粘貼即行。
關(guān)于如何運(yùn)行Web項(xiàng)目,Eclipse for JavaEE與MyEclipse的做法不同。
進(jìn)入下圖,找到我們配置的服務(wù)器:
Next – > finish即行。
好了,Eclipse系列圖解教程,到這里,暫告一段落,都是說(shuō)一些很基礎(chǔ)的東西,有什么不足之處,請(qǐng)大家多多包涵!
關(guān)于Eclipse中Axis2的配置方法,請(qǐng)看我的[圖解教程] Axis2與Eclipse整合開(kāi)發(fā)Web Service之一:簡(jiǎn)單的計(jì)算服務(wù)例子,下面來(lái)新建一個(gè)WSDL文件,如下圖:
改個(gè)名字為“manager.wsdl”,如下圖:
下一步,定義命名空間和協(xié)議等信息,默認(rèn)即行。如下圖:
finish后,會(huì)在主工作區(qū)出現(xiàn)如下圖:
這是manager.wsdl的圖形化形式,點(diǎn)擊“Source”會(huì)可查看到源代碼:
這是默認(rèn)生成的wsdl,我們要根據(jù)我們的項(xiàng)目需要,修改上面的圖,首先對(duì)方法名進(jìn)行修改,如下圖:
可見(jiàn),修改之后,右邊的input和output也跟著修改了,這兩個(gè)就是定義plus的輸入和輸出。
點(diǎn)擊input參數(shù)“plus”右邊的提示箭頭,進(jìn)入下圖:
就在這里定義輸入?yún)?shù)和和參數(shù)類(lèi)型等信息,因?yàn)槲覀僷lus(float x, float y)方法中有兩個(gè)參數(shù)x和y,故我們將上圖改成兩個(gè)參數(shù)的序列:
變成下圖,對(duì)比一下方法plus(float x, float y),下圖也不會(huì)太難理解吧!
我們返回manager.wsdl視圖,選擇output參數(shù)右邊的箭頭,進(jìn)入下圖:
我們?cè)谶@里設(shè)置float plus(float x, float y)方法的返回值及其類(lèi)型,因其返回值只有一個(gè),我們只須把上面的out的類(lèi)型改成我們方法中用的float,改后,如下圖:
有沒(méi)有注意到上圖左上角有個(gè) 圖標(biāo),點(diǎn)擊它,進(jìn)入下圖:
我們可以在這里對(duì)輸入輸出的參數(shù)及其他數(shù)據(jù)類(lèi)型進(jìn)行修改,如果在上面的操作過(guò)程中,不小心產(chǎn)生了多余的標(biāo)簽的話,也可以在這里去除。
好了,我們?cè)倩氐絤anager.wsdl,在源代碼視圖里右鍵選“Validate”,對(duì)xml文檔進(jìn)行檢驗(yàn),如果有錯(cuò)誤的,就根據(jù)需要修改。
好了,圖形化編寫(xiě)的wsdl文檔完成了,順便說(shuō)一下,方法是可以定義多個(gè)的,如下圖:
為簡(jiǎn)單起見(jiàn),我們就先以剛才做定義的那個(gè)方法為例,看看,如何根據(jù)wsdl文件,自動(dòng)生成Web Service的服務(wù)器端。
我們New一個(gè)Web Service,如下圖:
記得在Web Service type中選擇“Top down Java Bean Web Service”,如下圖:
然后,在Service definition中找到剛才寫(xiě)的那個(gè)manager.wsdl文件。
回到Web Service對(duì)話框,將服務(wù)類(lèi)型的滑塊調(diào)到“Develop service”處,
接下來(lái),就next –> next –-> finish就行。它會(huì)自動(dòng)生成Web Service服務(wù)端的接口和類(lèi),在類(lèi)中,可找到我們定義的方法:
我們只要修改方法plus的方法體,以實(shí)現(xiàn)我們要實(shí)現(xiàn)的功能即行。如下:
這是通過(guò)WSDL反向生成Web Service服務(wù)端的最簡(jiǎn)單一個(gè)例子,可能看不到有什么好處,沒(méi)有像[圖解教程] Axis2與Eclipse整合開(kāi)發(fā)Web Service之一:簡(jiǎn)單的計(jì)算服務(wù)例子那樣的簡(jiǎn)便快捷,但如果是一些特有的數(shù)據(jù)類(lèi)型,如List,Set,這些,我們有在WSDL圖形化設(shè)計(jì)中找到相應(yīng)的替代類(lèi)型,先定義WSDL再生成服務(wù)端接口,這樣做,不僅Java開(kāi)發(fā)客戶端是沒(méi)有問(wèn)題的,用C#開(kāi)發(fā)客戶端也能成功沒(méi)有出錯(cuò)!
但如果先開(kāi)發(fā)服務(wù)器端的話,如果用到一些Java特有的數(shù)據(jù)類(lèi)型,如List,Set,如果用其他語(yǔ)言生成的客戶端,就可能出問(wèn)題。同理,用C#開(kāi)發(fā)服務(wù)端,如果用到像DataSet這樣的返回類(lèi)型的話,那如果用Java或者其他語(yǔ)言去開(kāi)發(fā)客戶端,也可能會(huì)出現(xiàn)問(wèn)題的。
如果統(tǒng)一先寫(xiě)WSDL,再根據(jù)WSDL生成服務(wù)端和客戶端,應(yīng)該是一種很不錯(cuò)的做法,Eclipse在這方面的圖形化支持給帶給我們事半功倍的效果,這樣做,也比較符合SOA的做法。
(5)定制視圖
定制前的視圖:
菜單欄中Window –> Show View –> Other
進(jìn)入“Show View”對(duì)話框,在這里選擇須要顯示的視圖,點(diǎn)“OK”即行。
為測(cè)試,我選擇幾個(gè)常用的視圖,如:java/Package Explorer , Data Management/Data Source Explorer , General/Internet Web Browser , General/Console 等等。
定制后,我們將其拖放到想要放置的地方即行,顯示如下圖:
(6)定制New選項(xiàng)
原始的New選項(xiàng):
如果我們須要建的文件類(lèi)型不在上圖右邊的選項(xiàng)欄中的話,就需要點(diǎn)“Other”進(jìn)入下一個(gè)對(duì)話框去選擇,有沒(méi)有辦法使得右邊的選項(xiàng)欄中出現(xiàn)我們常常須要建的文件類(lèi)型,而去掉那些不常使用的呢?
點(diǎn)Window –> Customize Perspective:
進(jìn)入Customize Perspective -Web對(duì)話框,選擇最右邊的選項(xiàng)卡Shortcuts,在Submenus中選擇New,那么下面所列出的,若是選中的,則表示是在New菜單項(xiàng)中顯示的。我們逐個(gè)逐個(gè)來(lái),把要顯示的選中,把不要顯示的去掉。
定制后的New選項(xiàng):
只顯示我們常用的,簡(jiǎn)潔了許多吧。
(3)通過(guò)類(lèi)自動(dòng)生成它的接口:
在Spring應(yīng)用中,常常會(huì)用到“接口+實(shí)現(xiàn)類(lèi)”的形式,即要實(shí)現(xiàn)類(lèi)又要寫(xiě)一個(gè)方法差不多的接口,有時(shí)候感覺(jué)比較煩瑣。其實(shí),Eclipse可以根據(jù)類(lèi)自動(dòng)抽取出接口來(lái)。
PersonServiceImpl.java的代碼如下:
在上面代碼的空白處點(diǎn)右鍵,或者在PersonServiceImpl類(lèi)名上點(diǎn)右鍵 —> Refactor –> Extract Interface,如下圖:
在“在Extract Interface”對(duì)話框中,Interface name框中輸入接口名:PersonService,將addPerson和queryPerson方法鉤選上,如下圖:
點(diǎn)OK后,即可自動(dòng)生成PersonServiceImpl.java的接口類(lèi)PersonService.java,如下圖:
而再看看PersonServiceImpl類(lèi)代碼有了什么變化:
(4)自動(dòng)生成Junit測(cè)試類(lèi)
在類(lèi)名上點(diǎn)右鍵 –> New –> Other ,如下圖:
在新建對(duì)話框中,選擇Java >> Junit >> Junit Test Case
在“New Junit Test Case”對(duì)話框中,填寫(xiě)測(cè)試類(lèi)名,此處,用默認(rèn)(PersonServiceTest)即行,如果不想測(cè)試類(lèi)與PersonService類(lèi)置同一包下,可在Package中選擇指定的包來(lái)存放測(cè)試類(lèi),此處也默認(rèn)處理。如下圖:
點(diǎn)Next后進(jìn)入下圖,將要測(cè)試的方法鉤選中,F(xiàn)inish即行。
如果第一次建測(cè)試類(lèi),它要求加入JUnit的jar包,點(diǎn)OK即行。如下圖:
這時(shí),JUnit測(cè)試類(lèi)PersonServiceTest.java便自動(dòng)生成了,如下圖:
我們只須修改測(cè)試類(lèi)的方法的方法體,即可進(jìn)行測(cè)試。