BlogJava-心夢帆影Java技術博客http://www.ymeg.top/rongxh7/相信自己的人生有無限可能,把握每一個機會,全力以赴……zh-cnSun, 25 Aug 2019 06:34:30 GMTSun, 25 Aug 2019 06:34:30 GMT60Java可變參數方法重載時要注意的幾個問題http://www.ymeg.top/rongxh7/archive/2010/04/18/318698.html心夢帆影心夢帆影Sun, 18 Apr 2010 15:59:00 GMThttp://www.ymeg.top/rongxh7/archive/2010/04/18/318698.htmlhttp://www.ymeg.top/rongxh7/comments/318698.htmlhttp://www.ymeg.top/rongxh7/archive/2010/04/18/318698.html#Feedback0http://www.ymeg.top/rongxh7/comments/commentRss/318698.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/318698.htmlJDK1.5引進了方法的可變參數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似于JavaScript的arguments那樣的帶任意多個參數的方法。Java的可變參數,可用于普通方法上,也可以用于構造方法上,大大增大了我們所寫方法的適用范圍。


然而,使用可變參數時,要注意幾個問題:

 

1) 可變參數方法與數組參數方法重載時

 

public class MethodParams{
//帶可變參數的方法
public void hello(String ...params) {
System.out.println("執行帶可變參數的方法,參數個數為:" + params.length);
}
//帶數組參數的方法
public void hello(String[] params) {
System.out.println("執行帶數組參數的方法,數組長度為:" + params.length);
}
}

我們寫個測試代碼運行一下看看結果如何:

	MethodParams mp = new MethodParams();
mp.hello("AAA","BBB","CCC");

  編譯時報錯:

MethodParams.java:7: 無法在 MethodParams 中同時聲明 hello(java.lang.String[]) 和
hello(java.lang.String...)
public void hello(String[] params) {
^
1 錯誤

結論: JDK不允許存在, 帶可變參數的方法和帶數組參數的方法在同一類中重載。

可變參數==數組參數? 在帶可變參數的方法體時,讀取可變參數列表時,就是以數組的方式來讀取;

帶可變參數的方法可以傳入一個數組參數,但帶數組參數的方法卻不能傳入可變參數。

 

 

2) 可變參數方法與可變參數方法重載時

	//帶可變參數的方法
public void hello(String ...params) {
System.out.println("執行帶可變參數的方法,參數個數為:" + params.length);
}
//帶固定參數和可變參數
public void hello(String param1, String ...params) {
System.out.println("執行帶固定參數和可變參數的方法,參數個數為:" + params.length);
}

  測試代碼跟上例中一樣,編譯時報錯:

MethodParams.java:18: 對 hello 的引用不明確,MethodParams 中的 方法 hello(java.l
ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String
...) 都匹配
mp.hello("AAA","BBB","CCC");
^
1 錯誤

 結論:JDK不允許存在,帶相同參數類型列表(Type List)的參數列表的方法在同一類中重載。

 

 

3)可變參數方法與無參數方法重載時

	//帶可變參數的方法
public void hello(String ...params) {
System.out.println("執行帶可變參數的方法,參數個數為:" + params.length);
}
//不帶參數的方法
public void hello() {
System.out.println("執行不帶參數的方法");
}

我們都知道,可變參數即可帶0個或者多個參數,如果帶0個參數即不帶參數時,JDK會怎么處理呢?

那我們就以執行"mp.hello()"來測試一下。編譯通過,運行正常,調用的還帶參數的hello()方法。

結論:當可變參數方法與不帶參數的方法重載時,JDK默認調用的是無參數的方法。若類中沒有定義無參數的方法,則會調用可變參數的方法。



心夢帆影 2010-04-18 23:59 發表評論
]]>
Java的代理模式(通過公共接口實現)http://www.ymeg.top/rongxh7/archive/2010/03/31/317070.html心夢帆影心夢帆影Wed, 31 Mar 2010 08:00:00 GMThttp://www.ymeg.top/rongxh7/archive/2010/03/31/317070.htmlhttp://www.ymeg.top/rongxh7/comments/317070.htmlhttp://www.ymeg.top/rongxh7/archive/2010/03/31/317070.html#Feedback2http://www.ymeg.top/rongxh7/comments/commentRss/317070.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/317070.html
/**
 * 代理子類和目標子類的公共接口
 * 
@author rongxinhua
 *
 
*/
public interface MyInterface {
    
    
public void doOperation();

}

/**
 * 目標子類
 * 
@author rongxinhua
 *
 
*/
public class RealClass implements MyInterface {

    
/**
     * 我們要執行的目標方法
     
*/
    @Override
    
public void doOperation() {
        System.out.println(
"doOperation");
    }

}

而在沒有使用代理模式的情況下,我們是這樣執行目標方法的:
        RealClass realObj = new RealClass();
        realObj.doOperation();    
//調用目標方法
打印時輸出:
doOperation


而我們要加入額外的處理的話,就可以使用代理類了:
/**
 * 代理子類
 * 
@author rongxinhua
 *
 
*/
public class ProxyClass implements MyInterface {

    
private MyInterface realObj;    //目標子類對象
    
    
public ProxyClass(MyInterface realObj) {
        
this.realObj = realObj;
    }
    
    
/**
     * 調用目標子類的方法,并在其中加入了前置處理和后置處理
     
*/
    @Override
    
public void doOperation() {
        doBefore();
        realObj.doOperation();
        doAfter();
    }
    
    
/**
     * 目標方法調用前的相關處理
     
*/
    
private void doBefore() {
        System.out.println(
"doBefore");
    }
    
    
/**
     * 目標方法調用后的相關處理
     
*/
    
private void doAfter() {
        System.out.println(
"doAfter");
    }

}

有了代理類,我們可以這樣執行目標方法:
        ProxyClass proxyObj = new ProxyClass(new RealClass());
        proxyObj.doOperation();    
//通過代理對象調用doOperation方法

打印時輸出:
doBefore
doOperation
doAfter

本文只是代理模式的在Java中的簡單使用,而代理模式與Java反射機制的整合,為Java組件開發增加了強大的生命力,有興趣的朋友可看我另一個博客中的文章:探討代理模式與Java反射機制的應用



心夢帆影 2010-03-31 16:00 發表評論
]]>
舍友筆試中的一道算法題(我的解法)http://www.ymeg.top/rongxh7/archive/2010/03/23/316228.html心夢帆影心夢帆影Mon, 22 Mar 2010 18:04:00 GMThttp://www.ymeg.top/rongxh7/archive/2010/03/23/316228.htmlhttp://www.ymeg.top/rongxh7/comments/316228.htmlhttp://www.ymeg.top/rongxh7/archive/2010/03/23/316228.html#Feedback8http://www.ymeg.top/rongxh7/comments/commentRss/316228.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/316228.html
題目大意:輸入一個字符串,顯示出字符串的所有排列。例如:輸入"abc",就得輸出"abc"、"acb"、"bac"、"bca"、"cab"、"cba" 所有可能的序列。

