各種 MAP SET LIST

以下文章重新整理各位大大所提供的資料

Collections => Collection是所有List跟Set的始祖,List必須以特定次序來持有物件,Set無法擁有重複元素
========================
ArrayList => 用Array實做的List,允許快速隨機存取,相較於LinkedList 不適合拿來進行元素安插和移除動作
LinkedList => 提供最佳循序存取,適合安插和移除元素,隨機存取動作比起ArrayList緩慢
========================
HashSet => 是一種collection,但是只存放唯一值,是把搜尋時間看的很重要的set,用hash方式實作的set,故access time complexity = O(1)

TreeSet => 同上,但是存入的元素都會經過排列,所以速度比HashSet 慢一點

LinkedHashSet =>
Performance is likely to be just slightly below that of HashSet, due to the added expense of maintaining the linked list, with one exception: Iteration over a LinkedHashSet requires time proportional to the size of the set, regardless of its capacity. Iteration over a HashSet is likely to be more expensive, requiring time proportional to its capacity.

BitSet =>
能夠高效率的儲存大量 [ 1 / 0 ] (開/關) 資料
========================
HashMap => 用來取代HashTable,儲存 (key/value) pairs
TreeMap => 儲存 (key/value) pairs,會自動根據Key值排序

LinkedHashMap =>
Performance is likely to be just slightly below that of HashMap, due to the added expense of maintaining the linked list, with one exception: Iteration over the collection-views of a LinkedHashMap requires time proportional to the size of the map, regardless of its capacity. Iteration over a HashMap is likely to be more expensive, requiring time proportional to its capacity.

IdentityHashMap =>
This has better locality for large tables than does using separate arrays.) For many JRE implementations and operation mixes, this class will yield better performance than HashMap (which uses chaining rather than linear-probing

WeakHashMap => 這個map中,由於每個Value僅存在一個實體,因而節省了儲存空間,一但程式需要某個Value,便在map中搜尋既有的物件,並使用找到的那個物件(而非重新再造一個),由於這是一種節省儲存空間的技巧,所以能夠方便的讓GC自動清理Key和Value,一但Key不在被使用,便會觸發清理動作

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

UserControl

問:
在asp.net的專案中我使用了UserControl做topbanner,topbanner放在每個頁面的上方,
topbanner中我放了幾個圖片,現在的問題是圖片的路徑怎樣寫才能在不同目錄不同頁面下正確訪問?

程式主目錄下有topbanner.ascx和index.aspx 文件
程式主目錄下有test目錄,其下有webform1.aspx
index.aspx和webform1.aspx都使用了topbanner
如果是默認網站下的虛擬目錄指向程式主目錄
或者默認網站指向程式主目錄
圖片路徑怎樣設置才能在這兩種情況下檔index.aspx和webform1.aspx都能正確顯示出圖片?

答1:
src=”/path1/path2/a.gif”
第一個/代表網站根目錄,這樣的絕對路徑在網站內的任何目錄都可以訪問

答2:
在虛擬目錄下可以用Request.ApplicationPath
如:<img src=”<%=Request.ApplicationPath%>/images/image1.gif”>
但是Request.ApplicationPath不能用於默認網站下面

用~引用,直接解析為Request.ApplicationPath(但~ 只能被伺服器處理的)

答3:
好像也沒有太好的辦法,直接用絕對路徑吧,從根開始。
src=”/path1/path2/a.gif”

網站巡覽

http://msdn2.microsoft.com/zh-tw/library/w6ws38fw(vs.80).aspx
※使用 TreeView 控制項
做為可讓使用者跳至網站中任何網頁的巡覽功能表。

※使用 SiteMapPath 控制項
以加入巡覽路徑 (也稱為 Breadcrumb),該巡覽路徑可讓使用者從目前網頁檢視並向上移動網站階層。

※使用 Menu 控制項
以加入巡覽功能表,該功能表可讓使用者一次檢視一層節點。
將滑鼠指標停留在具有子節點的節點上會產生子節點的子功能表。

appSettings的用法

#檔案名稱:
Web Form程式 –> web.config
Win Form程式 –> app.config

<appSettings>
<add key=”path” value=”c:\httpd.conf”/>
</appSettings>

# *.aspx.vb程式:
imports System.Configuration
‘舊寫法
dim strName as string = ConfigurationSettings.AppSettings.Get(“path”)
‘新寫法
dim strName as string = ConfigurationManager.AppSettings.Get(“path”)

Properties檔裡有中文怎麼辦?

當Properties檔有中文時,如果直接讀取一定會發現亂碼,此時怎麼辦?
Java提供了一個編碼的小程式, 可以幫我們將檔案裡的文字轉成unicode,這樣就沒問題了! 這個小程式叫作 native2ascii,範例如下:
1. 編一個檔案C:/abc.properties.big5如下:
Item1=Value1
Item2=Value2
Item3=中文值
2. 執行編碼轉換:
native2ascii -encoding Big5 abc.properties.big5 abc.properties
3. 寫一個測試程式:
import java.io.*;
import java.util.*;

public class Encode {

public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream(“C:/abc.properties”);
Properties p = new Properties();
p.load(fis);
System.out.println(p.getProperty(“Item1”));
System.out.println(p.getProperty(“Item2”));
System.out.println(p.getProperty(“Item3”));
}
catch (IOException ie) {
ie.printStackTrace();
}
}
}
4. 執行結果
Value1
Value2
中文值

