亚洲天天做日日做天天看,小说区亚洲自拍另类,亚洲国产成人久久一区WWWhttp://m.tkk7.com/void241/category/33133.htmlzh-cnThu, 02 Jun 2016 08:06:41 GMTThu, 02 Jun 2016 08:06:41 GMT60深入理解Java 8 Lambda(類庫篇——Streams API,Collectors和并行)http://m.tkk7.com/void241/archive/2016/06/02/430747.htmlvoidvoidThu, 02 Jun 2016 07:32:00 GMThttp://m.tkk7.com/void241/archive/2016/06/02/430747.htmlhttp://m.tkk7.com/void241/comments/430747.htmlhttp://m.tkk7.com/void241/archive/2016/06/02/430747.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/430747.htmlhttp://m.tkk7.com/void241/services/trackbacks/430747.html閱讀全文

void 2016-06-02 15:32 發表評論
]]>
SpringMVC與struts2比較http://m.tkk7.com/void241/archive/2014/09/24/418246.htmlvoidvoidWed, 24 Sep 2014 15:16:00 GMThttp://m.tkk7.com/void241/archive/2014/09/24/418246.htmlhttp://m.tkk7.com/void241/comments/418246.htmlhttp://m.tkk7.com/void241/archive/2014/09/24/418246.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/418246.htmlhttp://m.tkk7.com/void241/services/trackbacks/418246.html1:
spring3開發效率高于struts
2:
spring3 mvc可以認為已經100%零配置
3:
struts2是類級別的攔截, 一個類對應一個request上下文,
springmvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應
所以說從架構本身上 spring3 mvc就容易實現restful url 
而struts2的架構實現起來要費勁
因為struts2 action的一個方法可以對應一個url
而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了 
4:
spring3mvc的方法之間基本上獨立的,獨享request response數據
請求數據通過參數獲取,處理結果通過ModelMap交回給框架
方法之間不共享變量
而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的
這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩 
5:
由于Struts2需要針對每個Request進行封裝,把Request,Session等Servlet生命周期的變量封裝成一個一個Map,供給每個Action使用,并保證線程安全。所以在原則上,是比較耗費內存的

void 2014-09-24 23:16 發表評論
]]>
eclipse 調試時看不到淺藍色高亮條的解決http://m.tkk7.com/void241/archive/2013/06/05/400211.htmlvoidvoidWed, 05 Jun 2013 02:18:00 GMThttp://m.tkk7.com/void241/archive/2013/06/05/400211.htmlhttp://m.tkk7.com/void241/comments/400211.htmlhttp://m.tkk7.com/void241/archive/2013/06/05/400211.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/400211.htmlhttp://m.tkk7.com/void241/services/trackbacks/400211.html使用的tomcat插件是sysdeo tomcat plugin,
windows->Preference->tomcat->Source path,勾上顯示框中要調試的項目,然后重啟tomcat即可

void 2013-06-05 10:18 發表評論
]]>
對jar包進行再次修改http://m.tkk7.com/void241/archive/2012/06/14/380806.htmlvoidvoidThu, 14 Jun 2012 10:52:00 GMThttp://m.tkk7.com/void241/archive/2012/06/14/380806.htmlhttp://m.tkk7.com/void241/comments/380806.htmlhttp://m.tkk7.com/void241/archive/2012/06/14/380806.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/380806.htmlhttp://m.tkk7.com/void241/services/trackbacks/380806.html引言
   在學習和開發JAVA項目中,我們經常會用到第三方提供的一些jar。使用這些第三方工具包,可以提高我們開發的效率,縮短開發的時間。有的第三方工具,提供詳細的使用說明和源代碼,有時有的卻不提供源代碼,使用說明也不是很詳細,這對我們使用就非常不方便。
   有道是,知其然才知其所以然。有時候,我們必須讀取jar里的打包的類。而有時還有可能要對它進行小量修改,使之適用于自己的特殊需求。
  前期準備
   Java反編譯工具:
   強烈推薦,小穎JAVA源代碼反編譯系列專家1.4終極版。
   壓縮工具:
   Winrar
  
   (這些工具,都可以通過搜索在網絡上找到)
  開始
  1. 將jar包解壓
  我們可以使用winrar工具將jar解壓到指定目錄
  2. 反編譯class
   使用 Java 反編譯工具,將class文件反編譯為java文件。(大多數反編譯工具只提供單個class文件的反編譯,這里推薦"小穎JAVA源代碼反編譯"工具,可以反編譯一個目錄下的所有class文件)
  
  3. 構建項目
   我們將反編譯后的java文件設為項目的源文件目錄。
   將jar,及jar所需要的其它lib,作為libraries加入項目中,這樣可以保證我們的java文件可以編譯。
  4. 對反編譯的java進行修改
   通過反編譯的java文件,可能還有錯誤,不能編譯通過,在不影響作者原始意圖的前提下,我們必須對它進行小量修改,保證可編譯通過。
   保證java文件可以編譯通過后,我們再在其基礎上進行修改,使之符合自己的需求。
  
  5. 編譯修改的java
   編譯修改后的java文件,注意的是,最好只編譯修改的單個java文件。
   編譯完成后,我們進行測試,保證修改無誤。因為JVM會先找尋classes目錄下的class文件,并率先加入,這樣我們修改編譯后的class文件,便是測試時使用的class文件。
   重復這個過程,直至java達到我們的目的。
  6. Jar打包
   將修改生成后的class文件,替換我們將jar解壓縮目錄下的相應class文件,重新打包生成jar。
   我們可以使用jar命令進行打包,也可以使用winrar工具進行打包。使用winrar工具打包時,要注意選擇壓縮文件格式為zip,并將生成的壓縮包文件的后綴名設置為jar。
   替換原來的jar。再進行最后一次測試。
  總結
   由于Java的跨平臺性,使得java的class文件可以進行反編譯,我們可以對jar文件進行修改,使之適用于自己的需求。
   對jar文件進行修改,我們必須首先獲得jar開發者的同意。
   對jar文件進行修改,首先必須對反編譯的java文件比較熟悉。這就必須有良好的代碼閱讀能力,清楚作者的技術架構和開發設計思想。如果沒有把握,最好能與jar開發者聯系,提出你的需求。
   對于某些java開發者來說,并不希望將自己辛辛苦苦寫的code公布于眾,為了避免他人反編譯,可以使用混淆器,但也只是增加代碼閱讀的困難性。如果不是作為商業運用,我們還是希望開發者能夠提供源代碼,互相學習探討。

