中文字幕亚洲男人的天堂网络,911精品国产亚洲日本美国韩国,国产亚洲精品精品国产亚洲综合 http://m.tkk7.com/rongxh7/相信自己的人生有無(wú)限可能,把握每一個(gè)機(jī)會(huì),全力以赴……zh-cnThu, 03 Jul 2025 13:34:49 GMTThu, 03 Jul 2025 13:34:49 GMT60Java可變參數(shù)方法重載時(shí)要注意的幾個(gè)問(wèn)題http://m.tkk7.com/rongxh7/archive/2010/04/18/318698.html心夢(mèng)帆影心夢(mèng)帆影Sun, 18 Apr 2010 15:59:00 GMThttp://m.tkk7.com/rongxh7/archive/2010/04/18/318698.htmlhttp://m.tkk7.com/rongxh7/comments/318698.htmlhttp://m.tkk7.com/rongxh7/archive/2010/04/18/318698.html#Feedback0http://m.tkk7.com/rongxh7/comments/commentRss/318698.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/318698.htmlJDK1.5引進(jìn)了方法的可變參數(shù),受到許多開(kāi)發(fā)人員的青睞。有了這種機(jī)制,我們可以寫(xiě)出類(lèi)似于JavaScript的arguments那樣的帶任意多個(gè)參數(shù)的方法。Java的可變參數(shù),可用于普通方法上,也可以用于構(gòu)造方法上,大大增大了我們所寫(xiě)方法的適用范圍。


然而,使用可變參數(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ù)的方法。



心夢(mèng)帆影 2010-04-18 23:59 發(fā)表評(píng)論
]]>
Java的代理模式(通過(guò)公共接口實(shí)現(xiàn))http://m.tkk7.com/rongxh7/archive/2010/03/31/317070.html心夢(mèng)帆影心夢(mèng)帆影Wed, 31 Mar 2010 08:00:00 GMThttp://m.tkk7.com/rongxh7/archive/2010/03/31/317070.htmlhttp://m.tkk7.com/rongxh7/comments/317070.htmlhttp://m.tkk7.com/rongxh7/archive/2010/03/31/317070.html#Feedback2http://m.tkk7.com/rongxh7/comments/commentRss/317070.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/317070.html
/**
 * 代理子類(lèi)和目標(biāo)子類(lèi)的公共接口
 * 
@author rongxinhua
 *
 
*/
public interface MyInterface {
    
    
public void doOperation();

}

/**
 * 目標(biāo)子類(lèi)
 * 
@author rongxinhua
 *
 
*/
public class RealClass implements MyInterface {

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

}

而在沒(méi)有使用代理模式的情況下,我們是這樣執(zhí)行目標(biāo)方法的:
        RealClass realObj = new RealClass();
        realObj.doOperation();    
//調(diào)用目標(biāo)方法
打印時(shí)輸出:
doOperation


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

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

}

有了代理類(lèi),我們可以這樣執(zhí)行目標(biāo)方法:
        ProxyClass proxyObj = new ProxyClass(new RealClass());
        proxyObj.doOperation();    
//通過(guò)代理對(duì)象調(diào)用doOperation方法

打印時(shí)輸出:
doBefore
doOperation
doAfter

本文只是代理模式的在Java中的簡(jiǎn)單使用,而代理模式與Java反射機(jī)制的整合,為Java組件開(kāi)發(fā)增加了強(qiáng)大的生命力,有興趣的朋友可看我另一個(gè)博客中的文章:探討代理模式與Java反射機(jī)制的應(yīng)用



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

頗有意義的一道題,我決定用Java語(yǔ)言來(lái)寫(xiě)一寫(xiě)。代碼如下:
import java.util.Arrays;
public class CharList {

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

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

}

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


心夢(mèng)帆影 2010-03-23 02:04 發(fā)表評(píng)論
]]>
18位身份證驗(yàn)證小組件idchecker發(fā)布http://m.tkk7.com/rongxh7/archive/2010/01/03/308097.html心夢(mèng)帆影心夢(mèng)帆影Sun, 03 Jan 2010 10:43:00 GMThttp://m.tkk7.com/rongxh7/archive/2010/01/03/308097.htmlhttp://m.tkk7.com/rongxh7/comments/308097.htmlhttp://m.tkk7.com/rongxh7/archive/2010/01/03/308097.html#Feedback2http://m.tkk7.com/rongxh7/comments/commentRss/308097.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/308097.html下載地址:http://codeshop.googlecode.com/files/idchecker.zip