頗有意義的一道題,我決定用Java語言來寫一寫。代碼如下:
import java.util.Arrays;
public class CharList {

    
//遍歷所有可能的排列結果
    public static void traversal(char[] chss, int index){
        
//for循環,從index位置開始向前(向右), index位置的數與i位置的數互換
        for(int i = index; i < chss.length; i ++) {
            
char[] chs = Arrays.copyOf(chss, chss.length);    //Copy出新數組(為了修改其值時互不影響)
            char temp = chs[index];
            chs[index] 
= chs[i];
            chs[i] 
= temp;
            
if(index == chs.length-1) {    //到了字符串末, 輸出結果
                System.out.println(new String(chs));
                
break;    //跟出此次循環, 此traversal方法執行完畢,跳回上一級循環(在上一個方法體中)
            }
            traversal(chs, index
+1);        //遞歸
        }
    }

    
//Test
    public static void main(String[] args) {
        String str 
= "abcd";
        
char[] chs = str.toCharArray();    //轉成字符數組
        traversal(chs, 0);
    }

}

程序執行,輸出結果為:
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc


心夢帆影 2010-03-23 02:04 發表評論
]]>
18位身份證驗證小組件idchecker發布http://www.ymeg.top/rongxh7/archive/2010/01/03/308097.html心夢帆影心夢帆影Sun, 03 Jan 2010 10:43:00 GMThttp://www.ymeg.top/rongxh7/archive/2010/01/03/308097.htmlhttp://www.ymeg.top/rongxh7/comments/308097.htmlhttp://www.ymeg.top/rongxh7/archive/2010/01/03/308097.html#Feedback2http://www.ymeg.top/rongxh7/comments/commentRss/308097.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/308097.html下載地址:http://codeshop.googlecode.com/files/idchecker.zip

提供給外部調用的cn.idchecker.check.Checker類的相關方法如下表:

方法 方法作用 參數及返回值
Checker(String num) 構造方法 參數num為18位身份證號碼的字符串
boolean checkLength() 驗證身份證長度是否正確 長度為18,則返回true,否則返回false
boolean checkBirth() 驗證出生生日碼是否合法 合法則返回true,否則返回false
boolean checkAddr() 驗證地址碼是否存在 存在則返回true,否則返回false
boolean checkCheckCode() 計算校驗碼是否正確 正確則返回true,否則返回false
boolean check() 總的身份證驗證,驗證順序:長度 -> 生日 -> 最后一位校驗碼 -> 地址 若遇到有一項目不合法即返回false,所有驗證通過才返回true。驗證后,可通過調用getErrorMsg()方法獲取錯誤信息
boolean checkAll() 總的身份證驗證,驗證項目包括長度、地址、生日、最后一位校驗碼 身份證合法則返回true,否則false。驗證后,可調用getErrorMsgs()方法獲取錯誤信息集合
String getBirth() 獲取出生年月日 返回“2010年01月12日”格式的生日字符串通串
String getAddr() 獲取公民籍貫 返回籍貫字符串("xx省xx市xx縣”)
String getSex() 獲取性別 返回“男”或“女”
String getErrorMsg() 獲取錯誤信息 返回錯誤信息字符串
public Set<String> getErrorMsgs() 獲取錯誤信息集合 返回錯誤信息集合

用法舉例 1 :解壓縮“idchecker.zip”,將其目錄下的“idchecker.jar” 包引進Java Project中,以下是測試程序:

public class TestChecker { 

    
public static void main(String[] args) {
        Checker checker 
= new Checker("44010619860710145X");
        System.out.println(
"出生年月日  : " + checker.getBirth());
        System.out.println(
"性別  :" + checker.getSex());
        System.out.println(
"居民地址  : " + checker.getAddr());
        System.out.println(
"身份證號碼是否合法 : " + checker.check() + "  " + checker.getErrorMsg());
        checker.checkAll();    
        
for(String msg : checker.getErrorMsgs()) {
            System.out.print(msg 
+ " | ");
        }
    } 

}


運行結果:

出生年月日  : 1986年07月10日
性別  :男
居民地址  : 廣東省廣州市天河區 
身份證號碼是否合法 : true  


用法舉例 2 :將“idchecker.jar” 包引進到Web Project的lib目錄下,以下是測試程序:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>測試idchecker組件</title>
</head>
<body>
<h1>身份證驗證</h1>
<%
    
String id = request.getParameter("ID");
    
if(id != null && !"".equals(id.trim())){
        cn.idchecker.check.Checker checker 
= new cn.idchecker.check.Checker(id);
        
if(checker.check()) {
            out.print(checker.getSex() 
+ "<br/>");
            out.print(checker.getBirth() 
+ "<br/>");
            out.print(checker.getAddr());
        } 
else {
            out.print(
"身份證不合法!" + "<br/>");
            out.print(checker.getErrorMsg());
        }
    } 

%>
<form action="input.jsp" method="post">
    身份證號碼 :
<input name="ID" type="text" value="<%=id %>"/>&nbsp;&nbsp;
    
<input type="submit" value="驗證"/>
</form>
</body>
</html>
 


運行結果:

 image image



心夢帆影 2010-01-03 18:43 發表評論
]]>
寫個觀察者模式(Observer Pattern)的例子http://www.ymeg.top/rongxh7/archive/2009/12/20/306737.html心夢帆影心夢帆影Sun, 20 Dec 2009 11:37:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/12/20/306737.htmlhttp://www.ymeg.top/rongxh7/comments/306737.htmlhttp://www.ymeg.top/rongxh7/archive/2009/12/20/306737.html#Feedback3http://www.ymeg.top/rongxh7/comments/commentRss/306737.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/306737.html閱讀全文

心夢帆影 2009-12-20 19:37 發表評論
]]>
DIV+CSS布局中自適應高度和寬度http://www.ymeg.top/rongxh7/archive/2009/12/14/305828.html心夢帆影心夢帆影Sun, 13 Dec 2009 18:19:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/12/14/305828.htmlhttp://www.ymeg.top/rongxh7/comments/305828.htmlhttp://www.ymeg.top/rongxh7/archive/2009/12/14/305828.html#Feedback7http://www.ymeg.top/rongxh7/comments/commentRss/305828.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/305828.htmlDIV+CSS布局,應用越來越普遍,小的個人主頁、大的門戶網站,很多都采用了DIV+CSS布局。在設計過程中,有時會遇到一些問題,要注意一下。且看下面的網頁截圖:

未命名

從截圖中, 我們可看出,

問題1:右邊的內容多時,會導致左邊露空白;或者左邊內容多時,會導致右邊露空白。怎么解決?

問題2:右邊那一大塊層的寬度應該設置多少呢?設置小了,會與右邊界不對齊,設置大了,整塊層會被擠到下一行去。怎么辦?

其實,兩個問題,都可歸結到同一個問題,即如何使得層的高度或寬度達到自適應的效果?

且看下面的HTML和CSS代碼,詳細講解在CSS代碼注釋中:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        
<title>New Web Project</title>
        
<link rel="stylesheet" type="text/css" href="index.css" />
    
</head>
    
<body>
        
<div id="container">
            
<div id="header"></div>
            
<div id="middleBody">
                
<div id="sider" class="column">
                    
<p>心夢帆影</p>
                    
<p>心夢帆影</p>
                
</div>
                
<div id="content" class="column">
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>
                    
<p>http://www.ymeg.top/rongxh7</p>                    
                
</div>
            
</div>
            
<div id="footer"></div>
        
</div>
    
</body>
</html>


body {
    margin-top
:0px;    /* 去除網頁上邊空白 */
}
/* 大容器,包含下面所有層 */
#container 
{
    width
:800px;
    margin
:0px auto;    /* 居中 */
}
/* 頭部 */
#header 
{
    width
:100%;
    height
:100px;
    background
:#FFE1FF;
}
/* 中部,包括左邊區(sider)和右邊內容區(content) */
#middleBody 
{
    width
:100%;
    overflow
:hidden;    /* 隱藏超出的部分 */
}
/* 左邊 */
#sider 
{
    width
:200px;
    float
:left;
    background
:#FFE4E1;
}
/* 右邊主內容區 */
#content 
{
    
/* 此兩行是#content自適應寬度的關鍵,旨在與右邊界對齊,且不被擠到下面去 */
    padding-right
:10000px;
    margin-right
:-10000px;
    float
:left;
    background
:#FFFAF0;
}
/* #sider和#content共同屬性,此為自適應高度的關鍵,旨在#sider和#content下邊界對齊,且不會露白*/
.column 
{
    padding-bottom
:20000px;
    margin-bottom
:-20000px;
}
/* 底部 */
#footer
{
    clear
:left;    /* 防止float:left對footer的影響 */
    width
:100%;
    height
:80px;
    background
:#FFE4B5;
}

運行截圖如下:

image



心夢帆影 2009-12-14 02:19 發表評論
]]>
Div+CSS布局的寬度計算及在各瀏覽器中的差異比較http://www.ymeg.top/rongxh7/archive/2009/12/14/305827.html心夢帆影心夢帆影Sun, 13 Dec 2009 16:39:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/12/14/305827.htmlhttp://www.ymeg.top/rongxh7/comments/305827.htmlhttp://www.ymeg.top/rongxh7/archive/2009/12/14/305827.html#Feedback1http://www.ymeg.top/rongxh7/comments/commentRss/305827.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/305827.html對比于傳統的表格布局和框架布局,DIV+CSS布局有著布局容易、改版方便、樣式定義靈活、HTML代碼簡潔清晰、易于JavaScript操控等優點。在眾口皆碑的同時,對于一些初學者,總會遇到各種各樣的問題,比如說DIV的寬度或高度的計算問題。

我們來探討一下影響DIV寬度或高度的屬性有哪些?

DIV的寬度 = width + padding + border + margin

僅從一條公式上看,可能有點難理解,我們通過測試代碼和截圖來觀察一下。為了測試結果觀察直觀,我們只測試一邊,即左邊,即本來padding、border、margin的寬度計算,都是左右兩邊都算在內的,這里就只測試左邊,右邊同理。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        
<title>測試DIV的寬度</title>
        
<style type="text/css">
            #container 
{
                
/* 左參考線 */
                border-left
:1px solid #B23AEE;
            
}
            
/* 定義各個層的公共屬性 */
            #div1,#div2,#div3,#div4
{
                width
:200px;
                height
:50px;
                background
:#FFE1FF;
                margin-bottom
:5px;
            
}
            
/* 只有width */
            #div1
{
            
}
            
/* 加上border */
            #div2
{
                border-left
:10px solid red;
            
}
            
/* 加上border和padding */
            #div3
{
                border-left
:10px solid red;
                padding-left
:50px;
            
}
            
/* 加上border、padding和margin */
            #div4
{
                border-left
:10px solid red;
                padding-left
:50px;
                margin-left
:50px;
            
}
        
</style>
    
</head>
    
<body>
        
<div id="container">
            
<div id="div1">
                心夢帆影心夢帆影心夢帆影心夢帆影心夢帆影
            
</div>
            
<div id="div2">
                心夢帆影心夢帆影心夢帆影心夢帆影心夢帆影
            
</div>
            
<div id="div3">
                心夢帆影心夢帆影心夢帆影心夢帆影心夢帆影
            
</div>
            
<div id="div4">
                心夢帆影心夢帆影心夢帆影心夢帆影心夢帆影
            
</div>
        
</div>
    
</body>
</html>

我們在Firefox中測試,截圖如下:

image

我們來分析一下DIV4,如下圖:

image

對照上面的代碼和截圖,我們可以清楚地理解“div的寬度 = width + padding + border + margin”這條公式。

對于Web前端開發者來說,最頭痛的事情就是因瀏覽器的差異而引起的網頁顯示效果的差異,而對于這條寬度計算公式,在其他瀏覽器中會不會有不兼容的問題呢?

幸好,大部分常用的瀏覽器,我機器上都安裝了,測試結果是:在Firefox、Opera、Google、IE8、IE7顯示都跟上面的截圖一樣,也就是說,在這些瀏覽器中,寬度的計算公式是:

DIV的寬度 = width + padding + border + margin

 

而在IE6中測試,結果卻不是這樣,請看運行截圖:

image

由上圖可以看出,在IE6的寬度計算是:

DIV的寬度 = width + margin

而border和padding,是占用了width的位置。這一點,在前端開發中要注意。