void 2012-06-14 18:52 發表評論
]]>
java各種符號,路徑,版本獲取方式http://m.tkk7.com/void241/archive/2012/04/19/375272.htmlvoidvoidThu, 19 Apr 2012 06:30:00 GMThttp://m.tkk7.com/void241/archive/2012/04/19/375272.htmlhttp://m.tkk7.com/void241/comments/375272.htmlhttp://m.tkk7.com/void241/archive/2012/04/19/375272.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/375272.htmlhttp://m.tkk7.com/void241/services/trackbacks/375272.html

java.version

Java 運行時環境版本

java.vendor

Java 運行時環境供應商

java.vendor.url

Java 供應商的 URL

java.home

Java 安裝目錄

java.vm.specification.version

Java 虛擬機規范版本

java.vm.specification.vendor

Java 虛擬機規范供應商

java.vm.specification.name

Java 虛擬機規范名稱

java.vm.version

Java 虛擬機實現版本

java.vm.vendor

Java 虛擬機實現供應商

java.vm.name

Java 虛擬機實現名稱

java.specification.version

Java 運行時環境規范版本

java.specification.vendor

Java 運行時環境規范供應商

java.specification.name

Java 運行時環境規范名稱

java.class.version

Java 類格式版本號

java.class.path

Java 類路徑

java.library.path

加載庫時搜索的路徑列表

java.io.tmpdir

默認的臨時文件路徑

java.compiler

要使用的 JIT 編譯器的名稱

java.ext.dirs

一個或多個擴展目錄的路徑

os.name

操作系統的名稱

os.arch

操作系統的架構

os.version

操作系統的版本

file.separator

文件分隔符(在 UNIX 系統中是“/”)

path.separator

路徑分隔符(在 UNIX 系統中是“:”)

line.separator

行分隔符(在 UNIX 系統中是“/n”)

user.name

用戶的賬戶名稱

user.home

用戶的主目錄

user.dir

用戶的當前工作目錄



void 2012-04-19 14:30 發表評論
]]>
windows or linux 路徑分隔符 http://m.tkk7.com/void241/archive/2012/04/19/375266.htmlvoidvoidThu, 19 Apr 2012 06:11:00 GMThttp://m.tkk7.com/void241/archive/2012/04/19/375266.htmlhttp://m.tkk7.com/void241/comments/375266.htmlhttp://m.tkk7.com/void241/archive/2012/04/19/375266.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/375266.htmlhttp://m.tkk7.com/void241/services/trackbacks/375266.htmlSystem.getProperty("file.separator");

void 2012-04-19 14:11 發表評論
]]>
Java Map 循環比較排列http://m.tkk7.com/void241/archive/2012/02/03/369343.htmlvoidvoidFri, 03 Feb 2012 14:24:00 GMThttp://m.tkk7.com/void241/archive/2012/02/03/369343.htmlhttp://m.tkk7.com/void241/comments/369343.htmlhttp://m.tkk7.com/void241/archive/2012/02/03/369343.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/369343.htmlhttp://m.tkk7.com/void241/services/trackbacks/369343.htmlArrayList<Entry<Integer,Integer>> infoIds = new ArrayList<Entry<Integer,Integer>>(hashCount.entrySet());
        Collections.sort(infoIds, 
new Comparator<Map.Entry<Integer, Integer>>() {
            
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                
return (o2.getValue() - o1.getValue());
            }
        });


void 2012-02-03 22:24 發表評論
]]>
LinkedHashMap 和 HashMap的區別 http://m.tkk7.com/void241/archive/2011/09/02/357853.htmlvoidvoidFri, 02 Sep 2011 13:17:00 GMThttp://m.tkk7.com/void241/archive/2011/09/02/357853.htmlhttp://m.tkk7.com/void241/comments/357853.htmlhttp://m.tkk7.com/void241/archive/2011/09/02/357853.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/357853.htmlhttp://m.tkk7.com/void241/services/trackbacks/357853.html 顧名思義LinkedHashMap是比HashMap多了一個鏈表的結構。與HashMap相比LinkedHashMap維護的是一個具有雙重鏈表的 HashMap,LinkedHashMap支持2中排序一種是插入排序,一種是使用排序,最近使用的會移至尾部例如 M1 M2 M3 M4,使用M3后為 M1 M2 M4 M3了,LinkedHashMap輸出時其元素是有順序的,而HashMap輸出時是隨機的,如果Map映射比較復雜而又要求高效率的話,最好使用 LinkedHashMap,但是多線程訪問的話可能會造成不同步,所以要用Collections.synchronizedMap來包裝一下,從而實 現同步。其實現一般為:
    Map<String String> map = Collections.synchronizedMap(new LinkedHashMap(<String String));