[轉貼] “struts中文問題”,”struts國際化問題”——終極解決方案

----------------------------------------
引文
----------------------------------------
說實話,你們的方法都做的複雜了,Java本身就支援多國語言編碼,不需要寫任何程式,可以很簡單的
實現。
秘訣就是兩點:

1、所有HTML/JSP頁面全部採用UTF-8編碼
2、用戶端流覽器完全支援UTF-8編碼

步驟:

1、首先把所有的HTML/JSP的ContentType都設為UTF-8
2、然後對於JSP程式中的非ASCII碼提示資訊都不應該寫在程式裏面,都應該放在
application.properties裏面統一管理。
3、對HTML用native2ascii工具統一做一次處理,把HTML中的非ASCII碼都轉換為Unicode編碼。
4、針對不同的語言,寫不同的application.properties,比如說簡體中文是
application_zh_CN.properties,繁體中文是application_zh_TW.properties這樣,然後對這些配置信
息檔同樣用native2ascii工具處理一次,把非ASCII碼統統轉為Unicode編碼。
5、在Servlet的request.getCharacterEncoding()獲得用戶端的作業系統默認編碼,然後set到Struts
的HTTPSession的Locale中。

OK!現在不同的客戶訪問,就會顯示不同的語言版本了。你可以看看此時你的流覽器的字元集,就是
UTF-8。現在你的網站和Google一樣了,嘿嘿,其實你有心的話,看看你的流覽器訪問Google的時候是
什麼字元集吧
切記:所有的HTML/JSP都要設為UTF-8編碼,所有的檔中的非ASCII碼字元都要用native2ascii工具轉
為用ASCII表示的Unicode編碼。

----------------------------------------
原創
----------------------------------------
上 面所述是我從網上下的一篇于中文問題的解決方案,確切的說應該是關於Struts的國際化問題,
下面我結合我的實踐談談具體如何實現Struts的國際化 問題,我對理論不是非常精通,
我只能完全憑自己的理解和實踐來講述,所以下面講的內容可能不是非常正確,
還請大家原諒。但有一點可以肯定,我通過自己的努 力解決了Struts的中文問題,
並實現Struts的國際化,其實一切並不複雜,下面是具體步驟:
0.遇到的問題(這些問題也許不會同時出現)

a.中文資料從資料庫中到jsp中後就變成了”????”
b.做好的中文properties檔,其中的中文value在頁面顯示亂碼
c.jsp檔中的中文到流覽器後顯示時也是亂碼(建議不要在jsp檔中輸入中文,儘量放在properties檔中)
d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼
e.當更換本地流覽器的語言選項時,Web應用程式不能自動根據你的locale選擇合適的*.properties文件。導致Web應用程式不能國際化。

1.環境:

Web伺服器: Tomcat 5.0.19
作業系統: Win2000 Server
JVM : jdk 1.4
數 據 庫: Oracle 8.1.7
開發工具: struts studio 5.2 pro for eclipse

2.先將所有*.jsp 網頁中開頭處加入

<%@ page language=”java” contentType=”text/html; charset=utf-8″ %>
再設置<html:html locale = “true”>

3.然後編輯好兩個*.properties檔,放在classes檔夾下你指定的地方,這裏是放在/web-inf/classes/com/wiley 下,它們分別是:

ApplicationResources.properties (英文資源檔案)
ApplicationResources_zh.properties (中文資源檔案)
隨便用什麼工具編寫都行啊!

4.將ApplicationResources_zh.properties轉碼成gb2312。上面引文說要轉成UTF-8,結果我試了,不行。轉成gb2312就行了,操作是。

將ApplicationResources_zh.properties更名為ApplicationResources_xx.properties
在DOS命令行進入ApplicationResources_xx.properties所在的文件夾
使用命令:native2ascii -encoding gb2312 ApplicationResources_xx.properties ApplicationResources_zh.properties(至於你為什麼會出現“native2ascii不是內部命令”,,請查其他資 料,可能你要設置環境變數,因為他是jdk的檔夾bin下的一個應用程式)

5.接下來配置struts-config.xml,很簡單,我們加入:

<message-resources parameter=”com.wiley.ApplicationResources”/> 就行了;
到此已能解決大多數中文問題。如上面所說的a,b,e 現在打開流覽器,選擇功能表:工具》internet選項》語言,將“中文-中國[zh-cn]”刪掉,添加一個“英語-英國[zh-gb]”確定後,重啟 Tomcat,輸入網址你就會發現,你的頁面的文本資訊就會用的是ApplicationResources.properties (英文資源檔案)中的內容。如果換回“中文-中國[zh-cn]”,它就會顯示ApplicationResources_zh.properties (中文資源檔案)中的中文內容。