心夢帆影 2009-12-14 00:39 發表評論
]]>
原創一道Java筆試面試題考考大家http://www.ymeg.top/rongxh7/archive/2009/11/28/303990.html心夢帆影心夢帆影Fri, 27 Nov 2009 19:21:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/11/28/303990.htmlhttp://www.ymeg.top/rongxh7/comments/303990.htmlhttp://www.ymeg.top/rongxh7/archive/2009/11/28/303990.html#Feedback24http://www.ymeg.top/rongxh7/comments/commentRss/303990.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/303990.html 以下代碼有些朋友可能會似曾熟識,可能也算不上“原創”,請見諒!
不過,我出的這題,確定有點意思,考考大家。
/**
 * 父類
 * 
@author rongxinhua
 *
 
*/
public class Father{
    
private String name="FATHER";
    
public Father(){
        whoAmI();
        tellName(name);
    }
    
public void whoAmI(){
        System.out.println(
"Father says, I am " + name);
    }
    
public void tellName(String name){
        System.out.println(
"Father's name is " + name);
    }
}

/**
 * 子類
 * 
@author rongxinhua
 *
 
*/
public class Son extends Father{
    
private String name="SON";
    
public Son(){
        whoAmI();
        tellName(name);
    }
    
public void whoAmI(){
        System.out.println(
"Son says, I am " + name);
    }
    
public void tellName(String name){
        System.out.println(
"Son's name is " + name);
    }
}

問題:當執行 Father who = new Son(); 時,會輸出什么?
如果你去參加一個公司的筆試或面試時問了這么一道題,在沒有環境測試的情況下,你會猜測什么答案?



心夢帆影 2009-11-28 03:21 發表評論
]]>
CSS的position:fixed的使用http://www.ymeg.top/rongxh7/archive/2009/11/22/303225.html心夢帆影心夢帆影Sun, 22 Nov 2009 06:58:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/11/22/303225.htmlhttp://www.ymeg.top/rongxh7/comments/303225.htmlhttp://www.ymeg.top/rongxh7/archive/2009/11/22/303225.html#Feedback25http://www.ymeg.top/rongxh7/comments/commentRss/303225.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/303225.html接觸CSS已有相當長一段時間,我們竟然沒有留意position:fixed的用法。

我們都知道CSS中定位屬性position的值,除了默認的值外,還有absolute,relative和fixed。我平時比較常用absolute和relative,而position:fixed卻沒多關注。或許是因為當初在CSS中文手冊中看到position:fixed旁邊有說明“IE5.5及NS6尚不支持此屬性”吧。

前段時間,在做一個項目時需要使一個層相對于瀏覽器邊框固定,那時用position:absolute試了下,發覺absolute是對網頁邊框而言的。后來,上網查了一些根據滾動條的移動,動態地改變left和top的值的JavaScript語句,雖然能實現了類似的效果,但滾動條移動時,那個層晃來晃去的,感覺不好看,想要一種能使層固定不動的做法。

且看下面的代碼:

<style type="text/css">
<!--
#help{
    width:30px;
    height:20px;
    background-color:green;
    position:fixed;
    left:60px;
    top:100px;
}
-->
</style>

我們用上面這段代碼來定義頁面上的一個層“help”(id=“help”)。這樣就能實現我們想要的效果了。

在IE8、Firefox、Opera、Google等瀏覽器中測試,都沒有問題,唯獨低版本的IE中,這個屬性無效。



心夢帆影 2009-11-22 14:58 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(6):重寫用戶登錄模塊(整合Jquery+JSON)http://www.ymeg.top/rongxh7/archive/2009/08/14/291207.html心夢帆影心夢帆影Fri, 14 Aug 2009 14:32:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/08/14/291207.htmlhttp://www.ymeg.top/rongxh7/comments/291207.htmlhttp://www.ymeg.top/rongxh7/archive/2009/08/14/291207.html#Feedback10http://www.ymeg.top/rongxh7/comments/commentRss/291207.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/291207.html閱讀全文

心夢帆影 2009-08-14 22:32 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(5):用戶注冊模塊(整合Jquery)http://www.ymeg.top/rongxh7/archive/2009/08/01/289402.html心夢帆影心夢帆影Sat, 01 Aug 2009 08:16:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/08/01/289402.htmlhttp://www.ymeg.top/rongxh7/comments/289402.htmlhttp://www.ymeg.top/rongxh7/archive/2009/08/01/289402.html#Feedback11http://www.ymeg.top/rongxh7/comments/commentRss/289402.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/289402.html閱讀全文

心夢帆影 2009-08-01 16:16 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(4):新聞管理模塊的實現http://www.ymeg.top/rongxh7/archive/2009/07/27/288495.html心夢帆影心夢帆影Sun, 26 Jul 2009 17:14:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/27/288495.htmlhttp://www.ymeg.top/rongxh7/comments/288495.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/27/288495.html#Feedback2http://www.ymeg.top/rongxh7/comments/commentRss/288495.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/288495.html閱讀全文

心夢帆影 2009-07-27 01:14 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(3):新聞管理Model層的開發(整合iBatis)http://www.ymeg.top/rongxh7/archive/2009/07/26/288414.html心夢帆影心夢帆影Sat, 25 Jul 2009 19:02:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/26/288414.htmlhttp://www.ymeg.top/rongxh7/comments/288414.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/26/288414.html#Feedback9http://www.ymeg.top/rongxh7/comments/commentRss/288414.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/288414.html閱讀全文

心夢帆影 2009-07-26 03:02 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(2):用戶登錄模塊的實現http://www.ymeg.top/rongxh7/archive/2009/07/21/287554.html心夢帆影心夢帆影Mon, 20 Jul 2009 16:14:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/21/287554.htmlhttp://www.ymeg.top/rongxh7/comments/287554.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/21/287554.html#Feedback2http://www.ymeg.top/rongxh7/comments/commentRss/287554.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/287554.html用戶登錄幾乎是每一個Web系統的必需模塊,本期教程就通過用戶登錄模塊來講解Struts2.1.6的Action和Result的Annotation配置。

上期的Struts 2.1.6 精簡實例系列教程(1):環境的搭建與HelloSimple中,我們建的package名為“cn.simple.action”,這些包名有一個規則的,只要包含“action,actions,struts,struts2”都會默認被掃描到為Action類,也就是說,我們只要配置了如“cn.simple.action”、“cn.simple.struts”、“cn.simple.action.admin”等包名,就可以不用在配置文件struts.xml(Struts2.0的配置文件)中配置這些Action類了。當然,這些包名,也可以是別的,但要寫一點點配置,我們就用默認的吧。關于這方面的詳細說明,還是強烈建議大家先看官方的文檔http://struts.apache.org/2.1.6/docs/convention-plugin.html

好,我們開始寫我們的用戶登錄模塊吧。先寫個loginform.jsp,記得,不要忘記我們把JSP文件放在Web-Inf/content/目錄下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄頁</title>
</head>
<body>

<s:fielderror></s:fielderror>