void 2011-09-02 21:17 發表評論
]]>
取中文字符的拼音首字母http://m.tkk7.com/void241/archive/2010/07/29/327458.htmlvoidvoidThu, 29 Jul 2010 08:44:00 GMThttp://m.tkk7.com/void241/archive/2010/07/29/327458.htmlhttp://m.tkk7.com/void241/comments/327458.htmlhttp://m.tkk7.com/void241/archive/2010/07/29/327458.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/327458.htmlhttp://m.tkk7.com/void241/services/trackbacks/327458.html * 取中文字符的拼音首字母
* @author
*/
public class GB2Alpha {
/**
* 字母Z使用了兩個標簽,這里有27個值,i, u, v都不做聲母, 跟隨前面的字母
*/
    private char[] chartable =
            {
                '啊', '芭', '擦', '搭', '蛾', '發', '噶', '哈', '哈',
                '擊', '喀', '垃', '媽', '拿', '哦', '啪', '期', '然',
                '撒', '塌', '塌', '塌', '挖', '昔', '壓', '匝', '座'
            };

    private char[] alphatable =
            {
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',

                'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
            };


    private int[] table = new int[27];

    /**
    * 初始化
    */
    {
        for (int i = 0; i < 27; ++i) {
            table = gbValue(chartable);
        }
    }

    public GB2Alpha() {

    }

    /**
    * 主函數,輸入字符,得到他的聲母,英文字母返回對應的大寫字母,其他非簡體漢字返回 '0'
    */
    public char Char2Alpha(char ch) {

        if (ch >= 'a' && ch <= 'z')
            return (char) (ch - 'a' + 'A');
        if (ch >= 'A' && ch <= 'Z')
            return ch;


        int gb = gbValue(ch);
        if (gb < table[0])
            return '0';


        int i;
        for (i = 0; i < 26; ++i) {
            if (match(i, gb))
                break;
        }

        if (i >= 26)
            return '0';
        else
            return alphatable;
    }

    /**
    * 根據一個包含漢字的字符串返回一個漢字拼音首字母的字符串
    * @param SourceStr
    * @return
    */
    public String String2Alpha(String SourceStr) {
        String Result = "";
        int StrLength = SourceStr.length();
        int i;
        try {
            for (i = 0; i < StrLength; i++) {
                Result += Char2Alpha(SourceStr.charAt(i));
            }
        } catch (Exception e) {
            Result = "";
        }
        return Result;
    }

    private boolean match(int i, int gb) {
        if (gb < table)
            return false;

        int j = i + 1;

        //字母Z使用了兩個標簽
        while (j < 26 && (table == table))
            ++j;

        if (j == 26)
            return gb <= table;
        else
            return gb < table;

    }

    /**
    * 取出漢字的編碼
    */
    private int gbValue(char ch) {
        String str = new String();
        str += ch;
        try {
            byte[] bytes = str.getBytes("GB2312");
            if (bytes.length < 2)
                return 0;
            return (bytes[0] << 8 & 0xff00) + (bytes[1] &
                    0xff);
        } catch (Exception e) {
            return 0;
        }

    }


    public static void main(String[] args) {
        GB2Alpha obj1 = new GB2Alpha();
        System.out.println(obj1.String2Alpha("小華"));
        return;
    }
}

void 2010-07-29 16:44 發表評論
]]>
Java安全有效的實現兩星期內自動登陸功能http://m.tkk7.com/void241/archive/2009/06/26/284231.htmlvoidvoidFri, 26 Jun 2009 02:22:00 GMThttp://m.tkk7.com/void241/archive/2009/06/26/284231.htmlhttp://m.tkk7.com/void241/comments/284231.htmlhttp://m.tkk7.com/void241/archive/2009/06/26/284231.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/284231.htmlhttp://m.tkk7.com/void241/services/trackbacks/284231.htmlhttp://stonejava.javaeye.com/blog/255136

http://www.javaeye.com/topic/130309

http://i18n.javaeye.com/blog/130849

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

現在很多網站都有為用戶保存登陸信息(即保存Cookie)的功能,當用戶下一次進入網站時,可以幫助用戶自動登陸,使網站顯得更加友好。筆者通過 研究ACEGI項目的自動登陸源碼,編寫了一個安全有效的實現兩星期自動登陸功能的JAVA工具類,下面是具體的實現流程和實現代碼。

  先說一下流程:

  1.保存用戶信息階段:

  當用戶登陸網站時,在登陸頁面填寫完用戶名和密碼后,如果用戶在提交時還選擇了“兩星期內自動登陸”復選框,那么在后臺程序中驗證用戶名和密碼 全都正確后,還要為用戶保存這些信息,以便用戶下一次可以直接進入網站;如果用戶沒有勾選“兩星期內自動登陸”復選框,則不必為用戶保存信息,那么用戶在 下一次登陸網站時仍需要填寫用戶名和密碼。

  在保存用戶信息階段,主要的工作是對用戶的信息進行加密并保存到客戶端。加密用戶的信息是較為繁瑣的,大致上可分為以下幾個步聚:

   ① 得到用戶名、經MD5加密后的用戶密碼、cookie有效時間(本文設置的是兩星期,可根據自己需要修改)
② 自定義的一個webKey,這個Key是我們為自己的網站定義的一個字符串常量,這個可根據自己需要隨意設置
③ 將上兩步得到的四個值得新連接成一個新的字符串,再進行MD5加密,這樣就得到了一個MD5明文字符串
④ 將用戶名、cookie有效時間、MD5明文字符串使用“:”間隔連接起來,再對這個連接后的新字符串進行Base64編碼
⑤ 設置一個cookieName,將cookieName和上一步產生的Base64編碼寫入到客戶端。

  2.讀取用戶信息:

  其實弄明白了保存原理,讀取及校驗原理就很容易做了。讀取和檢驗可以分為下面幾個步驟:

  ?、?根據設置的cookieName,得到cookieValue,如果值為空,就不幫用戶進行自動登陸;否則執行讀取方法