至於問題“c.jsp檔中的中文到流覽器後顯示時也是亂碼” 你就要用與第4步類似的方法來重新對*.jsp 檔編碼,這時-encoding的參數就要用UTF-8了,如果你用的也是struts studio 5.2 pro for eclipse工具,這一步就免了。它會自動用UTF-8的格式存儲。
至於問題“d.由jsp傳給bean的中文值,再由bean傳回頁面又是亂碼”的解決,我只是加了個篩檢程式。
你可以現在web.xml中加入:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.wiley.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>

然後在你指定的包內加個java文件 我放在了/web-inf/classes/com/wiley 裏,下面是源代碼:
/*
* XP Forum
*
* Copyright (c) 2002-2003 RedSoft Group. All rights reserved.
*
*/
package com.huahang.tj.struts.filters;
import javax.servlet.*;
import java.io.IOException;
/**
* <p>Filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding. Configuration of this filter is based on
* the following initialization parameters:</p>
* <ul>
* <li><strong>encoding</strong> – The character encoding to be configured
* for this request, either conditionally or unconditionally based on
* the <code>ignore</code> initialization parameter. This parameter
* is required, so there is no default.</li>
* <li><strong>ignore</strong> – If set to “true”, any character encoding
* specified by the client is ignored, and the value returned by the
* <code>selectEncoding()</code> method is set. If set to “false,
* <code>selectEncoding()</code> is called <strong>only</strong> if the
* client has not already specified an encoding. By default, this
* parameter is set to “true”.</li>
* </ul>
*
* <p>Although this filter can be used unchanged, it is also easy to
* subclass it and make the <code>selectEncoding()</code> method more
* intelligent about what encoding to choose, based on characteristics of
* the incoming request (such as the values of the <code>Accept-Language</code>
* and <code>User-Agent</code> headers, or a value stashed in the current
* user’s session.</p>
*
* @author <a href=”mailto:jwtronics@yahoo.com”>John Wong</a>
*
* @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $
*/
public class SetCharacterEncodingFilter implements Filter {
// —————————————————– Instance Variables

/**
* The default character encoding to set for requests that pass through
* this filter.
*/
protected String encoding = null;

/**
* The filter configuration object we are associated with. If this value
* is null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;

/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;

// ——————————————————— Public Methods

/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}

/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request The servlet request we are processing
* @param result The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}

/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter(“encoding”);
String value = filterConfig.getInitParameter(“ignore”);
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase(“true”))
this.ignore = true;
else if (value.equalsIgnoreCase(“yes”))
this.ignore = true;
else
this.ignore = false;
}

// —————————————————— Protected Methods

/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* <code>null</code>.
* <p>
* The default implementation unconditionally returns the value configured
* by the <strong>encoding</strong> initialization parameter for this
* filter.
*
* @param request The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}//EOC

到此我遇到的中文問題已全部得到解決,並從中理解到struts的國際化的深刻含義。
我個人覺得struts作為一個功能強大的應用框架,應該早就考慮到它的國際化問題,並在實際應用中不會很複雜,
只要我們遵循一些規則,就可以盡情享受struts給我們帶來的無窮樂趣。希望以上所述對大家有所幫助。

使用 ip2nation 取得 IP 位址所在的國家別

http://www.neo.com.tw/archives/000980.html

ip2nation 已經把 IP 所在的國別整理成 SQL 語法,只要下載下來放進資料庫即可:
http://www.ip2nation.com/ip2nation/Download


(IP 資料庫最後更新日期是上個月,應該有在持續更新)

放進資料庫之後,要使用的話必須把 IP 轉為數字進行查詢,ip2nation 有提供 PHP 的範例:

$server = ”; // MySQL hostname
$username = ”; // MySQL username
$password = ”; // MySQL password
$dbname = ”; // MySQL db name

$db = mysql_connect($server, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

$sql = ‘SELECT c.country
FROM ip2nationCountries c, ip2nation i
WHERE
i.ip <
INET_ATON(“‘.$_SERVER[‘REMOTE_ADDR’].'”)
AND c.code = i.country
ORDER BY i.ip DESC LIMIT 0,1′;

list($countryName) = mysql_fetch_row(mysql_query($sql));

// Output full country name
echo $countryName;

(使用 MySQL 的 INET_ATON() 函式把 IP 轉為數字) 如果不是用 MySQL 就必須自行做 IP 轉換的計算,計算的方式以 261.230.14.128 為例:
261×2563 + 230×2562 + 14×256 + 128

PHP 的轉換範例:

$ip = split (“\.”, “261.230.14.128”);
echo $ip[3] + $ip[2]*256 + $ip[1]*256*256 + $ip[0]*256*256*256;

ip2nation 網址:
http://www.ip2nation.com/