2006年9月15日
我們知道,在子類繼承父類之后,如果子類與父類有同名的字段和方法,那么子類中的子段會代替或隱藏父類的子段,說明子類字段覆蓋了超類字段,但可以通過super關鍵字去訪問超類字段。但是,在我們將子類對象向超類轉型的時候就會發生這個奇怪的現象,子類對象居然可以看到父類曾經被覆蓋掉的字段!就正如下面例子中一樣:
?1?class?A{
?2?????boolean?bb?=false;
?3?}
?4?
?5?public?class?B?extends?A{
?6?????boolean?bb?=?true;
?7?????//int?a=1;
?8?????public?static?void?main(String[]?args)?{
?9?????????B?b?=new?B();
10?????????A?a?;
11?????????a=?b;
12?????????//---??
13?????????System.out.println(a.bb);
14?????????//---這句可以理解
15?????????System.out.println(b.bb);
16?????????//---??
17?????????System.out.println(?((A)b).bb);
18?????????//----
19?????}
20?????/*運行結果
21??????*?false
22??????*?true
23??????*?false
24??????*?*/
25?}
為什么會發生這樣的情況呢?
關于這種情況的解釋在[美]Peter van der Linden著的《Just Java2》中有了答案:
P106他說:
???一定要注意:當把子類轉換成超類時,子類可以見到或訪問被隱藏的同名變量。Java允許名字重復的原因是,允許將來把新的字段加到超類中,而不影響已經使用了該名字的現有子類,子類將會繼續使用自己的字段副本。
除非讓子類以超類對象的形式出現,方法可以覆蓋,但是字段不能被覆蓋。注意:最好不要隱藏超類中的字段名。
?????所以我們在進行向上轉型的時候一定要注意:不要訪問子類中那些“覆蓋”掉父類的字段(它并沒有真正覆蓋掉,在向上轉型的時候就可以訪問的到),要么將子類字段改名(在你知道父類代碼的情況下),要么通過方法來訪問字類字段(方法即使同名也肯定能覆蓋掉)。
經過一個星期的艱苦奮斗終于解決了這個問題,特將經驗摘錄下來備忘。本文將解決以下的幾種亂碼問題。
中文存入
mysql
數據表出現的亂碼,從
JSP
頁面讀取
mysql
中文數據出現亂碼,以及在
sell
環境下查看數據庫表中文數據出現亂碼。
linux平臺:ubuntu6.10
mysql版本:5.0
瀏覽器:firefox2.0
為了解決中文亂碼的問題首先就是要同一字符集,我采用utf-8。
第一步:安裝mysql后,修改配置文件/etc/mysql/my.cnf 找到相應項并添加如下字段,如下所示:(注意是添加,配置文件中其他不相關的內容下面并沒有列出來)
[client]
default-character-set=utf8
[mysqld_safe]
default-character-set=utf8
[mysqld]
default-character-set=utf8
[mysql]
default-character-set=utf8
重新啟動mysql服務,進入sell終端,進入mysql的命令提示符下輸入如下指令:
mysql>show variables like '%char%';
如果出現的列表各項內容和以下相同表明配置成功了,
+----------------------+---------------------
| Variable_name | Value
+-----------------------+---------------------
| character_set_client | utf8
| character_set_connection | utf8
| character_set_database | utf8
| character_set_filesystem | binary
| character_set_results | utf8
| character_set_server | utf8
| character_set_system | utf8
| character_sets_dir | /usr/share/mysql/charsets/
+---------------------+----------------------
第二步:在要發送中文或者要讀取中文的JSP頁面(最好所有頁面)都添加如下聲明:
<%@page pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
<% request.setCharacterEncoding("utf-8"); %>
在<head>標簽對中添加如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
注意在servlet中對請求進行響應的方法中同樣要有:
response.setContentType("text/html;charset=utf-8");
第三步:(由于不明原因firefox發送的請求仍然是latin1的時候執行這一步)
在將請求的參數插入數據庫之前還要再執行一次轉碼(將latin1編碼轉換為utf-8),例如:
String
utf8_str
= new String(
latin_str
.getBytes("latin1"),"utf-8");
這一步可以寫在一個過濾器中,不怕麻煩也可以在每一次在將請求數據插入之前都進行一次轉碼。
另外:在連接數據庫的時候可以不用加上字符集參數了,直接用用戶名和密碼連接就可以了,如連接:
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名","用戶名","密碼");
摘要: 時間過的快么?人的感覺而已,時間還是那樣地流過,但人們卻有不同的感受,收獲的越多,感覺時間過的越慢,認知的越少,時間也就過的越快。有三個月沒寫點什么東西了,為了讓時間記住這三個月都發生了什么,趁現在還沒有忘記還是記錄下來罷,今天心情不好所以廢話也就多點。
??????
按時間順序一個一個來吧。
... 閱讀全文
關于ubuntu與xp雙系統的安裝過程
:
-
(正常安裝完windows之后)分區:使用harddiskmanager或其它分區軟件劃分一個ext3主分區和swap分區,另外在擴展分區中劃分出多個要供linux使用的的邏輯分區。
-
將windows系統分區的激活狀態設置為關閉(不能設置為隱藏)。將linux主分區設置為激活。
-
光盤啟動ubuntu的liveCD,進入系統后安裝,手動編輯分區表:將/root掛載在linux主分區上,將/usr , /var , /home 掛載在邏輯分區上。grub安裝在linux的主分區上(即/root分區),注意grub的分區計數是從0開始,系統目錄掛載分區技數從1開始,假如linux系統分區是第一個硬盤的第三個分區,則系統目錄掛載分區表示為:/dev/hda3其中a表示第一塊硬盤3表示第三個分區,相應的grub表示為(hd0,2)數字0表示第一個硬盤,2表示第三個分區。
-
安裝完畢后取出光盤重起進入ubuntu系統。
配置ubuntu系統
-
上網:sudo pppoeconf
-
更改源:sudo gedit /etc/apt/sources.list 按速度快慢(使用ping測試)將源地址添加在開頭,最后加入官方源。
-
更新軟件包信息:sudo apt-get update
-
添加中文支持。在語言支持中選chease并打勾,自動下載語言包和輸入法。
-
在英文界面下添加輸入法: sudo apt-get install im-switch libapt-pkg-perl sudo im-switch -s scim -z default 注銷一次
-
?下載可同軟件的更新。
與window局域網互聯
。
-
安裝網絡服務nfs 和 smb 修改靜態IP。
-
添加一個window可訪問的用戶帳號: sudo adduser -a xxx? 輸入密碼? 添加smb用戶 smbpasswd -a xxx 輸入密碼。
-
創建一個網絡文件夾的本地掛載點? 協議:window共享? 服務器:對發ip? 域:工作組名 用戶名:登錄對方window的帳號 連接名:隨便。
雙網卡與window實現共享上網,ububtu做主機
-
下載firestarter安裝,配置:連接internet:pppo -》打開網絡共享:與window互聯的網卡—》添加策略:inbound traffic policy :Allow connection:對方IP。—》service: DNS ,SSH ,FTP ,HTTP ...?根據需要開放端口。
-
下載并安裝bind9,配置bind9:sudo gedit /etc/bind/name.conf.options 在forwards 下添加域名解析服務器的IP地址。
其他注意
:
-
firefox與flash插件9.0存在兼容問題,使用較低的flash插件版本。
-
備份/var/cache/apt/下的所有軟件包文件以避免以后重新下載。以后需要安裝時只需copy相應的軟件包到該目錄下即可。
-
可以在使用在windows下安裝的ghost8.3在dos下來備份和恢復linux ext3分區。
-
安裝bin文件:先給予可執行權限chmod +x xxx.bin在sell下輸入bin文件所在的路徑執行即可,如 ~/backup/xxx.bin
另外注意備份windows的分區表,以防萬一
摘要: DTD和Schema簡介
DTD和Shema用來定義將用來表示數據的元素
DTD語法
Schema簡介
使用 XML 模式,您會有更多的能力來定義什么樣的 XML 文檔是有效的
閱讀全文
摘要: 《XML精要》
前言
開始學XML也有個把星期了,前后看了幾本書關于XML基礎的書,感覺講的甚是凌亂,有些書甚至干脆直接在網上COPY些資料東抄一點西抄一點最后就出版了(比如《XML語言及應用---清華大學出版社》就干脆直接將網上的《XML初學進階》抄下來,將例子改改就完了)現在中國大學治學的態度可見一斑,直到本周發現了一個IBM的在線XML教程,該教程將XML所有的知識分解為一個個單獨的講座,每堂課還介紹了所需要的前提知識以及所要用到到參考資料,而且教程將知識講的非常的簡練和精確,但可惜該教程是在2002年左右發表的了,在網上資源不是很好找而且比較散,所以我決定將我學的每趟講座的精要和我個人的讀書筆記整理出來形成一個連載,一來鞏固我的學習,二來也可以供大家參考,取名《XML精要》。言歸正傳,那我就開始嘍 閱讀全文
一:語法結構:
??????
嵌入
*.js
文件
<script? language=”javScript” src=”url ”></script>
1.?
定義結構:
a)????????
變量定義:
var xx = “xx”
無須匹配類型;
b)???????
函數定義:
function method(x , y){…}
參數同樣不用匹配類型;
可以通過
arguments.length
屬性來確定參數個數來創建不確定參數的函數如:
??? function noArguments(){
????????????? var len = arguments.length;
????????????? for(var i=0;i<len;i++){
?????????????
????????????? var fristArgument = noArguments.arguments[i];
??????????????????????????? ………//
通過
? noArguments.arguments[i]
獲得參數;
}
}
c)???????
對象定義:
定義方式一
? function obj(x,y){
?????? this.x=x;
?????? this.y=y;
?????? this.m1=method1;
?????? this.m2=method2;
?????? function method1(){…..}
function method2(){…..}
}
定義方式二
? function obj(x,y){
?????? this.x=x;
?????? this.y=y;
?????? this.m1=function method1(){……}
?????? this.m2=function method2(){……}
}
d)???????
使用對象:
var obj1 = new obj();
var new_x = obj.x; //
是用屬性的方式
1
var new_y = obj[‘y’]; //
是用屬性的方式
2
二
內置對象:
?????? a)
數組對象(
Array
):
???????????????????? var newArry =new Arry(n);
???????????????????? var newArry =new Arry(“one”,”two”,”there”,”four”);
??????
注:屬性和方法不再列出。
??????
b)
字符串對象(
String
):
???????????????????? var newStr =”xxx”;
???????????????????? var newStr=new String(“xxx”);
??????
對字符串的比較直接使用
”= =”
??????
?????? c)
數學對象(
Math
)
?????????????
注意:使用數學對象時不需要創建該對象,直接使用即可;
?????????????
例如:
Math.PI; //
屬性的使用
Math.abs(x);//
方法的使用;
d)
日期對象(
Date
)
??????? var date1 =new Date();
????????????? var date2 =new Date(“
日期子串
”);
????????????? var date3 =new Date(
年,月,日,
[
時,分,秒,毫秒
]);
????????????? var date4 =new Date(
毫秒
);
?
當使用JSP頁面將中文數據添加到MySql數據庫中的時候發現變為亂碼,或者從mysql中讀取中文的時候出現亂碼,這些問題根源都是由于字符編碼不一致造成的。要知道病源是什么我們才能對癥下藥,所以我將問題產生的過程簡單描述一下(如有不對望高人賜教)
?我們以一個從form表單讀取數據并寫入mysql數據庫的例子來講解;
HTML頁面參數—(以瀏覽器的編碼方式發送)—》JSP頁面—(以JSP定義的編碼方式被編譯)—》被JSP引擎編譯為*.class文件——》在JSP容器中運行——》傳遞給Mysql數據庫—(以數據庫的編碼方式讀取數據并存儲)—》讀取Mysql—(以數據庫的編碼方式讀取)—》JSP頁面接受后在瀏覽器中顯示(以瀏覽器編碼方式解碼顯示);
注意:這里的“瀏覽器編碼”“JSP頁面編碼”“JSP頁面輸出編碼”“JSP頁面輸入編碼”“數據庫的編碼”可能存在潛在的不一直,當它們中的任意一個不相同的時候就會出現亂碼;就好像傳話游戲一樣,張三要把話傳給李四,李四把他聽到的傳給王五,要讓王五知道張三說的什么就需要他們三個人使用的相同語言,如果李四是個火星人,他當然聽不懂張三說什么,然后他還不厚道的對王五說火星話(亂碼),結果王五就只能聽到亂碼了。(比喻比較汗~~^_^!)
好了,現在我們就依次把各個編碼方式改為相同就可以了;
//-------------------------瀏覽器編碼-----------------
<html>
? <head><meta http-equiv="Content-Type" content="text/html; charset=GB2312"></head>
</html>
//---------------------------JSP頁面-------------------
<%@ page pageEncoding="GB2312"%>??????????????????????????? //JSP頁面編碼:
<%@ page contentType="text/html;charset=gb2312"%>????//JSP頁面輸出編碼:
<% request.setCharacterEncoding("gb2312");?%>?????????????? //JSP頁面輸入編碼:
//------------------------MySql編碼-------------------
Connection connect = java.sql.DriverManager.getConnection(
"jdbc:mysql://localhost/mydb?user=登陸帳號&password=你的密碼&useUnicode=true&characterEncoding=gb2312");
//-------------------------------------------------------
注意:gb2312的寫法(紅色部分) 在瀏覽器和數據庫中的寫法要區分!
以上配置測試成功!(tomcat5.5+MySql5.0)
//另外看了網上的很多文章,比如通過函數轉碼啊~~改配置文件啊~~都不如這樣來的簡便且成功率高!
推薦!
運行環境 tomcat5.5+MySql5.0
編寫一個簡單的HTML表單:
<html>
????<head>
????</head>
????<body>
????????<form?action="http://127.0.0.1/test/login.jsp"?method="post">
????????????????學號:<input?type="text"?name="id"><br>
????????????????姓名:<input?type="text"?name="name"><br>
????????????????<label>
??????<input?type="radio"?name="sex"?value="boy"?checked>
????????????男</label>
??????<label>
??????<input?type="radio"?name="sex"?value="girl">
????????????女</label><br>
????????????????電話:<input?type="text"?name="tel"><br>
????????????????<input?type="submit"?value="提交">
????????????????<input?type="reset"?value="重填">
????????</form>
????</body>
</html>接這編寫一個JSP文件用于讀取表單數據
Connection?conn?=?null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn?=?java.sql.DriverManager.getConnection("jdbc:mysql://localhost/mydb","root","corsair");

if(conn==null)
{
System.out.println("get?Conn?Error");
}
Statement?stmt=conn.createStatement();
ResultSet?rs=null;
%>
<%
????String?id,name,sex,tel;
????id=request.getParameter("id");
????name=request.getParameter("name");
????sex=request.getParameter("sex");
????tel=request.getParameter("tel");

????try
{
????stmt.executeUpdate("INSERT?INTO?inf_student(id,name,sex,tel)?VALUES?('"+id+"','"+name+"','"+sex+"','"+tel+"')");

????}catch(SQLException?e)
{}
stmt.close();
conn.close();
%>將以上文件保存在tomcat5.5的webapps目錄下;然后啟動tomcat5.5和mysql數據庫,最后打開表單,插入數據提交,并可以mysqlQueryBrower查看到插入數據的情況了。