② 將cookieValue進行Base64解碼,將取得的字符串以split(“:”)進行拆分,得到一個String數組cookieValues(此操作與保存階段的第4步正好相反),這一步將得到三個值:

cookieValues[0] ---- 用戶名
cookieValues[1] ---- cookie有效時間
cookieValues[2] ---- MD5明文字符串

  ?、?判斷cookieValues的長度是否為3,如果不為3則進行錯誤處理。
④ 如果長度等于3,取出第二個,即cookieValues[1],此時將會得到有效時間(long型),將有效時間與服務器系統當前時間比較,如果小于當前時間,則說明cookie過期,進行錯誤處理。
⑤ 如果cookie沒有過期,就取cookieValues[0],這樣就可以得到用戶名了,然后去數據庫按用戶名查找用戶。
⑥ 如果上一步返回為空,進行錯誤處理。如果不為空,那么將會得到一個已經封裝好用戶信息的User實例對象user
⑦ 取出實例對象user的用戶名、密碼、cookie有效時間(即cookieValues[1])、webKey,然后將四個值連接起來,然后進行MD5加密,這樣做也會得到一個MD5明文字符串(此操作與保存階段的第3步類似)
⑧ 將上一步得到MD5明文與cookieValues[2]進行equals比較,如果是false,進行錯誤處理;如果是true,則將user對象添加到session中,幫助用戶完成自動登陸

  完整的代碼,用途請參見注釋

CookieUtil.java

處理cookie的工具類,包括讀取,保存,清除三個主要方法。

package cn.itcast.util;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import cn.itcast.bean.User;
import cn.itcast.dao.UserDAO;
import cn.itcast.factory.DaoImplFactory;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;


/*

* 2007.09.21 by lyhapple

* */
public class CookieUtil {
//保存cookie時的cookieName
private final static String cookieDomainName = “cn.itcast”;
//加密cookie時的網站自定碼
private final static String webKey = “itcast”;
//設置cookie有效期是兩個星期,根據需要自定義
private final static long cookieMaxAge = 60 * 60 * 24 * 7 * 2;
//保存Cookie到客戶端--------------------------------------------------------------------------------------------------------
//在CheckLogonServlet.java中被調用
//傳遞進來的user對象中封裝了在登陸時填寫的用戶名與密碼
public static void saveCookie(User user, HttpServletResponse response) {

//cookie的有效期
long validTime = System.currentTimeMillis() + (cookieMaxAge * 1000);
//MD5加密用戶詳細信息
String cookieValueWithMd5 =getMD5(user.getUserName() + ":" + user.getPassword()+ ":" + validTime + ":" + webKey);
//將要被保存的完整的Cookie值
String cookieValue = user.getUserName() + ":" + validTime + ":" + cookieValueWithMd5;
//再一次對Cookie的值進行BASE64編碼
String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
//開始保存Cookie
Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);

//存兩年(這個值應該大于或等于validTime)
cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
//cookie有效路徑是網站根目錄
cookie.setPath("/");
//向客戶端寫入
response.addCookie(cookie);

}

//讀取Cookie,自動完成登陸操作--------------------------------------------------------------------------------------------

//在Filter程序中調用該方法,見AutoLogonFilter.java
public static void readCookieAndLogon(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
//根據cookieName取cookieValue
Cookie cookies[] = request.getCookies();
String cookieValue = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
if (cookieDomainName.equals(cookies[i].getName())) {
cookieValue = cookies[i].getValue();
break;
}
}
}


//如果cookieValue為空,返回,

if(cookieValue==null){

return;

}

//如果cookieValue不為空,才執行下面的代碼

//先得到的CookieValue進行Base64解碼

String cookieValueAfterDecode = new String (Base64.decode(cookieValue),"utf-8");

//對解碼后的值進行分拆,得到一個數組,如果數組長度不為3,就是非法登陸
String cookieValues[] = cookieValueAfterDecode.split(":");
if(cookieValues.length!=3){
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("你正在用非正常方式進入本站...");
out.close();
return;
}
//判斷是否在有效期內,過期就刪除Cookie
long validTimeInCookie = new Long(cookieValues[1]);
if(validTimeInCookie < System.currentTimeMillis()){
//刪除Cookie
clearCookie(response);
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<a href=’logon.jsp’>你的Cookie已經失效,請重新登陸</a>");
out.close();
return;
}

//取出cookie中的用戶名,并到數據庫中檢查這個用戶名,
String username = cookieValues[0];
//根據用戶名到數據庫中檢查用戶是否存在
UserDAO ud = DaoImplFactory.getInstance();

User user = ud.selectUserByUsername(username);