提供給外部調(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è)試程序:

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(
"身份證號(hào)碼是否合法 : " + checker.check() + "  " + checker.getErrorMsg());
        checker.checkAll();    
        
for(String msg : checker.getErrorMsgs()) {
            System.out.print(msg 
+ " | ");
        }
    } 

}


運(yùn)行結(jié)果:

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


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

<?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>測(cè)試idchecker組件</title>
</head>
<body>
<h1>身份證驗(yàn)證</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">
    身份證號(hào)碼 :
<input name="ID" type="text" value="<%=id %>"/>&nbsp;&nbsp;
    
<input type="submit" value="驗(yàn)證"/>
</form>
</body>
</html>
 


運(yùn)行結(jié)果:

 image image



心夢(mèng)帆影 2010-01-03 18:43 發(fā)表評(píng)論
]]>
寫(xiě)個(gè)觀察者模式(Observer Pattern)的例子http://m.tkk7.com/rongxh7/archive/2009/12/20/306737.html心夢(mèng)帆影心夢(mèng)帆影Sun, 20 Dec 2009 11:37:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/12/20/306737.htmlhttp://m.tkk7.com/rongxh7/comments/306737.htmlhttp://m.tkk7.com/rongxh7/archive/2009/12/20/306737.html#Feedback3http://m.tkk7.com/rongxh7/comments/commentRss/306737.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/306737.html閱讀全文

心夢(mèng)帆影 2009-12-20 19:37 發(fā)表評(píng)論
]]>
DIV+CSS布局中自適應(yīng)高度和寬度http://m.tkk7.com/rongxh7/archive/2009/12/14/305828.html心夢(mèng)帆影心夢(mèng)帆影Sun, 13 Dec 2009 18:19:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/12/14/305828.htmlhttp://m.tkk7.com/rongxh7/comments/305828.htmlhttp://m.tkk7.com/rongxh7/archive/2009/12/14/305828.html#Feedback7http://m.tkk7.com/rongxh7/comments/commentRss/305828.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/305828.htmlDIV+CSS布局,應(yīng)用越來(lái)越普遍,小的個(gè)人主頁(yè)、大的門(mén)戶網(wǎng)站,很多都采用了DIV+CSS布局。在設(shè)計(jì)過(guò)程中,有時(shí)會(huì)遇到一些問(wèn)題,要注意一下。且看下面的網(wǎng)頁(yè)截圖:

未命名

從截圖中, 我們可看出,

問(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代碼注釋中:

<!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>心夢(mèng)帆影</p>
                    
<p>心夢(mèng)帆影</p>
                
</div>
                
<div id="content" class="column">
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>
                    
<p>http://m.tkk7.com/rongxh7</p>                    
                
</div>
            
</div>
            
<div id="footer"></div>
        
</div>
    
</body>
</html>


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

運(yùn)行截圖如下:

image



心夢(mèng)帆影 2009-12-14 02:19 發(fā)表評(píng)論
]]>
Div+CSS布局的寬度計(jì)算及在各瀏覽器中的差異比較http://m.tkk7.com/rongxh7/archive/2009/12/14/305827.html心夢(mèng)帆影心夢(mèng)帆影Sun, 13 Dec 2009 16:39:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/12/14/305827.htmlhttp://m.tkk7.com/rongxh7/comments/305827.htmlhttp://m.tkk7.com/rongxh7/archive/2009/12/14/305827.html#Feedback1http://m.tkk7.com/rongxh7/comments/commentRss/305827.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/305827.html對(duì)比于傳統(tǒng)的表格布局和框架布局,DIV+CSS布局有著布局容易、改版方便、樣式定義靈活、HTML代碼簡(jiǎn)潔清晰、易于JavaScript操控等優(yōu)點(diǎn)。在眾口皆碑的同時(shí),對(duì)于一些初學(xué)者,總會(huì)遇到各種各樣的問(wèn)題,比如說(shuō)DIV的寬度或高度的計(jì)算問(wè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è)試左邊,右邊同理。

