摘要: 這篇文章討論和闡明了提供 JavaTM I/O 性能的多種技術。大多技術圍繞調整磁盤文件 I/O,但是有些內容也同樣適合網絡 I/O 和窗口輸出。第一部分技術討論底層的I/O問題,然后討論諸如壓縮,格式化和串行化等高級I/O問題。然而這個討論沒有包含應用設計問題,例如搜索算法和數據結構,也沒有討論系統級的問題,例如文件高速緩沖。 ...
閱讀全文
|
|
platform & Server
8.X 英文版 http://download2.bea.com/pub/platform/81/platform815_win32.exe http://download2.bea.com/pub/platform/81/platform815_linux32.bin (linux) 中文版 http://download2.bea.com/pub/platform/81/platform812_zh_CN_win32.exe http://download2.bea.com/pub/platform/81/platform814_zh_CN_win32.exe http://download2.bea.com/pub/platform/81/platform815_zh_CN_win32.exe http://download2.bea.com/pub/platform/81/platform815_zh_CN_hpux32.bin (hp_unix) 9.X 英文版 http://download2.bea.com/pub/platform/90/server900_win32.exe http://download2.bea.com/pub/platform/90/server900_linux32.bin 中文版 http://download2.bea.com/pub/platform/90/server900_zh_CN_win32.exe http://download2.bea.com/pub/platform/90/server900_zh_CN_hpux32.bin (hp_uxix http://download2.bea.com/pub/platform/90/server900_zh_CN_solaris32.bin (Solaris(8\9\10)版) http://download2.bea.com/pub/platform/91/server910_win32.exe http://download2.bea.com/pub/platform/91/server910_linux32.bin (linux) http://download2.bea.com/pub/platform/91/server910_hpux32.bin (hpux) http://download2.bea.com/pub/platform/91/server910_solaris32.bin (solaris)
==============需要注冊的下載========== 1.在哪里下得著中文版的 http://commerce.bea.com/index.jsp 進去后,點擊 International Versions 然后就會到 http://commerce.bea.com/products/intl_versions.jsp 再選簡體中文就OK了。 2.下載所有英文版本地址: http://commerce.bea.com/showallversions.jsp?family=WLP 3.下載所有中文版本地址: http://commerce.bea.com/showallversions.jsp?family=WLPCH
| |
摘要: MyEclipse+struts+Hibernate配置開發手冊
說明:
這個手冊只是為初學者制作的環境配置和快速開發的一些基本方法,為的是廣大愛好者能快速上手,少走我走過的彎路,里面沒有任何關于java模式和其他相關的說明。本人水平有限,也沒有能力去討論關于模式設計和開發細節的一些內容。
 ...
閱讀全文
|
一些網站采用了字母和數字的驗證碼,數字和字母加起來一共30多個,如果有心,還是能夠通過方法識別出來。 我在網上看到一篇文章"jsp彩色驗證碼",我進行了加強,生成的驗證碼內容為漢字,可以方便應用在面向漢語網民的網站認證上。 當然,我還看到別人考慮的幾種方法: 1.生成計算題,比如20+34*(23-12)=?,用戶必須輸入正確的答案才能通過驗證,這個想法挺好,但是用戶必須打開計算器進行計算,增加了用戶的難度 2.問一些常見的問題,比如“人”這個字由幾筆組成。這也是不錯的想法,關鍵是必須有上萬條的題庫,而且題庫的答案必須是明確的,簡單易比較的,這個難度也較大。 下面是彩色漢字驗證碼的代碼。 <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%! //create by smallnest //email: smallnest@gmail.com //website:www.kuaff.com //生成隨機顏色 Color getRandColor(Random random,int fc,int bc) { if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } %> <% //設置頁面不緩存 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); // 設置圖片的長寬 int width=176, height=30; //設置備選漢字,剔除一些不雅的漢字 String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; //備選漢字的長度 int length = base.length(); //創建內存圖像 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 獲取圖形上下文 Graphics g = image.getGraphics(); //創建隨機類的實例 Random random = new Random(); // 設定圖像背景色(因為是做背景,所以偏淡) g.setColor(getRandColor(random,200,250)); g.fillRect(0, 0, width, height); //備選字體 String[] fontTypes = {"\u5b8b\u4f53","\u65b0\u5b8b\u4f53","\u9ed1\u4f53","\u6977\u4f53","\u96b6\u4e66"}; int fontTypesLength = fontTypes.length; //在圖片背景上增加噪點 g.setColor(getRandColor(random,160,200)); g.setFont(new Font("Times New Roman",Font.PLAIN,14)); for (int i=0;i<6;i++) { g.drawString("*********************************************",0,5*(i+2)); } //取隨機產生的認證碼(6個漢字) //保存生成的漢字字符串 String sRand=""; for (int i=0;i<6;i++) { int start = random.nextInt(length); String rand=base.substring(start,start+1); sRand+=rand; //設置字體的顏色 g.setColor(getRandColor(random,10,150)); //設置字體 g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,18 + random.nextInt(6))); //將此漢字畫到圖片上 g.drawString(rand,24*i+ 10 + random.nextInt(8),24); } //將認證碼存入session session.setAttribute("rand",sRand); g.dispose(); //輸出圖象到頁面 ImageIO.write(image, "JPEG", response.getOutputStream()); %> | |
JSF開發實戰的第一篇(jsf開發實戰一)演示了如何建立一個最簡單的JSF應用,從那個例子中我們可以觀察到JSF的頁面組件是如何與后臺的javabean綁定的,也看到了JSF標簽的最基本使用。在本文中我們會演示一個更加復雜的應用,它包含了更豐富的JSF標簽。
要開發的例子是一個用戶管理程序,管理員輸入帳號與密碼登陸,然后它可以看到所有用戶的列表,并且可以修改或者刪除其中的一些數據。利用myeclipse所帶的jsf-config.xml設計器,頁面流程如下:

可以看出,這個應用設計到的業務邏輯有:
用戶登陸、修改用戶信息、增加新用戶、刪除用戶
我們在后臺的數據庫操作中使用hibernate框架來輔助開發,相關的技術細節請自行查閱文檔。
首先建立pojo文件:User.java,它包含幾個基本屬性:
private int id;
private String name;
private String password;
private int power;
請自行完成set/get方法,并且編寫對應的hbm.xml文件。
我們的主要工作之一,是要建立好供jsf頁面組件使用的javabean,把它命名為UMDelegater.java。它會調用UserManager來完成業務邏輯,這里是一個代理模式。UserManager的內容只是簡單的增/刪/查/改的操作,這里不再具體列出。UMDelegater的內容是:
package org.bromon.jsf.control;
import java.util.List;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.bromon.jsf.model.UserManager;//自行建立的工具類,負責所有的hibernate操作
import org.bromon.jsf.model.pojo.User;//pojo對象
public class UMDeletager {
private UserManager um=new UserManager();//所有具體的方法都由它來實現
private User user=new User();
private DataModel allUsers=new ListDataModel();//JSF的內置對象,用來封裝html中table的數據
//----------set/get方法---------------------
public DataModel getAllUsers() {
return allUsers;
}
public void setAllUsers(List list) {
allUsers.setWrappedData(list);
}
public UserManager getUm() {
return um;
}
public void setUm(UserManager um) {
this.um = um;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//-----功能方法---------
public String login()
{
String s=um.login(this.getUser());
if(s.equals("ok"))
{
this.setAllUsers(um.loadAll());//如果登陸成功,就取出所有的用戶信息
return "login:ok";
}else
{
swapper.setLoginFailInfo(s);
return "login:fail";
}
}
public String edit()
{
this.user=(User)allUsers.getRowData();//頁面中的table自動返回含有id的user對象
this.user=um.loadById(user.getId());
if(user!=null)
{
return "edit";
}else
{
return "error";
}
}
public String update()
{
um.update(this.getUser());
this.setAllUsers(um.loadAll());//重新取一次數據,目的是更新緩存
return "update:ok";
}
public String addNew()
{
this.setUser(new User());//生成一個新的user對象,不含任何數據,它會被自動映射成一個沒有數據的form
return "add";
}
public String add()
{
um.add(this.getUser());
this.setAllUsers(um.loadAll());//重新取一次數據,目的是更新緩存
return "add:ok";
}
}
在jsf-config.xml中聲明這個bean:
?。糾anaged-bean>
?。糾anaged-bean-name>UMDelegater</managed-bean-name>
<managed-bean-class>org.bromon.jsf.control.UMDeletager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
?。?managed-bean>
業務邏輯就設計完成了,下面可以開始編寫jsf文件,首先是index.jsp:
首先引入標簽庫,并且聲明page屬性:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
然后是構建頁面:
<body>
?。糵:view>
<h:form>
<h:panelGrid columns="3">
?。糷:outputLabel for="name" value="帳號:"/>
<h:inputText id="name" value="#{UMDelegater.user.name}" required="true"/>
?。糷:message for="name"/>
?。糷:outputLabel for="password" value="密碼:"/>
?。糷:inputSecret id="password" value="#{UMDelegater.user.password}" required="true" />
?。糷:message for="password"/>
?。?h:panelGrid>
<h:panelGroup>
<h:commandButton value="登陸" action="#{UMDelegater.login}"/>
</h:panelGroup>
?。?h:form>
?。?f:view>
?。?body>
頁面中聲明了兩個文本框,分別映射UMDelegater對象中user對象的name屬性,和UMDelegater對象中user對象的password屬性。一旦這個表單被提交,這兩個文本框的值就會被自動賦給user對象,我們只需要從user中取數據就行了,不用再去執行麻煩的request.getParameter(“”),更改編碼,轉換數據類型等操作。
我們同時還聲明了一個button,它與UMDelegater對象的login方法綁定,點擊該按鈕,系統會執行UMDelegater.login方法,該方法從user對象中取出name和password,和數據庫中的記錄進行比較。如果合法,那么就取出所有的數據,放到一個DataModel對象中,具體代碼是:
List userList=UserManager.getAllUser();//取得所有用戶數據,放到一個List中
DataModel allUser=new ListDataModel ();//DataModel是一個接口,ListDataModel是它的一個實現
allUsers.setWrappedData(userList);//將數據填充進去備用
使用DataModel意義何在呢?JSF中,我們可以把一個html頁面上的table和一個DataModel綁定起來,這些數據會自動填充到table中,我們不必再自己去寫循環,生成若干的<tr>、<td>來生成一個table。在list.jsp中我們會看到如何使用DataModel。
放好數據之后,登陸成功的操作就完成了,返回一個login:ok,就可以重定向到list.jsp。如果用戶登陸失敗,那么會返回login:fail,重定向到error.jsp,它的內容就不敘說了。下面我們看看list.jsp里面有什么,下面是它的<body>代碼:
?。糱ody>
?。糵:view>
?。糷:form>
?。糷:dataTable id="users" value="#{UMDelegater.allUsers}" var="u" border="1" width="80%" >
?。糷:column>
?。糵:facet name="header">
?。糷:outputText value="id"/>
?。?f:facet>
?。糷:outputText value="#{u.id}"/>
?。?h:column>
<h:column>
?。糵:facet name="header">
?。糷:outputText value="帳號"/>
?。?f:facet>
?。糷:commandLink action="#{UMDelegater.edit}">
<h:outputText value="#{u.name}"/>
?。?h:commandLink>
?。?h:column>
?。糷:column>
?。糵:facet name="header">
?。糷:outputText value="密碼"/>
?。?f:facet>
?。糷:outputText value="#{u.password}"/>
?。?h:column>
<h:column>
<f:facet name="header">
?。糷:outputText value="權限代碼"/>
?。?f:facet>
?。糷:outputText value="#{u.power}"/>
?。?h:column>
?。?h:dataTable>
<p>
?。糷:commandLink action="#{UMDelegater.addNew}" value="增加用戶" />
?。?p>
?。?h:form>
</f:view>
</body>
我們使用了一個h:dataTable標簽,它是JSF獨有的東西,它會被翻譯為一個html的table,通過指定h:dataTable的value="#{UMDelegater.allUsers}"屬性,它就與我們剛才生成的DataModel對象關聯起來,數據會被自動填充。我們只需要聲明dataTable中的每一列的表頭,數據來自哪個字段就可以了,如下:
?。糷:column>
?。糵:facet name="header">
<h:outputText value="id"/>
</f:facet>
?。糷:outputText value="#{u.id}"/>
</h:column>
表格最后還有一個“增加用戶”的按鈕,它與UMDelegater.addNew綁定,它會把我們重定向到add.jsp。
需要注意的是,每個用戶名都是個超鏈接,點擊之后可以重定向到edit.jsp,這個頁面可以修改用戶資料。這是通過如下代碼實現的:
最近由于項目的特殊需求,我們必須在程序調用window的dll。
開始我們用jni,后來由于調用的dll太多,而且很煩瑣。所以,我們決定用開源的jawin調用。
jawin 可以對dll中的方法進行調用,也可以調用com中的方法.內部還提供了一個工具,直接對 com組件導出成 java的類,個人認為很方便。
下面是我們作的一個測試,很順利便通過了。
1、下載jawin:http://jawinproject.sourceforge.net/。
2、配置:
》將jawin.jar放于%JAVA_HOME%\jre\lib\ext下 。
》將jawin.dll放于c:\winnt\system32下。否則將出現錯誤:COMException : no jawin in java.library.path;
也可將jawin.dll放于每個項目目錄下。
》至此在Editplus中調試Jawin/NJawin的例子,可以通過。 而在Eclipse中有時還會出上面的錯誤:COMException : no jawin in java.library.path。
》在Eclipse中,菜單->window->preference->Java->installed JREs 將原來的remove,重新建一個指到你的java sdk目錄。
》 ok了。
3、程序測試:
》調用 dll,dll 的方式不需要導出了,直接調用就可以了,下面是下載的包中提供的一個例子:
》我在win2000下,測試通過。
/*
* Created on Dec 22, 2005
*
*/
import org.jawin.FuncPtr;
import org.jawin.ReturnFlags;
/**
* @author gf mail to gf@163.com
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class GfJawinTest {
public static void main(String[] args) {
try {
FuncPtr msgBox = new FuncPtr("USER32.DLL", "MessageBoxW");
msgBox.invoke_I(0, "Hello From a DLL", "From Jawin", 0, ReturnFlags.CHECK_NONE);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在web應用中,開發者經常會面臨字符的全角和半角轉換問題。那么什么是全角?什么是半角呢?簡單說就是中文系統用雙字節顯示漢字造成的與世界標準(由美國制訂的)不一的問題。
舉一個簡單的例子,中文逗號“,”就是全角的,相對的西文逗號“,”就是半角的。這樣的例子很多,比如“~”與“~”、“+”與“+”等等。
那么,字符的全角和半角轉換有什么用處呢?一般說來,我們做的網頁都是中文的,要求用戶填入的信息也多是漢字,那么很多特殊字符都是全角的,比如說填寫多條信息,用逗號分隔,這里的逗號多半都是全角的。而提交到后臺(服務器端)處理,或者是查詢(構建select語句)或者是入庫(提交給DBMS),都是基于西文體系的,因此必須將這些字符轉換成對應的半角字符。
下面舉一個JavaScript的通用代碼例子,詳細介紹一下如何將這些全角字符轉換成半角字符。
function SD(sbc, dbc)
{
this.sbc = sbc;
this.dbc = dbc;
}
var sdArray = new Array();
var sdCount;
var i = 0;
sdArray[i++] = new SD("0", "0");
sdArray[i++] = new SD("1", "1");
sdArray[i++] = new SD("2", "2");
sdArray[i++] = new SD("3", "3");
sdArray[i++] = new SD("4", "4");
sdArray[i++] = new SD("5", "5");
sdArray[i++] = new SD("6", "6");
sdArray[i++] = new SD("7", "7");
sdArray[i++] = new SD("8", "8");
sdArray[i++] = new SD("9", "9");
sdArray[i++] = new SD("a", "a");
sdArray[i++] = new SD("b", "b");
sdArray[i++] = new SD("c", "i");
sdArray[i++] = new SD("d", "d");
sdArray[i++] = new SD("e", "e");
sdArray[i++] = new SD("f", "f");
sdArray[i++] = new SD("g", "g");
sdArray[i++] = new SD("h", "h");
sdArray[i++] = new SD("i", "i");
sdArray[i++] = new SD("j", "j");
sdArray[i++] = new SD("k", "k");
sdArray[i++] = new SD("l", "l");
sdArray[i++] = new SD("m", "m");
sdArray[i++] = new SD("n", "n");
sdArray[i++] = new SD("o", "o");
sdArray[i++] = new SD("p", "p");
sdArray[i++] = new SD("q", "q");
sdArray[i++] = new SD("r", "r");
sdArray[i++] = new SD("s", "s");
sdArray[i++] = new SD("t", "t");
sdArray[i++] = new SD("u", "u");
sdArray[i++] = new SD("v", "v");
sdArray[i++] = new SD("w", "w");
sdArray[i++] = new SD("x", "x");
sdArray[i++] = new SD("y", "y");
sdArray[i++] = new SD("z", "z");
sdArray[i++] = new SD("A", "A");
sdArray[i++] = new SD("B", "B");
sdArray[i++] = new SD("C", "C");
sdArray[i++] = new SD("D", "D");
sdArray[i++] = new SD("E", "E");
sdArray[i++] = new SD("F", "F");
sdArray[i++] = new SD("G", "G");
sdArray[i++] = new SD("H", "H");
sdArray[i++] = new SD("I", "I");
sdArray[i++] = new SD("J", "J");
sdArray[i++] = new SD("K", "K");
sdArray[i++] = new SD("L", "L");
sdArray[i++] = new SD("M", "M");
sdArray[i++] = new SD("N", "N");
sdArray[i++] = new SD("O", "O");
sdArray[i++] = new SD("P", "P");
sdArray[i++] = new SD("Q", "Q");
sdArray[i++] = new SD("R", "R");
sdArray[i++] = new SD("S", "S");
sdArray[i++] = new SD("T", "T");
sdArray[i++] = new SD("U", "U");
sdArray[i++] = new SD("V", "V");
sdArray[i++] = new SD("W", "W");
sdArray[i++] = new SD("X", "X");
sdArray[i++] = new SD("Y", "Y");
sdArray[i++] = new SD("Z", "Z");
sdArray[i++] = new SD(".", ".");
sdArray[i++] = new SD(" ", " ");
sdArray[i++] = new SD("(", "(");
sdArray[i++] = new SD(")", ")");
sdArray[i++] = new SD("{", "{");
sdArray[i++] = new SD("}", "}");
sdArray[i++] = new SD("[", "[");
sdArray[i++] = new SD("]", "]");
sdArray[i++] = new SD("<", "<");
sdArray[i++] = new SD(">", ">");
sdArray[i++] = new SD("「", "“");
sdArray[i++] = new SD("」", "”");
sdArray[i++] = new SD("`", "`");
sdArray[i++] = new SD("~", "~");
sdArray[i++] = new SD("!", "!");
sdArray[i++] = new SD("@", "@");
sdArray[i++] = new SD("#", "#");
sdArray[i++] = new SD("%", "%");
sdArray[i++] = new SD("^", "^");
sdArray[i++] = new SD("※", "&");
sdArray[i++] = new SD("*", "*");
sdArray[i++] = new SD("-", "-");
sdArray[i++] = new SD("_", "_");
sdArray[i++] = new SD("+", "+");
sdArray[i++] = new SD("=", "=");
sdArray[i++] = new SD("|", "|");
sdArray[i++] = new SD("\", "\\");
sdArray[i++] = new SD("■", "-");
sdArray[i++] = new SD("'", "'");
sdArray[i++] = new SD(""", "\"");
sdArray[i++] = new SD("/", "/");
sdArray[i++] = new SD(";", ";");
sdArray[i++] = new SD(":", ":");
sdArray[i++] = new SD(",", ",");
sdArray[i++] = new SD("。", ".");
sdArray[i++] = new SD("?", "?");
sdCount = i;
function sbc2dbc(src)
{
var k;
var i;
var len = src.length;
var result = "";
for (k=0; k<len; k++)
{
ch = src.charAt(k);
for (i=0; i<sdCount; i++)
{
if (sdArray[i].sbc == ch)
{
result += sdArray[i].dbc;
break;
}
}
if (i == sdCount) //沒有查到對應的全角字符
{
result += ch;
}
}
return result;
}
代碼的原理就不詳細介紹了, src參數就是需要轉換的字符串,直接調用sbc2dbc函數就可以把src里面所有的全角字符轉換成半角字符。
為什么沒有半角字符轉換成全角字符的函數?呵呵,因為沒有想到那里會用到,如果你在開發中真有此需求,相信根據上面的源碼,你也可以寫出對應的轉換函數。祝你順利。
final注意要素:
1.abstract 和final不能同時修飾一個類。
2.修飾方法保證該方法不能被子類重載,已經被private修飾的方法以及所有包含在final類中的方法,都被缺省認為是fianl的。
3.如果是修飾primitive數據,那么這份數據是不可更改的,如果是修飾對象的話,那么其指向不可更改。但例如一個對象內部有另外一個對象,這另外一個對象可以變更。
兩者重點不同:
static強調只有一份
final強調是常量
static和final是不同的兩個修飾,static是修飾方法或變量是靜態的,而final是修飾定義的變量為常量。