//如果user返回不為空,就取出密碼,使用用戶名+密碼+有效時間+ webSiteKey進行MD5加密
if(user!=null){
String md5ValueInCookie = cookieValues[2];
String md5ValueFromUser =getMD5(user.getUserName() + ":" + user.getPassword()+ ":" + validTimeInCookie + ":" + webKey);
//將結果與Cookie中的MD5碼相比較,如果相同,寫入Session,自動登陸成功,并繼續用戶請求
if(md5ValueFromUser.equals(md5ValueInCookie)){
HttpSession session = request.getSession(true);
session.setAttribute("user", user);
chain.doFilter(request, response);
}
}else{
//返回為空執行
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("cookie驗證錯誤!");
out.close();
return;
}
}
//用戶注銷時,清除Cookie,在需要時可隨時調用------------------------------------------------------------
public static void clearCookie( HttpServletResponse response){
Cookie cookie = new Cookie(cookieDomainName, null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
//獲取Cookie組合字符串的MD5碼的字符串----------------------------------------------------------------------------
public static String getMD5(String value) {
String result = null;
try{
byte[] valueByte = value.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(valueByte);
result = toHex(md.digest());
} catch (NoSuchAlgorithmException e2){
e1.printStackTrace();
}
return result;
}

//將傳遞進來的字節數組轉換成十六進制的字符串形式并返回

private static String toHex(byte[] buffer){
StringBuffer sb = new StringBuffer(buffer.length * 2);
for (int i = 0; i < buffer.length; i++){
sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
}
return sb.toString();
}
}

下面的是對CookieUtil工具類各方法的調用演示:

User.java

封裝用戶信息的JavaBean對象模型
package com.itcast.bean;
public class User {
private int id;
private String userName;
private String password;
public String getPassword() {

return password;

}
public void setPassword(String password) {

this.password = password;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

AutoLogonFilter.java

過濾器程序,可在WEB-INF/web.xml中設置過濾規則,本文對過濾規則不作介紹,此程序主要作用是檢查用戶在上一次登陸時是否保存了Cookie,如果保存了,就處理Cookie信息,并幫助用戶自動登陸

本程序主要調用了CookieUtil.java中的讀取與自動登陸方法,即readCookieAndLogon方法

package cn.itcast.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.itcast bean.User;
import cn.itcast.util.CookieUtil;

public class AutoLogonFilter implements Filter {

public void destroy() {

}

//保存cookie時的cookieName,與CookieUtil.java中的設置相同

private final static String cookieDomainName = “cn.itcast”;

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
HttpSession session = request.getSession(true);
User user = (User)session.getAttribute("user");


//如果封裝的user不為空,說明已經登陸,則繼續執行用戶的請求.下面的就不處理了

if(user!=null){
chain.doFilter(request,response);
return;
}

//user為空,說明用戶還沒有登陸,就嘗試得到瀏覽器傳送過來的Cookie
Cookie cookies[] = request.getCookies();
String cookieValue = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
if (cookieDomainName.equals(cookies[i].getName())) {
cookieValue = cookies[i].getValue();
break;
}
}
}


//如果cookieValue為空,也繼續執行用戶請求
if(cookieValue==null){
chain.doFilter(request,response);
return;
}

//cookieValue不為空執行下面的方法,調用CookieUtil.java中的readCookieAndLogon方法
try{
CookieUtil.readCookieAndLogon(cookieValue, request, response, chain);
}catch(Exception e){
e.printStackTrace();
}
}

public void init(FilterConfig arg0) throws ServletException {
}
}

CheckLogonServlet.java

驗證用戶登陸信息的Servlet,此程序調用了CookieUtil.java中的saveCookie方法

package cn.itcast.servlet;

/*
* update 2007.09.23 by lyhapple
* 檢查用戶登陸
* */

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.itcast.bean.User;
import cn.itcast.dao.UserDAO;
import cn.itcast.factory.DaoImplFactory;
import cn.itcast.util.CookieUtil;

public class CheckLogonServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username").trim();
String password = CookieUtil.getMD5(request.getParameter("password"));
String remeberMe = request.getParameter("remeberMe");
HttpSession session = request.getSession(false);

// 將接收到的用戶名傳遞到UserDao的checkUser方法中,檢查用戶
// 返回一個User類型的對象
UserDAO ud = DaoImplFactory.getInstance();
User user = ud.selectUserByUsername(username);
if (user == null) {
request.setAttribute("checkUserError","<a href='register.jsp'><font color=red>用戶名不存在,請先注冊</font></a>");
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}

if(!password.equals(user.getPassword())){
request.setAttribute("checkPasswordError","<font color=red>密碼輸入錯誤,請重新輸入</font>");
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}


//保存Cookie,這里調用了CookieUtil.java中的saveCookie方法,將上面的user對象作為參數傳遞
if ("on".equals(remeberMe)) {
CookieUtil.saveCookie(user, response);
}
//在Session中保存用戶信息,并轉向用戶的個人信息頁面
session.setAttribute("user", user);
request.getRequestDispatcher("User/userInfo.jsp").forward(request,response);
}
}
UserDAO.java與DaoImplFactory.java屬于持久層相關的程序,這里就不貼出來了,讀者可根據自己需要選擇不同的持久層框架,在本程序中只要實現查詢用戶的功能就可以了