<form action="login.action" method="post">
    賬號<input type="text" name="loginName" value="${loginName}"/><br/>
    密碼<input type="password" name="password"><br/>
    <input type="submit" value="登錄"/>
</form>

</body>
</html>

大家如果想用Struts 2的標簽庫的話,也可以用Struts 2的Form標簽,用之前,要在JSP頭配置上Struts 2標簽庫,換成Struts 2標簽的版本后,即:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<s:fielderror></s:fielderror>

<s:form action="login">
    <s:textfield name="loginName"></s:textfield>
    <s:password name="password"></s:password>
    <s:submit value="登錄"></s:submit>
</s:form>

</body>
</html>

接著,我們寫一個登錄處理的Action類:loginAction.java,代碼如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;

@Results({
    @Result(name="success", location="admin/index.action", type="redirect"),
    @Result(name="input", location="loginform.jsp", type="dispatcher")
})

public class LoginAction extends ActionSupport {

    private String loginName;
    private String password;
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    @Override
    public void validate() {
        if( ! "simple".equals(loginName)){
            addFieldError("loginName", "登錄名不正確!");
        }else if(! "simple".equals(password)){
            addFieldError("password", "密碼不正確!");
        }
    }

    //*******Getter和Setter方法***********//
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

解釋一下這個類吧:

execute 這個方法是重寫了父類ActionSupport的方法,是Action默認會執行的方法,即訪問…/login.action或者…/login,它默認會執行這個方法。

validate 在執行execute方法之前,它會先執行validate這個方法,檢查登錄框是否輸入正確,這個方法也是重寫了父類的validate方法。

getter和setter,有了setter方法,才能使action能拿到上一個JSP頁面傳過來的Request域的數據;有了getter方法,下一個轉發(dispatcher)過去的頁面才能拿到此Action的Request域的數據。

執行過程是這樣:表單提交給LoginAction,LoginAction先執行validate方法,檢驗loginName和password是否符合要求,如果不符合,就會addFieldError (把錯誤信息放到Field棧里),如果Field棧里有錯誤信息的話,它就不會再執行execute方法,直接轉發(Dispatcher)到INPUT即“input”所指定的錯誤處理頁面,這里為location="loginform.jsp",即讓它返回到表單登錄頁去,如果剛才validate方法中驗證正確,即Field棧中沒有錯誤信息,就會執行execute方法。在這里execute返回SUCCESS,即“success”,根據Result注解,就會重定向到admin/index.action這個action。

返回SUCCESS重定向到的后臺主頁,其實簡單,admin/index.jsp,代碼很簡單,就在HTML中顯示一句“登錄成功”,代碼略。

這些的目錄結構如下:

image

運行一下吧:

image

image

image

一點提醒:本項目網頁的排版以精簡為主,在真實的網站開發中,建議用Dreamweaver可視化排版,再作必要的修改和嵌入必要的動態標簽。

“Struts 2.1.6 精簡實例系列教程(2):用戶登錄模塊的實現” 講解就到此,你也試一下吧,好,敬請關注下文!



心夢帆影 2009-07-21 00:14 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(1):環境的搭建與HelloSimplehttp://www.ymeg.top/rongxh7/archive/2009/07/18/287258.html心夢帆影心夢帆影Sat, 18 Jul 2009 09:27:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/18/287258.htmlhttp://www.ymeg.top/rongxh7/comments/287258.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/18/287258.html#Feedback10http://www.ymeg.top/rongxh7/comments/commentRss/287258.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/287258.html下載Struts2.1.6,網址http://struts.apache.org/download.cgi#struts216,點擊下圖中選中的部分即可下載。

image

下載Eclipse for JavaEE(3.4 or 3.5),網址http://www.eclipse.org/downloads/,點擊下圖選中的鏈接,進入下一個頁面,找到能夠下載的地方下載就行。

image

JDK6.0和Tomcat6.0,請大家自行下載。

另外,建議下載JSP標準標準庫JSTL,下載地址:/Files/rongxh7/jstl-jar.rar

好,暫時下載這些,以后,需要用到其他的時,再下載。至于JDK6.0,Tomcat6.0,Eclipse的安裝,請大家自行安裝,在這里就不演示安裝過程了,如有什么問題,再聯系我。

關于Eclipse的部分用法,如在Eclipse里配置Tomcat服務器,新建動態Web項目等,請看我的(Eclipse圖解教程),或者上網找一下其他的資料學習一下。

來開始我們的項目吧,先做個簡單的測試,New一個Dynamic Web Project,起名為“SimpleWeb”,將Struts2.1.6的下載包解壓后得到的lib目錄,在lib目錄下,找到以面的jar包:

xwork-2.1.2.jar
struts2-core-2.1.6.jar
struts2-convention-plugin-2.1.6.jar
ognl-2.6.11.jar
freemarker-2.3.13.jar
commons-loggin-1.0.4.jar
commons-fileupload-1.2.1.jar

把這些包放進項目的lib目錄下,同時,建議也把JSTL的核心jar包也放到lib目錄,這些JSTL的包主要有:

jstl.jar
standard.jar

我們先要在項目WEB-INF下的web.xml文件中配置Struts2應用,配置后,web.xml全部代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SimpleWeb</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>

</web-app>

我們在項目的WEB-INF目錄下新建一個文件夾命名為“content”,這個文件夾名一定要這樣,如果寫成別的,要另外配置一下,但初學的話,就按它默認的吧。我們新建的這個content目錄,就是專門用來放JSP文件的。

我們在content目錄下建一個JSP文件,命名為“hello.jsp”,內容可以很簡單,就在里面寫一個簡單的話:Hello SImple,代碼略。

這時,整個項目的文件夾視圖如下:

image

我運行Tomcat服務器,測試一下Struts2配置能不能用。首先我們在地址欄輸入:http://localhost:8060/SimpleWeb/hello.jsp ,很遺憾,不管用了,報錯了:HTTP Status 404 - The requested resource (/SimpleWeb/hello.jsp) is not available.截圖如下:

image

正確的做法是,輸入地址: http://localhost:8060/SimpleWeb/hello.action 或者http://localhost:8060/SimpleWeb/hello 如果出現如下結果,就說明Struts2配置成功了。

image

 

注意一點,這只是在WEB-INF/content目錄下的文件是通過這種方式訪問的;如果不是在這目錄下,而在項目目錄下,即Eclipse對應項目的WebContent下,就不能這樣訪問了。舉例說,在項目根目錄下建個hello.jsp的文件,則我們只能通過http://localhost:8060/SimpleWeb/hello.jsp來訪問。

能通過hello.action或者hello訪問WEB-INF/content下的hello.jsp,這種做法,是Struts2.1.6跟Struts2.0不同之處之一。使用時請確保你使用的Struts版本是2.1.6+。相關的命名規范與默認的action匹配規則,請參考官方的文檔:http://struts.apache.org/2.1.6/docs/convention-plugin.html

我們再新建一個Java類,命名為HelloAction,此類須繼承com.opensymphony.xwork2.ActionSupport,代碼如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;


public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("HelloAction execute ... ");
        return SUCCESS;
    }
}