<?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>測(cè)試DIV的寬度</title>
        
<style type="text/css">
            #container 
{
                
/* 左參考線 */
                border-left
:1px solid #B23AEE;
            
}
            
/* 定義各個(gè)層的公共屬性 */
            #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">
                心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影
            
</div>
            
<div id="div2">
                心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影
            
</div>
            
<div id="div3">
                心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影
            
</div>
            
<div id="div4">
                心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影心夢(mèng)帆影
            
</div>
        
</div>
    
</body>
</html>

我們?cè)贔irefox中測(cè)試,截圖如下:

image

我們來(lái)分析一下DIV4,如下圖:

image

對(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)行截圖:

image

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

DIV的寬度 = width + margin

而border和padding,是占用了width的位置。這一點(diǎn),在前端開(kāi)發(fā)中要注意。



心夢(mèng)帆影 2009-12-14 00:39 發(fā)表評(píng)論
]]>
原創(chuàng)一道Java筆試面試題考考大家http://m.tkk7.com/rongxh7/archive/2009/11/28/303990.html心夢(mèng)帆影心夢(mèng)帆影Fri, 27 Nov 2009 19:21:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/11/28/303990.htmlhttp://m.tkk7.com/rongxh7/comments/303990.htmlhttp://m.tkk7.com/rongxh7/archive/2009/11/28/303990.html#Feedback24http://m.tkk7.com/rongxh7/comments/commentRss/303990.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/303990.html 以下代碼有些朋友可能會(huì)似曾熟識(shí),可能也算不上“原創(chuàng)”,請(qǐng)見(jiàn)諒!
不過(guò),我出的這題,確定有點(diǎn)意思,考考大家。
/**
 * 父類(lèi)
 * 
@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);
    }
}

/**
 * 子類(lèi)
 * 
@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);
    }
}

問(wèn)題:當(dāng)執(zhí)行 Father who = new Son(); 時(shí),會(huì)輸出什么?
如果你去參加一個(gè)公司的筆試或面試時(shí)問(wèn)了這么一道題,在沒(méi)有環(huán)境測(cè)試的情況下,你會(huì)猜測(cè)什么答案?



心夢(mèng)帆影 2009-11-28 03:21 發(fā)表評(píng)論
]]>
CSS的position:fixed的使用http://m.tkk7.com/rongxh7/archive/2009/11/22/303225.html心夢(mèng)帆影心夢(mèng)帆影Sun, 22 Nov 2009 06:58:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/11/22/303225.htmlhttp://m.tkk7.com/rongxh7/comments/303225.htmlhttp://m.tkk7.com/rongxh7/archive/2009/11/22/303225.html#Feedback25http://m.tkk7.com/rongxh7/comments/commentRss/303225.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/303225.html接觸CSS已有相當(dāng)長(zhǎng)一段時(shí)間,我們竟然沒(méi)有留意position:fixed的用法。

我們都知道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">
<!--
#help{
    width:30px;
    height:20px;
    background-color:green;
    position:fixed;
    left:60px;
    top:100px;
}
-->
</style>

我們用上面這段代碼來(lái)定義頁(yè)面上的一個(gè)層“help”(id=“help”)。這樣就能實(shí)現(xiàn)我們想要的效果了。

在IE8、Firefox、Opera、Google等瀏覽器中測(cè)試,都沒(méi)有問(wèn)題,唯獨(dú)低版本的IE中,這個(gè)屬性無(wú)效。



心夢(mèng)帆影 2009-11-22 14:58 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(6):重寫(xiě)用戶登錄模塊(整合Jquery+JSON)http://m.tkk7.com/rongxh7/archive/2009/08/14/291207.html心夢(mèng)帆影心夢(mèng)帆影Fri, 14 Aug 2009 14:32:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/08/14/291207.htmlhttp://m.tkk7.com/rongxh7/comments/291207.htmlhttp://m.tkk7.com/rongxh7/archive/2009/08/14/291207.html#Feedback10http://m.tkk7.com/rongxh7/comments/commentRss/291207.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/291207.html閱讀全文

心夢(mèng)帆影 2009-08-14 22:32 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(5):用戶注冊(cè)模塊(整合Jquery)http://m.tkk7.com/rongxh7/archive/2009/08/01/289402.html心夢(mèng)帆影心夢(mèng)帆影Sat, 01 Aug 2009 08:16:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/08/01/289402.htmlhttp://m.tkk7.com/rongxh7/comments/289402.htmlhttp://m.tkk7.com/rongxh7/archive/2009/08/01/289402.html#Feedback11http://m.tkk7.com/rongxh7/comments/commentRss/289402.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/289402.html閱讀全文

心夢(mèng)帆影 2009-08-01 16:16 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(4):新聞管理模塊的實(shí)現(xiàn)http://m.tkk7.com/rongxh7/archive/2009/07/27/288495.html心夢(mèng)帆影心夢(mèng)帆影Sun, 26 Jul 2009 17:14:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/27/288495.htmlhttp://m.tkk7.com/rongxh7/comments/288495.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/27/288495.html#Feedback2http://m.tkk7.com/rongxh7/comments/commentRss/288495.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/288495.html閱讀全文

心夢(mèng)帆影 2009-07-27 01:14 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(3):新聞管理Model層的開(kāi)發(fā)(整合iBatis)http://m.tkk7.com/rongxh7/archive/2009/07/26/288414.html心夢(mèng)帆影心夢(mèng)帆影Sat, 25 Jul 2009 19:02:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/26/288414.htmlhttp://m.tkk7.com/rongxh7/comments/288414.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/26/288414.html#Feedback9http://m.tkk7.com/rongxh7/comments/commentRss/288414.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/288414.html閱讀全文

心夢(mèng)帆影 2009-07-26 03:02 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(2):用戶登錄模塊的實(shí)現(xiàn)http://m.tkk7.com/rongxh7/archive/2009/07/21/287554.html心夢(mèng)帆影心夢(mèng)帆影Mon, 20 Jul 2009 16:14:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/21/287554.htmlhttp://m.tkk7.com/rongxh7/comments/287554.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/21/287554.html#Feedback2http://m.tkk7.com/rongxh7/comments/commentRss/287554.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/287554.html用戶登錄幾乎是每一個(gè)Web系統(tǒng)的必需模塊,本期教程就通過(guò)用戶登錄模塊來(lái)講解Struts2.1.6的Action和Result的Annotation配置。

上期的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"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄頁(yè)</title>
</head>
<body>

<s:fielderror></s:fielderror>

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

</body>
</html>

大家如果想用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"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ">
<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>

接著,我們寫(xiě)一個(gè)登錄處理的Action類(lèi):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;
    }
}

解釋一下這個(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)如下:

image

運(yùn)行一下吧:

image

image

image

一點(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)注下文!



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

image

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

image

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包:

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

把這些包放進(jìn)項(xiàng)目的lib目錄下,同時(shí),建議也把JSTL的核心jar包也放到lib目錄,這些JSTL的包主要有:

jstl.jar
standard.jar

我們先要在項(xiàng)目WEB-INF下的web.xml文件中配置Struts2應(yīng)用,配置后,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>

我們?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)目的文件夾視圖如下:

image

我運(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.截圖如下:

image

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

image

 

注意一點(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;
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;
    }
}

讓我們?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)。

image

同時(shí)頁(yè)面是跳到了WEB-INF/content/hello.jsp文件(如下圖),這說(shuō)明請(qǐng)求的確是從HelloAction類(lèi)轉(zhuǎn)發(fā)到了hello.jsp。

image

看來(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;
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(也可寫(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ā)
response.sendRedirect("hello.jsp");    //重定向

兩者的區(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)期待下文!



心夢(mèng)帆影 2009-07-18 17:27 發(fā)表評(píng)論
]]>
Struts 2.1.6 精簡(jiǎn)實(shí)例系列教程(正在發(fā)表中,敬請(qǐng)關(guān)注~~)http://m.tkk7.com/rongxh7/archive/2009/07/04/285449.html心夢(mèng)帆影心夢(mèng)帆影Sat, 04 Jul 2009 03:55:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/04/285449.htmlhttp://m.tkk7.com/rongxh7/comments/285449.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/04/285449.html#Feedback7http://m.tkk7.com/rongxh7/comments/commentRss/285449.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/285449.html教程別名:基于Struts 2.1.6 的SimpleWeb小項(xiàng)目開(kāi)發(fā)教程

實(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)有涉及到。



心夢(mèng)帆影 2009-07-04 11:55 發(fā)表評(píng)論
]]>
[圖解教程]Eclipse不可不知的用法之四:配置服務(wù)器與項(xiàng)目的新建運(yùn)行http://m.tkk7.com/rongxh7/archive/2009/07/02/285241.html心夢(mèng)帆影心夢(mèng)帆影Thu, 02 Jul 2009 12:53:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/02/285241.htmlhttp://m.tkk7.com/rongxh7/comments/285241.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/02/285241.html#Feedback0http://m.tkk7.com/rongxh7/comments/commentRss/285241.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/285241.html這么有失水準(zhǔn)的文章,真不好意思再寫(xiě)了。但畢竟還是有些初學(xué)者不熟悉,截些圖來(lái)看一下配置服務(wù)器的過(guò)程吧。

(7) 配置Tomcat服務(wù)器

這里以配置Tomcat 6.0為例。

image

選擇Server下面的Runtime Environments:

image

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

image

Next后進(jìn)入下圖:

image 

在Tomcat installation directory右邊的Browse按鈕,點(diǎn)擊它,進(jìn)入本地磁盤(pán)目錄,選擇你的Tomcat安裝目錄,如下:

image

確定后,回到剛才那個(gè)對(duì)話框,點(diǎn)擊JRE右邊的Installed JREs按鈕,進(jìn)入下圖的界面:

image

如果這里已經(jīng)配置了JDK,則直接選擇即行,如果沒(méi)有配置的話,就點(diǎn)右邊的“Add”,添加一個(gè)標(biāo)準(zhǔn)的JRE

image

Next,下圖,點(diǎn)右邊的Directgry瀏覽本地文件系統(tǒng),找到JDK的安裝目錄。

image

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

image

 

(8) 項(xiàng)目的新建、添加jar包、運(yùn)行。

一般我們用這個(gè)工具來(lái)做Web項(xiàng)目,就建一個(gè)動(dòng)態(tài)Web工程吧:

image

如果上圖的選項(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ù)器。如下圖:

image 

行了,完成。

關(guān)于如何把外部的jar包引進(jìn)我們的項(xiàng)目中來(lái),這個(gè)其實(shí)很簡(jiǎn)單,復(fù)制那些jar文件,在下圖的lib目錄下右鍵粘貼即行。

image

關(guān)于如何運(yùn)行Web項(xiàng)目,Eclipse for JavaEE與MyEclipse的做法不同。

image

進(jìn)入下圖,找到我們配置的服務(wù)器:

image

Next – > finish即行。

 

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



心夢(mèng)帆影 2009-07-02 20:53 發(fā)表評(píng)論
]]>
[圖解教程]Axis2與Eclipse整合開(kāi)發(fā)Web Service之二:WSDL逆向生成服務(wù)端http://m.tkk7.com/rongxh7/archive/2009/07/02/285193.html心夢(mèng)帆影心夢(mèng)帆影Thu, 02 Jul 2009 07:47:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/07/02/285193.htmlhttp://m.tkk7.com/rongxh7/comments/285193.htmlhttp://m.tkk7.com/rongxh7/archive/2009/07/02/285193.html#Feedback9http://m.tkk7.com/rongxh7/comments/commentRss/285193.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/285193.html       一般開(kāi)發(fā)Web Service,是選寫(xiě)服務(wù)端,再根據(jù)生成的WSDL文件生成客戶端。看過(guò)一本SOA的書(shū)中說(shuō),如果實(shí)現(xiàn)防止不同語(yǔ)言一些特定的數(shù)據(jù)類(lèi)型的不兼容性,推薦先定義WSDL接口,包括一輸入輸出參數(shù)、返回值及相關(guān)的數(shù)據(jù)類(lèi)型等,再通過(guò)WSDL來(lái)生成服務(wù)器端和客戶端,這樣的好處是:服務(wù)端不用關(guān)心客戶端怎么調(diào)用,客戶端也不用關(guān)系服務(wù)端如何實(shí)現(xiàn)。

       關(guān)于Eclipse中Axis2的配置方法,請(qǐng)看我的[圖解教程] Axis2與Eclipse整合開(kāi)發(fā)Web Service之一:簡(jiǎn)單的計(jì)算服務(wù)例子,下面來(lái)新建一個(gè)WSDL文件,如下圖:

image

改個(gè)名字為“manager.wsdl”,如下圖:

image

下一步,定義命名空間和協(xié)議等信息,默認(rèn)即行。如下圖:

image

finish后,會(huì)在主工作區(qū)出現(xiàn)如下圖:

image

這是manager.wsdl的圖形化形式,點(diǎn)擊“Source”會(huì)可查看到源代碼:

image

這是默認(rèn)生成的wsdl,我們要根據(jù)我們的項(xiàng)目需要,修改上面的圖,首先對(duì)方法名進(jìn)行修改,如下圖:

image

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

點(diǎn)擊input參數(shù)“plus”右邊的提示箭頭,進(jìn)入下圖:

image

就在這里定義輸入?yún)?shù)和和參數(shù)類(lèi)型等信息,因?yàn)槲覀僷lus(float x, float y)方法中有兩個(gè)參數(shù)x和y,故我們將上圖改成兩個(gè)參數(shù)的序列:

image

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

image

我們返回manager.wsdl視圖,選擇output參數(shù)右邊的箭頭,進(jìn)入下圖:

image

我們?cè)谶@里設(shè)置float plus(float x, float y)方法的返回值及其類(lèi)型,因其返回值只有一個(gè),我們只須把上面的out的類(lèi)型改成我們方法中用的float,改后,如下圖:

image

有沒(méi)有注意到上圖左上角有個(gè)image 圖標(biāo),點(diǎn)擊它,進(jìn)入下圖:

image

我們可以在這里對(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ù)需要修改。

image

好了,圖形化編寫(xiě)的wsdl文檔完成了,順便說(shuō)一下,方法是可以定義多個(gè)的,如下圖:

image

為簡(jiǎn)單起見(jiàn),我們就先以剛才做定義的那個(gè)方法為例,看看,如何根據(jù)wsdl文件,自動(dòng)生成Web Service的服務(wù)器端。

 

我們New一個(gè)Web Service,如下圖:

image

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

image

然后,在Service definition中找到剛才寫(xiě)的那個(gè)manager.wsdl文件。

image 

回到Web Service對(duì)話框,將服務(wù)類(lèi)型的滑塊調(diào)到“Develop service”處,

image

接下來(lái),就next –> next –-> finish就行。它會(huì)自動(dòng)生成Web Service服務(wù)端的接口和類(lèi),在類(lèi)中,可找到我們定義的方法:

image

我們只要修改方法plus的方法體,以實(shí)現(xiàn)我們要實(shí)現(xiàn)的功能即行。如下:

image

這是通過(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的做法。



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

(5)定制視圖

定制前的視圖:

image

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

image

進(jìn)入“Show View”對(duì)話框,在這里選擇須要顯示的視圖,點(diǎn)“OK”即行。

image

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

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

image

 

(6)定制New選項(xiàng)

原始的New選項(xiàng):

image

如果我們須要建的文件類(lèi)型不在上圖右邊的選項(xiàng)欄中的話,就需要點(diǎn)“Other”進(jìn)入下一個(gè)對(duì)話框去選擇,有沒(méi)有辦法使得右邊的選項(xiàng)欄中出現(xiàn)我們常常須要建的文件類(lèi)型,而去掉那些不常使用的呢?

點(diǎn)Window –> Customize Perspective:

image

進(jìn)入Customize Perspective -Web對(duì)話框,選擇最右邊的選項(xiàng)卡Shortcuts,在Submenus中選擇New,那么下面所列出的,若是選中的,則表示是在New菜單項(xiàng)中顯示的。我們逐個(gè)逐個(gè)來(lái),把要顯示的選中,把不要顯示的去掉。

image

定制后的New選項(xiàng):

image

只顯示我們常用的,簡(jiǎn)潔了許多吧。



心夢(mèng)帆影 2009-06-29 11:20 發(fā)表評(píng)論
]]>
[圖解教程]Eclipse不可不知的用法之二:自動(dòng)生成接口和JUnit測(cè)試類(lèi)http://m.tkk7.com/rongxh7/archive/2009/06/28/284438.html心夢(mèng)帆影心夢(mèng)帆影Sat, 27 Jun 2009 19:33:00 GMThttp://m.tkk7.com/rongxh7/archive/2009/06/28/284438.htmlhttp://m.tkk7.com/rongxh7/comments/284438.htmlhttp://m.tkk7.com/rongxh7/archive/2009/06/28/284438.html#Feedback4http://m.tkk7.com/rongxh7/comments/commentRss/284438.htmlhttp://m.tkk7.com/rongxh7/services/trackbacks/284438.html關(guān)鍵詞:Extract Interface、抽取接口、JUnit Test Case、JUnit測(cè)試、自動(dòng)生成接口、自動(dòng)生成測(cè)試類(lèi)、Eclipse-jee使用方法、自動(dòng)生成代碼、Eclipse3.5、圖解使用教程

(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的代碼如下:

image

在上面代碼的空白處點(diǎn)右鍵,或者在PersonServiceImpl類(lèi)名上點(diǎn)右鍵 —> Refactor –> Extract Interface,如下圖:

 image

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

image

點(diǎn)OK后,即可自動(dòng)生成PersonServiceImpl.java的接口類(lèi)PersonService.java,如下圖:

image

而再看看PersonServiceImpl類(lèi)代碼有了什么變化:

image

 

(4)自動(dòng)生成Junit測(cè)試類(lèi)

在類(lèi)名上點(diǎn)右鍵 –> New –> Other ,如下圖:

image

在新建對(duì)話框中,選擇Java >> Junit >> Junit Test Case

image

在“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)處理。如下圖:

image

點(diǎn)Next后進(jìn)入下圖,將要測(cè)試的方法鉤選中,F(xiàn)inish即行。

image

如果第一次建測(cè)試類(lèi),它要求加入JUnit的jar包,點(diǎn)OK即行。如下圖:

image

這時(shí),JUnit測(cè)試類(lèi)PersonServiceTest.java便自動(dòng)生成了,如下圖:

image

我們只須修改測(cè)試類(lèi)的方法的方法體,即可進(jìn)行測(cè)試。



心夢(mèng)帆影 2009-06-28 03:33 發(fā)表評(píng)論
]]>
主站蜘蛛池模板: 亚洲最大福利视频网站| 三上悠亚在线观看免费| 四虎永久在线精品免费网址| 亚洲av无码av制服另类专区| 一级毛片一级毛片免费毛片| 日韩免费高清视频网站| 国产成人精品日本亚洲11| 51精品视频免费国产专区| 亚洲成AV人在线播放无码 | 免费亚洲视频在线观看| 在线亚洲高清揄拍自拍一品区| 最近中文字幕2019高清免费| 亚洲av综合色区| 拍拍拍无挡免费视频网站| 久久精品国产亚洲Aⅴ蜜臀色欲| 深夜a级毛片免费无码| 国产成人免费全部网站| 亚洲高清毛片一区二区| 在线jyzzjyzz免费视频| 亚洲日本va一区二区三区| 成人免费看吃奶视频网站| 涩涩色中文综合亚洲| 免费电视剧在线观看| 亚洲va久久久久| 成人一a毛片免费视频| 亚洲日韩精品国产3区| 在线免费观看一区二区三区| 亚洲1234区乱码| 最近中文字幕免费mv视频7| 亚洲综合色婷婷在线观看| 性色av无码免费一区二区三区| 中文字幕亚洲综合小综合在线| 欧美a级成人网站免费| 亚洲人成人无码.www石榴| 午夜小视频免费观看| 久久亚洲精品11p| 无码专区一va亚洲v专区在线| 一级黄色免费网站| 亚洲精品美女久久777777| 久久免费精品视频| 亚洲视频在线一区二区三区|