void 2009-06-26 10:22 發表評論
]]>
java 通過System.getProperties()獲取系統參數http://m.tkk7.com/void241/archive/2009/06/04/279971.htmlvoidvoidThu, 04 Jun 2009 02:58:00 GMThttp://m.tkk7.com/void241/archive/2009/06/04/279971.htmlhttp://m.tkk7.com/void241/comments/279971.htmlhttp://m.tkk7.com/void241/archive/2009/06/04/279971.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/279971.htmlhttp://m.tkk7.com/void241/services/trackbacks/279971.html    System.out.println("Java的運行環境版本:"+props.getProperty("java.version"));
   System.out.println("Java的運行環境供應商:"+props.getProperty("java.vendor"));
   System.out.println("Java供應商的URL:"+props.getProperty("java.vendor.url"));
   System.out.println("Java的安裝路徑:"+props.getProperty("java.home"));
   System.out.println("Java的虛擬機規范版本:"+props.getProperty("java.vm.specification.version"));
   System.out.println("Java的虛擬機規范供應商:"+props.getProperty("java.vm.specification.vendor"));
   System.out.println("Java的虛擬機規范名稱:"+props.getProperty("java.vm.specification.name"));
   System.out.println("Java的虛擬機實現版本:"+props.getProperty("java.vm.version"));
   System.out.println("Java的虛擬機實現供應商:"+props.getProperty("java.vm.vendor"));
   System.out.println("Java的虛擬機實現名稱:"+props.getProperty("java.vm.name"));
   System.out.println("Java運行時環境規范版本:"+props.getProperty("java.specification.version"));
   System.out.println("Java運行時環境規范供應商:"+props.getProperty("java.specification.vender"));
   System.out.println("Java運行時環境規范名稱:"+props.getProperty("java.specification.name"));
   System.out.println("Java的類格式版本號:"+props.getProperty("java.class.version"));
   System.out.println("Java的類路徑:"+props.getProperty("java.class.path"));
   System.out.println("加載庫時搜索的路徑列表:"+props.getProperty("java.library.path"));
   System.out.println("默認的臨時文件路徑:"+props.getProperty("java.io.tmpdir"));
   System.out.println("一個或多個擴展目錄的路徑:"+props.getProperty("java.ext.dirs"));
   System.out.println("操作系統的名稱:"+props.getProperty("os.name"));
   System.out.println("操作系統的構架:"+props.getProperty("os.arch"));
   System.out.println("操作系統的版本:"+props.getProperty("os.version"));
   System.out.println("文件分隔符:"+props.getProperty("file.separator"));   //在 unix 系統中是"/"
   System.out.println("路徑分隔符:"+props.getProperty("path.separator"));   //在 unix 系統中是":"
   System.out.println("行分隔符:"+props.getProperty("line.separator"));   //在 unix 系統中是"/n"
   System.out.println("用戶的賬戶名稱:"+props.getProperty("user.name"));
   System.out.println("用戶的主目錄:"+props.getProperty("user.home"));
   System.out.println("用戶的當前工作目錄:"+props.getProperty("user.dir"));

void 2009-06-04 10:58 發表評論
]]>
歸納一些網上取JAVA路徑的方法http://m.tkk7.com/void241/archive/2008/08/15/222309.htmlvoidvoidFri, 15 Aug 2008 09:22:00 GMThttp://m.tkk7.com/void241/archive/2008/08/15/222309.htmlhttp://m.tkk7.com/void241/comments/222309.htmlhttp://m.tkk7.com/void241/archive/2008/08/15/222309.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/222309.htmlhttp://m.tkk7.com/void241/services/trackbacks/222309.html 注明:如果從ANT啟動程序,this.getClass().getResource("")取出來的比較怪,直接用JAVA命令行調試就可成功。

得到classpath和當前類的絕對路徑的一些方法

獲得CLASSPATH之外路徑的方法:

URL base = this.getClass().getResource("");
//先獲得本類的所在位置,如/home/popeye/testjava/build/classes/net/
String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath();
//就可以得到/home/popeye/testjava/name

下面是一些得到classpath和當前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。

1.FileTest.class.getResource("")

得到的是當前類FileTest.class文件的URI目錄。不包括自己!

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

2.FileTest.class.getResource("/")

得到的是當前的classpath的絕對URI路徑。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

3.Thread.currentThread().getContextClassLoader().getResource("")

得到的也是當前ClassPath的絕對URI路徑。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

4.FileTest.class.getClassLoader().getResource("")

得到的也是當前ClassPath的絕對URI路徑。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

5.ClassLoader.getSystemResource("")

得到的也是當前ClassPath的絕對URI路徑。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當前的classpath的絕對路徑的URI表示法。

在Web應用程序中,我們一般通過ServletContext.getRealPath("/")方法得到Web應用程序的根目錄的絕對路徑。這樣,我們只需要提供相對于Web應用程序根目錄的路徑,就可以構建出定位資源的絕對路徑。

注意點:

1.盡量不要使用相對于System.getProperty("user.dir")當前用戶目錄的相對路徑。這是一顆定時炸彈,隨時可能要你的命。

2.盡量使用URI形式的絕對路徑資源。它可以很容易的轉變為URI,URL,File對象。

3.盡量使用相對classpath的相對路徑。不要使用絕對路徑。使用上面ClassLoaderUtil類的public static URL getExtendResource(String relativePath)方法已經能夠使用相對于classpath的相對路徑定位所有位置的資源。

4.絕對不要使用硬編碼的絕對路徑。因為,我們完全可以使用ClassLoader類的getResource("")方法得到當前classpath的絕對路徑。

使用硬編碼的絕對路徑是完全沒有必要的!它一定會讓你死的很難看!程序將無法移植!

如果你一定要指定一個絕對路徑,那么使用配置文件,也比硬編碼要好得多!

當然,我還是推薦你使用程序得到classpath的絕對路徑來拼資源的絕對路徑.



void 2008-08-15 17:22 發表評論
]]>
java累積http://m.tkk7.com/void241/archive/2008/07/19/215993.htmlvoidvoidSat, 19 Jul 2008 04:09:00 GMThttp://m.tkk7.com/void241/archive/2008/07/19/215993.htmlhttp://m.tkk7.com/void241/comments/215993.htmlhttp://m.tkk7.com/void241/archive/2008/07/19/215993.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/215993.htmlhttp://m.tkk7.com/void241/services/trackbacks/215993.html1 字符串的== 判斷,應該用 equals() 進行
2 ResultSet 使用前忘了 rs.next();
3 數據庫連接沒有放在 finally{} 里面關閉
4 沒有判斷每個方法的返回值,造成程序隱患