讓我們再次訪問:http://localhost:8060/SimpleWeb/hello.action 或者http://localhost:8060/SimpleWeb/hello 

可以看出,在Eclipse的控制臺確定打印出了以下信息,這說明,訪問請求確定經過了HelloAction類。

image

同時頁面是跳到了WEB-INF/content/hello.jsp文件(如下圖),這說明請求的確是從HelloAction類轉發到了hello.jsp。

image

看來,好像在不做什么配置,Struts2.1.6也會找到名為HelloAction的類來處理…/hello.action或者…/hello的請求,而好像也沒有做什么配置,HelloAction會自動將請求轉發給名為hello.jsp的頁面,這正是Struts2.1.6的妙用之處,全賴struts2-convention-plugin-2.1.6.jar這個插件,具體了解,可看我上面提供的官方鏈接,或者看這位帥哥的翻譯之作:struts2采用convention-plugin實現零配置

看了上面的HelloAction的代碼若感到莫名其妙的話,我這里把那些默認的、約定俗成的代碼也寫出來,這樣,修改后的HelloAction類如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;

@Results({
    @Result(name="success",location="hello.jsp",type="dispatcher")
})

public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("HelloAction execute ... ");
        return SUCCESS;
    }
}

這樣就容易明白許多了。解釋如下:

name = “success” 跟 Action里的execute()方法的返回值SUCCESS(也可寫成“success”)對應,即若此Action類一旦返回SUCCESS,就會跳到對應的這個Result去處理。
location = “hello.jsp”,表示請求由這個Action跳轉到hello.jsp這個頁面。
type = “dispathcer”,表示轉發方式,具體解釋見下面。


其中type=”dispatcher”表示請求轉發,還有另一種常用的叫做type=”redirect”重定向,在下文會出現。Struts2的請求轉發和重定向的區別其實跟Java Servlet里的是差不多的。Servlet里與其功能等價的的代碼片斷如下:

request.getRequestDispatcher("hello.jsp").forward(request, response);    //請求轉發
response.sendRedirect("hello.jsp");    //重定向

兩者的區別可以這樣理解:請求轉發(Dispatcher)在轉發到的另一頁面(如hello.jsp)還能保留Request域里的東西,而重定向(Redirect)的話,就跟它的名字“重定向”一樣,跳到了另一個頁面(如hello.jsp),不再跟原來頁面(或者一個action、或者一個Servlet,或者JSP頁面)有任何瓜葛,不會保存原來頁面Request域的東西。還有一個表面上的區別就是:請求轉發(Dispatcher)到另一個頁面(如hello.jsp)后,地址欄里顯示的仍然是上一個頁面(這里稱頁面不太合適)的路徑(如hello.action),而重定向則顯示的是新跳到的那個頁面的路徑。大家自己測試一下,觀察一下,其實也挺容易理解的。

Struts 2.1.6 精簡實例系列教程第一期——環境的搭建與HelloSimple介紹就到此,敬請期待下文!



心夢帆影 2009-07-18 17:27 發表評論
]]>
Struts 2.1.6 精簡實例系列教程(正在發表中,敬請關注~~)http://www.ymeg.top/rongxh7/archive/2009/07/04/285449.html心夢帆影心夢帆影Sat, 04 Jul 2009 03:55:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/04/285449.htmlhttp://www.ymeg.top/rongxh7/comments/285449.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/04/285449.html#Feedback7http://www.ymeg.top/rongxh7/comments/commentRss/285449.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/285449.html教程別名:基于Struts 2.1.6 的SimpleWeb小項目開發教程

實例項目名:SimpleWeb

內容提要:

Struts 2.1.6 精簡實例系列教程(1):環境的搭建與HelloSimple

Struts 2.1.6 精簡實例系列教程(2):用戶登錄模塊的實現

Struts 2.1.6 精簡實例系列教程(3):新聞管理Model層的開發(整合iBatis)

Struts 2.1.6 精簡實例系列教程(4):新聞管理模塊的實現

Struts 2.1.6 精簡實例系列教程(5):用戶注冊模塊(整合Jquery)

Struts 2.1.6 精簡實例系列教程(6):重寫用戶登錄模塊(整合Jquery+JSON)

 

…… 其他內容,如果大家需要,請跟我說一下,我會考慮加入我的教程中。

 

原則:不要因技術而學技術,而要根據需要而學:Struts 2.x有些東西是不需要用或者很少用到的,在本教程中就沒有涉及到。



心夢帆影 2009-07-04 11:55 發表評論
]]>
[圖解教程]Eclipse不可不知的用法之四:配置服務器與項目的新建運行http://www.ymeg.top/rongxh7/archive/2009/07/02/285241.html心夢帆影心夢帆影Thu, 02 Jul 2009 12:53:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/02/285241.htmlhttp://www.ymeg.top/rongxh7/comments/285241.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/02/285241.html#Feedback0http://www.ymeg.top/rongxh7/comments/commentRss/285241.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/285241.html這么有失水準的文章,真不好意思再寫了。但畢竟還是有些初學者不熟悉,截些圖來看一下配置服務器的過程吧。

(7) 配置Tomcat服務器

這里以配置Tomcat 6.0為例。

image

選擇Server下面的Runtime Environments:

image

點擊右邊的“Add”按鈕,進“New Server Runtime Environment”對話框,選擇我們要配置的Tomcat版本,這里選用了Tomcat v6.0,注意要與你下載的版本一致。

image

Next后進入下圖:

image 

在Tomcat installation directory右邊的Browse按鈕,點擊它,進入本地磁盤目錄,選擇你的Tomcat安裝目錄,如下:

image

確定后,回到剛才那個對話框,點擊JRE右邊的Installed JREs按鈕,進入下圖的界面:

image

如果這里已經配置了JDK,則直接選擇即行,如果沒有配置的話,就點右邊的“Add”,添加一個標準的JRE

image

Next,下圖,點右邊的Directgry瀏覽本地文件系統,找到JDK的安裝目錄。

image

好,確定 – finish,下一步,完成。如下圖:

image

 

(8) 項目的新建、添加jar包、運行。

一般我們用這個工具來做Web項目,就建一個動態Web工程吧:

image