調試Temp文件

tomcat/works
eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work



void 2008-07-19 12:09 發表評論
]]>
J2EE項目代碼編寫規范http://m.tkk7.com/void241/archive/2008/07/19/215986.htmlvoidvoidSat, 19 Jul 2008 03:46:00 GMThttp://m.tkk7.com/void241/archive/2008/07/19/215986.htmlhttp://m.tkk7.com/void241/comments/215986.htmlhttp://m.tkk7.com/void241/archive/2008/07/19/215986.html#Feedback0http://m.tkk7.com/void241/comments/commentRss/215986.htmlhttp://m.tkk7.com/void241/services/trackbacks/215986.html代碼編寫規范目的:能夠在編碼過程中實現規范化,為以后的程序開發中養成良好的行為習慣。
代碼編寫規范使用范圍:J2EE項目開發。

包命名規范:
目的:包的命名規范應當體現出項目資源良好的劃分

servlet類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.servlet
例如:com.accp.gs2t23.netstore.web.servlet

自定義標簽類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.tags
例如:com.accp.gs2t23.netstore.web.tags

過濾器類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.filter
例如:com.accp.gs2t23.netstore.web.filter

Action類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.action
例如:com.accp.gs2t23.netstore.web.struts.action

ActionForm類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.form
例如:com.accp.gs2t23.netstore.web.struts.form

Javabean所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.service.impl
例如:com.accp.gs2t23.netstore.web.service.impl

Javabean實現接口命名規范:公司名稱.開發組名稱.項目名稱.web.service
例如:com.accp.gs2t23.netstore.web.service

DAO類所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.impl
例如:com.accp.gs2t23.netstore.dao.impl

DAO類所實現的接口在包中命名規范:公司名稱.開發組名稱.項目名稱.dao
例如:com.accp.gs2t23.netstore.dao

POJO類與hbm文件所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.hbm
例如:com.accp.gs2t23.netstore.dao.hbm

全局公共類、接口類所在包命名規范:公司名稱.開發組名稱.項目名稱.global
例如:com.accp.gs2t23.netstore.global

全局工具類所在包命名規范:公司名稱.開發組名稱.項目名稱.util
例如:com.accp.gs2t23.netstore.util

類命名規范
基本命名規范:

類、接口命名
命名規范:以大寫字母開頭,如果有多個單詞,每個單詞頭字母大寫
例如:StudentInfo

接口命名
命名規范:以大寫字母"I"開頭,如果有多個單詞,每個單詞頭字母大寫
例如:IStudentInfo

接口實現類命名:
命名規范:將實現的接口名稱的首字母"I"去掉,以"Impl作為結尾",如果有多個單詞,每個單詞頭字母大寫。
例如:StudentInfoImpl

J2EE+SSH框架命名規范

servlet類命名:
命名規范:以Servlet單詞結尾
例如:LoginServlet

POJO命名:
使用hibernate自動生成的類即可

DAO類命名:
使用hibernate自動生成的類即可

Action類命名:
命名規范:Action的命名以POJO名稱來制定,POJO名稱Action
例如:
一個POJO名稱為Diary,其對應的action為DiaryAction

ActionForm類命名:
命名規范:ActionForm的命名以POJO名稱來制定,POJO名稱Form
例如:
一個POJO名稱為Diary,其對應的actioForm為DiaryForm

業務邏輯接口命名:
命名規范:業務邏輯接口的命名以POJO名稱來制定,IPOJO名稱Service
例如:
一個POJO名稱為Diary,其對應的業務邏輯接口為IDiaryService

業務邏輯實現類命名:
命名規范:業務邏輯接口實現類的命名以POJO名稱來制定
例如:
一個POJO名稱為Diary,對應的業務邏輯接口實現類名為DiaryServiceImpl

類變量命名:
命名規范:變量名首字母必須小寫,如果該變量名有多個單詞組成,后面的單 詞首字母大寫,單詞與單詞之間不要使用"_"做連接,變量名訪問控制必須為私有, 可以對其增加setter與getter方法。
例如:private int studentAge;
public int getStudentAge()
              {
return studentAge;
}

public void setStudentAge(int studentAge)
{
this.studentAge=studentAge;
}

常量命名:
命名規范:所有字母大寫,如果有多個單詞組成,單詞與單詞之間以” _“隔開。而   且該變量必須是公共、靜態、final類型
例如:public static final String USER_NAME=”userName“;

方法命名
命名規范:首字母必須小寫,如果該變量名有多個單詞組成,后面的單詞首字母   大寫,單詞與單詞之間不要使用"_"做連接。單詞不要使用名詞。
例如:public int checkLogin(String name,String pwd){}

注釋規范:注釋規范是整個開發規范中最為重要的組成部分,必須嚴格執行。
類的注釋:
作用:注釋整個類,簡單概述該類作用。
書寫規范:類的注釋必須寫在該類的聲明語法之前。在注釋中要描述該類的基   本作用,作者,日期,版本,公司名稱,版權聲明。
格式:
/* *
* 類功能描述:(大致描述類的功能)
* @author:編寫者名稱
*
* @version: 類文件的版本號 從1.0開始(自己確定版本號的增改
*    情況), 修改情況(修改時間、作者、改動情況)
*
* @see 包名.參考類名 (列出父類,引入類,每個類占一行),如果有
*   可省略
* 相關數據如:(便于理解本類的一些常量數據及某些數據的格式
*    或認為比較重要的數據,如果沒有可省略)
*/

類的聲明語法
例如:
/**
      * <p>Title:管理員模塊數據處理類 </p>
      * <p>Description: 兩個數相加</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company:華騰軟件公司</p>
*
* @author 童金虎
*
* @version $Revision: 1.7 $ $Date: 2007/07/08$
*/

public class AdminDAO

變量、常量注釋:
作用:簡單描述該變量的意義。
書寫規范:變量注釋必須寫在變量定義之前,簡單描述其代表的意義。
格式:
/**
* 變量功能描述:(大致描述變量的功能)
*/
例如:
     /**
    *定義年齡變量
    */

public int age;

方法注釋:
作用:對該方法功能簡單描述,其參數、返回值意義的注解。
書寫規范:方法注釋必須寫在方法定義之前。該注釋包括:方法其功能的簡單   描述,方法的參數、返回值類型、返回值意義簡單的描述。
格式:
      /**
   * 方法功能說明
   * @param args (參數類型可以寫在參數后,也可以省
   *    略。每個參數占一行)
   * @return 輸出參數(多種情況寫在同一行)
   * @see 類#參考方法 (與此方法有調用關系的方法供參
   *    考,不必每個方法都完整列出,要選擇有意義的,每個
   *    方法占一行)
   * @exception 異常處理類(方法中能夠引發的異常,每
   *    個異常占一行)
*/

例如:
/**
* 修改管理員密碼
* @param adminId 管理員編號
* @param oldPassword 舊密碼
* @param password 新密碼
* @return boolean 是否編輯成功
* @throws UserException
* @throws ServiceException
*/

public booleaneditAdminPassword(int adminId,String oldPassword,
String password) throws UserException,ServiceException;

Jsp頁面命名:
命名規范:jsp頁面名稱要以小寫字母開頭,如果有多個單詞組成,后面的單詞以   大寫字母開頭。名稱要體現出該頁面的意義,最好能夠與模塊名稱聯系在一起。
例如:
login.jsp --登錄頁面
register.jsp   --注冊頁面
message.jsp --客戶留言頁面

J2EE項目工程文件夾組織規范:
目的:規范學員web應用程序的資源組織形式,形成良好的文件組織習慣。文件的組織形式應當體現模塊的劃分。
根據eclipse工具的特征,項目的目錄結構為:

src
    ----存放java文件  
WebRoot
|--images     --存放web程序所需的公共圖片
|--css         --存放web程序所需的公共樣式表
|--js    --存放web程序所需的公共js文件
|--commons   --存放web程序所需的公共文件
|--功能模塊文件夾(存放與某個功能模塊相關的資源)
|--images --存放與該功能模塊相關的圖片
|--css      --存放與該模塊相關的樣式表文件
|--js    --存放與該模塊相關的js文件
|--jsp、html頁面
|--WEB-INF
|--classes
|--lib
|--tld文件

J2EE項目提交規范
項目完成時要將項目作為一個產品交付用戶,良好的項目組織規范可以使用戶可以方便的找尋項目中需要的資源,同時也是一個公司專業性的體現。項目提交時,要按照下列文件格式進行提交。

項目主文件夾:
作用:存放項目其他資源文件。
命名規范:時間_班級編號_第X小組。
例如:070706_GS2T18_第四小組。

項目主文件夾下面包括以下文件夾和文件:
|--src:保存.java文件。
|--database:保存數據庫的腳本文件或者數據庫備份文件。
|--source:保存eclipse工程中WebRoot目錄下的所有文件。
|--depend:保存編譯該程序必須依賴的其他jar文件。
|--javadoc:保存所有類生成的javadoc api文檔。
|--war:保存程序的歸檔文件
|--xx.war:已經打包好的工程文件,可以直接運行。
|--project:保存開發項目原工程代碼及文件。
|--產品說明書.doc:圖文方式展現該產品使用方法。
|--build.xml:ant腳本,用于生成運行的war文件。
|--項目解說.ppt:進行項目講解的ppt(ppt僅供在校模擬項目使用,不用于其他商     業用途)

注:一個完整的項目中,數據庫必須有一定量的有效的測試數據來支持該程序的運行



void 2008-07-19 11:46 發表評論
]]>
主站蜘蛛池模板: 亚洲AV电影院在线观看| 亚洲日本va在线视频观看| 亚洲va久久久噜噜噜久久| 久草免费福利在线| 亚洲一级特黄大片无码毛片 | 夜夜爽妓女8888视频免费观看| 在线观看成人免费视频| 亚洲爆乳无码专区www| 精品剧情v国产在免费线观看| 美女免费视频一区二区| 亚洲精品偷拍视频免费观看| 一道本在线免费视频| 国产亚洲精品一品区99热| 色欲色香天天天综合网站免费| 亚洲综合亚洲国产尤物| 欧亚精品一区三区免费| 在线观看亚洲专区| 亚洲最大AV网站在线观看| 久久精品乱子伦免费| 亚洲国产高清在线精品一区| 成人免费午间影院在线观看| 深夜A级毛片视频免费| 久久亚洲国产欧洲精品一| 5g影院5g天天爽永久免费影院| 亚洲精品456人成在线| 亚洲成A∨人片天堂网无码| 青青操免费在线观看| 亚洲国色天香视频| 免费在线观看视频a| 嫩草在线视频www免费观看| 亚洲一区电影在线观看| 免费大香伊蕉在人线国产| 最近2019中文免费字幕在线观看| 亚洲欧洲日产v特级毛片| 国产91在线免费| 99久久综合精品免费| 亚洲1区2区3区精华液| 蜜芽亚洲av无码精品色午夜| 免费v片在线观看无遮挡| 免费一级不卡毛片| 毛片亚洲AV无码精品国产午夜|