如果上圖的選項中沒有Dynamic Web Project的話,可在最下面Other那里找到,又或者通過定制菜單將這一項顯示在這里,關于如何定制菜單,請看我的[圖解教程]Eclipse不可不知的用法之三:定制視圖與New菜單項

進入下圖界面,在Project name中輸入工程名,這里起名為“HelloWorld”,在Target runtime中選擇剛才我們配置的Tomcat 6.0服務器。如下圖:

image 

行了,完成。

關于如何把外部的jar包引進我們的項目中來,這個其實很簡單,復制那些jar文件,在下圖的lib目錄下右鍵粘貼即行。

image

關于如何運行Web項目,Eclipse for JavaEE與MyEclipse的做法不同。

image

進入下圖,找到我們配置的服務器:

image

Next – > finish即行。

 

好了,Eclipse系列圖解教程,到這里,暫告一段落,都是說一些很基礎的東西,有什么不足之處,請大家多多包涵!



心夢帆影 2009-07-02 20:53 發表評論
]]>
[圖解教程]Axis2與Eclipse整合開發Web Service之二:WSDL逆向生成服務端http://www.ymeg.top/rongxh7/archive/2009/07/02/285193.html心夢帆影心夢帆影Thu, 02 Jul 2009 07:47:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/07/02/285193.htmlhttp://www.ymeg.top/rongxh7/comments/285193.htmlhttp://www.ymeg.top/rongxh7/archive/2009/07/02/285193.html#Feedback9http://www.ymeg.top/rongxh7/comments/commentRss/285193.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/285193.html       一般開發Web Service,是選寫服務端,再根據生成的WSDL文件生成客戶端。看過一本SOA的書中說,如果實現防止不同語言一些特定的數據類型的不兼容性,推薦先定義WSDL接口,包括一輸入輸出參數、返回值及相關的數據類型等,再通過WSDL來生成服務器端和客戶端,這樣的好處是:服務端不用關心客戶端怎么調用,客戶端也不用關系服務端如何實現。

       關于Eclipse中Axis2的配置方法,請看我的[圖解教程] Axis2與Eclipse整合開發Web Service之一:簡單的計算服務例子,下面來新建一個WSDL文件,如下圖:

image

改個名字為“manager.wsdl”,如下圖:

image

下一步,定義命名空間和協議等信息,默認即行。如下圖:

image

finish后,會在主工作區出現如下圖:

image

這是manager.wsdl的圖形化形式,點擊“Source”會可查看到源代碼:

image

這是默認生成的wsdl,我們要根據我們的項目需要,修改上面的圖,首先對方法名進行修改,如下圖:

image

可見,修改之后,右邊的input和output也跟著修改了,這兩個就是定義plus的輸入和輸出。

點擊input參數“plus”右邊的提示箭頭,進入下圖:

image

就在這里定義輸入參數和和參數類型等信息,因為我們plus(float x, float y)方法中有兩個參數x和y,故我們將上圖改成兩個參數的序列:

image

變成下圖,對比一下方法plus(float x, float y),下圖也不會太難理解吧!

image

我們返回manager.wsdl視圖,選擇output參數右邊的箭頭,進入下圖:

image

我們在這里設置float plus(float x, float y)方法的返回值及其類型,因其返回值只有一個,我們只須把上面的out的類型改成我們方法中用的float,改后,如下圖:

image

有沒有注意到上圖左上角有個image 圖標,點擊它,進入下圖:

image

我們可以在這里對輸入輸出的參數及其他數據類型進行修改,如果在上面的操作過程中,不小心產生了多余的標簽的話,也可以在這里去除。

好了,我們再回到manager.wsdl,在源代碼視圖里右鍵選“Validate”,對xml文檔進行檢驗,如果有錯誤的,就根據需要修改。

image

好了,圖形化編寫的wsdl文檔完成了,順便說一下,方法是可以定義多個的,如下圖:

image

為簡單起見,我們就先以剛才做定義的那個方法為例,看看,如何根據wsdl文件,自動生成Web Service的服務器端。

 

我們New一個Web Service,如下圖:

image

記得在Web Service type中選擇“Top down Java Bean Web Service”,如下圖:

image

然后,在Service definition中找到剛才寫的那個manager.wsdl文件。

image 

回到Web Service對話框,將服務類型的滑塊調到“Develop service”處,

image

接下來,就next –> next –-> finish就行。它會自動生成Web Service服務端的接口和類,在類中,可找到我們定義的方法:

image

我們只要修改方法plus的方法體,以實現我們要實現的功能即行。如下:

image

這是通過WSDL反向生成Web Service服務端的最簡單一個例子,可能看不到有什么好處,沒有像[圖解教程] Axis2與Eclipse整合開發Web Service之一:簡單的計算服務例子那樣的簡便快捷,但如果是一些特有的數據類型,如List,Set,這些,我們有在WSDL圖形化設計中找到相應的替代類型,先定義WSDL再生成服務端接口,這樣做,不僅Java開發客戶端是沒有問題的,用C#開發客戶端也能成功沒有出錯!

但如果先開發服務器端的話,如果用到一些Java特有的數據類型,如List,Set,如果用其他語言生成的客戶端,就可能出問題。同理,用C#開發服務端,如果用到像DataSet這樣的返回類型的話,那如果用Java或者其他語言去開發客戶端,也可能會出現問題的。

如果統一先寫WSDL,再根據WSDL生成服務端和客戶端,應該是一種很不錯的做法,Eclipse在這方面的圖形化支持給帶給我們事半功倍的效果,這樣做,也比較符合SOA的做法。



心夢帆影 2009-07-02 15:47 發表評論
]]>
[圖解教程]Eclipse不可不知的用法之三:定制視圖與New菜單項http://www.ymeg.top/rongxh7/archive/2009/06/29/284564.html心夢帆影心夢帆影Mon, 29 Jun 2009 03:20:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/06/29/284564.htmlhttp://www.ymeg.top/rongxh7/comments/284564.htmlhttp://www.ymeg.top/rongxh7/archive/2009/06/29/284564.html#Feedback1http://www.ymeg.top/rongxh7/comments/commentRss/284564.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/284564.html關鍵詞:Show View , 顯示視圖, Customize Perspective , 定制New菜單欄, Eclipse for JavaEE,  圖解使用教程

(5)定制視圖

定制前的視圖:

image

菜單欄中Window –> Show View –> Other

image

進入“Show View”對話框,在這里選擇須要顯示的視圖,點“OK”即行。

image

為測試,我選擇幾個常用的視圖,如:java/Package Explorer , Data Management/Data Source Explorer , General/Internet Web Browser , General/Console 等等。

定制后,我們將其拖放到想要放置的地方即行,顯示如下圖:

image

 

(6)定制New選項

原始的New選項:

image

如果我們須要建的文件類型不在上圖右邊的選項欄中的話,就需要點“Other”進入下一個對話框去選擇,有沒有辦法使得右邊的選項欄中出現我們常常須要建的文件類型,而去掉那些不常使用的呢?

點Window –> Customize Perspective:

image

進入Customize Perspective -Web對話框,選擇最右邊的選項卡Shortcuts,在Submenus中選擇New,那么下面所列出的,若是選中的,則表示是在New菜單項中顯示的。我們逐個逐個來,把要顯示的選中,把不要顯示的去掉。

image

定制后的New選項:

image

只顯示我們常用的,簡潔了許多吧。



心夢帆影 2009-06-29 11:20 發表評論
]]>
[圖解教程]Eclipse不可不知的用法之二:自動生成接口和JUnit測試類http://www.ymeg.top/rongxh7/archive/2009/06/28/284438.html心夢帆影心夢帆影Sat, 27 Jun 2009 19:33:00 GMThttp://www.ymeg.top/rongxh7/archive/2009/06/28/284438.htmlhttp://www.ymeg.top/rongxh7/comments/284438.htmlhttp://www.ymeg.top/rongxh7/archive/2009/06/28/284438.html#Feedback4http://www.ymeg.top/rongxh7/comments/commentRss/284438.htmlhttp://www.ymeg.top/rongxh7/services/trackbacks/284438.html關鍵詞:Extract Interface、抽取接口、JUnit Test Case、JUnit測試、自動生成接口、自動生成測試類、Eclipse-jee使用方法、自動生成代碼、Eclipse3.5、圖解使用教程

(3)通過類自動生成它的接口:

在Spring應用中,常常會用到“接口+實現類”的形式,即要實現類又要寫一個方法差不多的接口,有時候感覺比較煩瑣。其實,Eclipse可以根據類自動抽取出接口來。

PersonServiceImpl.java的代碼如下:

image

在上面代碼的空白處點右鍵,或者在PersonServiceImpl類名上點右鍵 —> Refactor –> Extract Interface,如下圖:

 image

在“在Extract Interface”對話框中,Interface name框中輸入接口名:PersonService,將addPerson和queryPerson方法鉤選上,如下圖:

image

點OK后,即可自動生成PersonServiceImpl.java的接口類PersonService.java,如下圖:

image

而再看看PersonServiceImpl類代碼有了什么變化:

image

 

(4)自動生成Junit測試類

在類名上點右鍵 –> New –> Other ,如下圖:

image

在新建對話框中,選擇Java >> Junit >> Junit Test Case

image

在“New Junit Test Case”對話框中,填寫測試類名,此處,用默認(PersonServiceTest)即行,如果不想測試類與PersonService類置同一包下,可在Package中選擇指定的包來存放測試類,此處也默認處理。如下圖:

image

點Next后進入下圖,將要測試的方法鉤選中,Finish即行。

image

如果第一次建測試類,它要求加入JUnit的jar包,點OK即行。如下圖:

image

這時,JUnit測試類PersonServiceTest.java便自動生成了,如下圖:

image

我們只須修改測試類的方法的方法體,即可進行測試。



心夢帆影 2009-06-28 03:33 發表評論
]]>
精准平特三肖
    <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

    <bdo id="rub96"></bdo>

      1. <track id="rub96"><div id="rub96"></div></track>
        <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

            <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
          1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
            <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
            1. <tbody id="rub96"><div id="rub96"></div></tbody>
              1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
              2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                1. <option id="rub96"><source id="rub96"></source></option>
                2. <bdo id="rub96"></bdo>

                    <p id="rub96"><tr id="rub96"></tr></p>
                  1. <tbody id="rub96"></tbody>

                    <bdo id="rub96"></bdo>

                  2. <option id="rub96"><source id="rub96"></source></option>

                    <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                      <track id="rub96"></track>

                        <bdo id="rub96"></bdo>
                      1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                          <bdo id="rub96"></bdo>
                          1. <track id="rub96"></track>
                            1. <track id="rub96"></track>
                                  <bdo id="rub96"></bdo>
                                  <option id="rub96"></option>

                                      1. <track id="rub96"><span id="rub96"></span></track>

                                          <option id="rub96"></option>

                                          1. 
                                            
                                              <option id="rub96"><span id="rub96"></span></option>
                                              <bdo id="rub96"><address id="rub96"></address></bdo>
                                              <option id="rub96"><source id="rub96"></source></option>
                                                <nobr id="rub96"><address id="rub96"></address></nobr>
                                              1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                <track id="rub96"></track>

                                                <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                  <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                  <bdo id="rub96"></bdo>

                                                    1. <track id="rub96"><div id="rub96"></div></track>
                                                      <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                          <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
                                                        1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
                                                          <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
                                                          1. <tbody id="rub96"><div id="rub96"></div></tbody>
                                                            1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
                                                            2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                                                              1. <option id="rub96"><source id="rub96"></source></option>
                                                              2. <bdo id="rub96"></bdo>

                                                                  <p id="rub96"><tr id="rub96"></tr></p>
                                                                1. <tbody id="rub96"></tbody>

                                                                  <bdo id="rub96"></bdo>

                                                                2. <option id="rub96"><source id="rub96"></source></option>

                                                                  <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                                                                    <track id="rub96"></track>

                                                                      <bdo id="rub96"></bdo>
                                                                    1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                                                                        <bdo id="rub96"></bdo>
                                                                        1. <track id="rub96"></track>
                                                                          1. <track id="rub96"></track>
                                                                                <bdo id="rub96"></bdo>
                                                                                <option id="rub96"></option>

                                                                                    1. <track id="rub96"><span id="rub96"></span></track>

                                                                                        <option id="rub96"></option>

                                                                                        1. 
                                                                                          
                                                                                            <option id="rub96"><span id="rub96"></span></option>
                                                                                            <bdo id="rub96"><address id="rub96"></address></bdo>
                                                                                            <option id="rub96"><source id="rub96"></source></option>
                                                                                              <nobr id="rub96"><address id="rub96"></address></nobr>
                                                                                            1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                                                              <track id="rub96"></track>

                                                                                              <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                                                              1. 欢乐生肖综合走势图 河北时时选号技巧 香港赛马开奖记录 梭哈全压英文怎么说 重庆时时分解器 6y7y本期开奖结果 贵州福利彩票兑奖点 网上炸金花真人赌钱 5分赛计划 陕西快乐十分直播app 陕西快乐十分走势图今天的 河北时时qq群是骗局 西甲免费高清在线直播 香港赛马会49选7走势图 什么是赛車pk10 4个人扎金花闷牌规律