2008年11月15日
在進行文件下載時liunx下出現中文文件名亂碼,windows下卻沒有.可能是不同操作系統的編碼方式不同?(含糊不清的說法),用
Properties initProp = new Properties(System.getProperties());
System.out.println(prop.getProperty("file.encoding"));能得到編碼方式都是UTF-8
后來發現用
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");不管linux還是windows 下用火狐都是顯示正常的,IE下卻顯示亂碼,所以問題出在瀏覽器,得在程序中加入判斷(分別處理firefox跟Ie):
//判斷是否是使用IE的方法
String userAgent = request.getHeader("User-Agent");
boolean isIE = false;
//userAgent.toLowerCase().indexOf("msie")
if(userAgent.indexOf("MSIE") > 0){
isIE = true;
}
if(isIE){
fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");
}else{
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
一個同學前幾天遇到一個問題,今天我試著看了一下。
項目沒有錯誤,在項目部署到tomcat后,tomcat啟動時報錯:
java.lang.UnsupportedClassVersionError: Bad version number in .class file 。。。
這個問題我原來遇到過,原因應該是編譯java時生成的class文件,在運行時用到的JRE和class文件版本不一致造成的。
1 如果是一般的java程序:
可以在MyEclipse中修改JRE的路徑和版本。在Window->Preferences中,打開如下位置,就可修改JRE:

修改完之后,最好重新編譯一下,選Project->Clean... 選項,然后選擇是所有的項目都要重新編譯,還是只重新編譯指定的項目,然后就應該沒問題了。
今天一開始我也是這么做的,但是還是報錯,在網上搜了一下之后,因為這是Web項目,程序當然是在Tomcat上運行的,所以我們這么改當然不行。
2 如果是Web 程序
就要修改Tomcat運行時的JDK環境了,如下圖:

把JDK的路徑和之前Installed JRE的設置成一樣的,這個問題就解決了!(雖然這里面設置的是JDK的路徑,但是我覺得其實就是在設置JRE的路徑,因為java程序運行的時候需要的 是JRE,而不是JDK。我們裝JDK的時候,一般都裝了2個JRE,一個是JDK里面的JRE,還有一個和JDK平級的JRE,剛才我上網查了一下,這 兩個JRE的區別不大,大家也可以去查一下,每次都可以選擇任何一個JRE,但是之后配置的吆喝前面的一致。)
如果不清楚JDK和JRE的關系的,可以上網查一下。
一般情況下,我們運行別人的程序可能會遇到這個問題。
再做個小小的延伸。。
這個項目編譯并沒有報錯,如果我們導入別人的項目之后,出現了很多錯誤,那就是JDK版本的問題了,可以在這里修改:

可以選擇1.3,1.4,5.0,6.0.
轉 http://apps.hi.baidu.com/share/detail/1776104
http://mayuqi827.javaeye.com/blog/804409
LINUX基本操作命令
基本操作命令
----------------------------------------------------------------------
----------------------------------------------------------------------
ls #以默認方式顯示當前目錄文件列表
ls –a #顯示所有文件包括隱藏文件
ls –l #顯示文件屬性,包括大小,日期,符號連接,是否可讀寫及是否可執行
ls --color=never *.so > obj #不顯示文字顏色,將所有so文件記錄到obj文件中
----------------------------------------------------------------------
cd dir #切換到當前目錄下的dir目錄
cd / #切換到根目錄
cd .. #切換到到上一級目錄
cd ../.. #切換到上二級目錄
cd ~ #切換到用戶目錄,比如是root用戶,則切換到/root下
----------------------------------------------------------------------
rm file #刪除某一個文件
rm -fr dir #刪除當前目錄下叫dir的整個目錄
----------------------------------------------------------------------
cp source target #將文件source 復制為 target
cp /root/source . #將/root下的文件source復制到當前目錄
cp –av soure_dir target_dir #將整個目錄復制,兩目錄完全一樣
cp –fr source_dir target_dir
#將整個目錄復制,并且是以非鏈接方式復制,當source目錄帶有符號鏈接時,兩個目錄不相同
----------------------------------------------------------------------
mv source target #將文件source更名為target
----------------------------------------------------------------------
diff dir1 dir2 #比較目錄1與目錄2的文件列表是否相同,但不比較文件的實際內容,不同則列出
diff file1 file2
#比較文件1與文件2的內容是否相同,如果是文本格式的文件,則將不相同的內容顯示,如果是二進制代碼則只表示兩個文件是不同的
comm file1 file2 #比較文件,顯示兩個文件不相同的內容
----------------------------------------------------------------------
echo message #顯示一串字符
echo "message message2" #顯示不連續的字符串
cat:
cat file #顯示文件的內容,和DOS的type相同
cat file | more #顯示文件的內容并傳輸到more程序實現分頁顯示,使用命令less file可實現相同的功能
more #分頁命令,一般通過管道將內容傳給它,如ls | more
----------------------------------------------------------------------
export LC_ALL=zh_CN.GB2312 #將環境變量LC_ALL的值設為zh_CN.GB2312
export DISPLAY=0:0 #通過該設置,當前字符終端下運行的圖形程序可直接運行于Xserver
date #顯示當前日期時間
date -s 20:30:30 #設置系統時間為20:30:30
date -s 2002-3-5 #設置系統時期為2003-3-5
clock –r #對系統Bios中讀取時間參數
clock –w #將系統時間(如由date設置的時間)寫入Bios
----------------------------------------------------------------------
eject #umout掉CDROM并將光碟彈出,但cdrom不能處于busy的狀態,否則無效
----------------------------------------------------------------------
du #計算當前目錄的容量
du -sm /root #計算/root目錄的容量并以M為單位
find -name /path file #在/path目錄下查找看是否有文件file
grep -ir “chars” #在當前目錄的所有文件查找字串chars,并忽略大小寫,-i為大小寫,-r為下一級目錄
----------------------------------------------------------------------
vi file #編輯文件file
vi 原基本使用及命令:
輸入命令的方式為先按ctrl+c, 然后輸入:x(退出),:x!(退出并保存) :w(寫入文件),:w!(不詢問方式寫入文件), :r
file(讀文件file) ,:%s/oldchars/newchars/g(將所有字串oldchars換成newchars)
這一類的命令進行操作
----------------------------------------------------------------------
man ls #讀取關于ls命令的幫助
man ls | grep color #讀取關于ls命令的幫助并通過grep程序在其中查找color字串
----------------------------------------------------------------------
startx #運行Linux圖形有環境
Xfree86 #只運行X圖形server
----------------------------------------------------------------------
reboot #重新啟動計算機
halt #關閉計算機
init 0 #關閉所有應用程序和服務,進入純凈的操作環境
init 1 #重新啟動應用及服務
init 6 #重新啟動計算機
----------------------------------------------------------------------
擴展命令
----------------------------------------------------------------------
----------------------------------------------------------------------
tar xfzv file.tgz #將文件file.tgz解壓
tar xfzv file.tgz -C target_path #將文件file.tgz解壓到target_path目錄下
tar cfzv file.tgz source_path #將文件source_path壓縮為file.tgz
tar c directory > directory.tar #將目錄directory打包成不壓縮的directory.tar
gzip directory.tar #將覆蓋原文件生成壓縮的 directory.tar.gz
gunzip directory.tar.gz #覆蓋原文件解壓生成不壓縮的 directory.tar。
tar xf directory.tar #可將不壓縮的文件解包
----------------------------------------------------------------------
dmesg #顯示kernle啟動及驅動裝載信息
uname #顯示操作系統的類型
uname -R #顯示操作系統內核的version
----------------------------------------------------------------------
strings file 顯示file文件中的ASCII字符內容
----------------------------------------------------------------------
rpm -ihv program.rpm #安裝程序program并顯示安裝進程
rpm2targz program.rpm program.tgz #將rpm格式的文件轉換成tarball格式
----------------------------------------------------------------------
su root #切換到超級用戶
sulogin /dev/tty4 #在tty4即alt+F4終端等待用戶登陸或直接登陸開啟一個shell
chmod a+x file #將file文件設置為可執行,腳本類文件一定要這樣設置一個,否則得用bash file才能執行
chmod 666 file #將文件file設置為可讀寫
chown user /dir #將/dir目錄設置為user所有
----------------------------------------------------------------------
mknod /dev/hda1 b 3 1 #創建塊設備hda1,主設備號為3,從設備號為1,即master硬盤的的第一個分區
mknod /dev/tty1 c 4 1 #創建字符設備tty1,主設備號為4,眾設備號為1,即第一個tty終端
----------------------------------------------------------------------
touch /tmp/running #在/tmp下創建一個臨時文件running,重新啟動后消失
----------------------------------------------------------------------
sleep 9 #系統掛起9秒鐘的時間
----------------------------------------------------------------------
lpd stop 或 cups stop #停止打印服務程序
lpd start 或 cups start #啟動打印服務程序
lpd restart 或 cups restart #重新啟動打印服務程序
lpr file.txt #打印文件file.txt
----------------------------------------------------------------------
fdisk /dev/hda #就像執行了dos的fdisk一樣
cfdisk /dev/hda #比fdisk界面稍為友好些
mount -t ext2 /dev/hda1 /mnt #把/dev/hda1裝載到 /mnt目錄
df #顯示文件系統裝載的相關信息
mount -t iso9660 /dev/cdrom /mnt/cdrom #將光驅加載到/mnt/cdrom目錄
mount-t smb //192.168.1.5/sharedir /mnt -o
username=tomlinux,password=tomlinux
#將windows的的共享目錄加載到/mnt/smb目錄,用戶名及密碼均為tomlinux
mount -t nfs 192.168.1.1:/sharedir /mnt
#將nfs服務的共享目錄sharedir加載到/mnt/nfs目錄
umount /mnt #將/mnt目錄卸載,/mnt目錄必須處于空閑狀態
umount /dev/hda1 #將/dev/hda1設備卸載,設備必須處于空親狀態
sync #將cache中的內容與磁盤同步,在Linux中復制文件,一般要系統空閑才去寫文件
e2fsck /dev/hda1 #檢查/dev/hda1是否有文件系統錯誤,提示修復方式
e2fsck -p /dev/hda1#檢查/dev/hda1是否有錯誤,如果有則自動修復
e2fsck -y /dev/hda1#檢查錯誤,所有提問均于yes方式執行
e2fsck -c /dev/hda1#檢查磁盤是否有壞區
mkfs /dev/hda1 #格式化/dev/hda1為ext2格式
mkfs.minix /dev/hda1 #格式化/dev/hda1為minix格式文件系統
mfks /dev/hda9 #格工化/dev/hda9為Linux swap格式
swapon /dev/hda9 #將swap分區裝載當作內存來用
swapoff /dev/hda9 #將swap分區卸載
----------------------------------------------------------------------
lilo #運行lilo程序,程序自動查找/etc/lilo.conf并按該配置生效
lilo -C /root/lilo.conf #lilo程序按/root/lilo.conf配置生效
grub #在Linux shell狀態下運行boot loader設置程序
grub-install
#安裝grub磁盤引導程序,成功后升級內核無須像lilo一樣要重新啟動系統,只需修改/etc/grub.conf即可實現新引導配置
rdev bzImage #顯示kernel的根分區信息
rdev bzImage /dev/hda1
#將kernel的根分區設置為/dev/hda1,這在沒有lilo等引導程序的系統中非常重要.
----------------------------------------------------------------------
dd if=/dev/fd0 of=floppy.fd #將軟盤的內容復制成一個鏡像,功能與舊石器時代常用的hd-copy相同
dd if=/dev/zero of=root.ram bs=1024,count=1024
#生成一個大小為1M的塊設備,可以把它當作硬盤的一個分區來用
mkfs root.ram #將塊設備格式化為ext2格式
dd if=root.ram of=/dev/ram0 #將init.rd格式的root.ram的內容導入內存
mount /dev/ram0 /mnt #ramdisk /dev/ram0裝載到/mnt 目錄
----------------------------------------------------------------------
gcc hello.c #將hello.c編譯成名為a.out二進制執行文件
gcc hello.c -o hello #將hello.c編譯成名為hello的二進制執行文件
gcc -static -o hello hello.c #將hello.c編譯成名為hello的二進制靜態執行文件
ldd program #顯示程序所使用了哪些庫
objcopy -S program #將程序中的符號表及無用的調試信息去掉,可以小很多
----------------------------------------------------------------------
strace netscape
#跟蹤程序netscape的執行,看調用的庫,環境變量設置,配置文件,使用的設備,調用的其它應用程序等,在strace下,程序干了什么東東一目了
然。
ps #顯示當前系統進程信息
ps –ef #顯示系統所有進程信息
kill -9 500 #將進程編號為500的程序干掉
killall -9 netscape #將所有名字為netscape的程序殺死,kill不是萬能的,對僵死的程序則無效。
top #顯示系統進程的活動情況,按占CPU資源百分比來分
free #顯示系統內存及swap使用情況
time program #在program程序結束后,將計算出program運行所使用的時間
----------------------------------------------------------------------
chroot . #將根目錄切換至當前目錄,調試新系統時使用
chroot /tomlinux #將根目錄切換至/tomlinux目錄
chroot /tomlinux sbin/init #將根目錄切換至/tomlinux并執行sbin/init
adduser id #增加一個叫id的用戶
userdel id #增除叫id的用戶
userlist #顯示已登陸的用戶列表
passwd id #修改用戶id的密碼
passwd -d root #將root用戶的密碼刪除
chown id /work #指定/work目錄為id用戶所擁有
----------------------------------------------------------------------
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
#設置網卡1的地址192.168.1.1,掩碼為255.255.255.0,不寫netmask參數則默認為255.255.255.0
ifconfig eth0:1 192.168.1.2 #捆綁網卡1的第二個地址為192.168.1.2
ifconfig eth0:x 192.168.1.x #捆綁網卡1的第二個地址為192.168.1.x
ifconfig down eth1 #關閉第二塊網卡,使其停止工作
hostname -F tomlinux.com #將主機名設置為tomlinux.com
route #顯示當前路由設置情況
route add default gw 192.168.1.1 metric 1 #設置192.168.1.1為默認的路由
route del default #將默認的路由刪除
dhcp #啟動dhcp服務
dhclient #啟動dhcp終端并自動獲取IP地址
ping 163.com #測試與163.com的連接
ping 202.96.128.68 #測試與IP 202。96.128.68的連接
----------------------------------------------------------------------
probe rtl8139 #檢查驅動程序rtl8139.o是否正常工作
lsmod #顯示已裝載的驅動程序
insmod rtl8139.o #裝載驅動程序rtl8139.o
insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330
#裝載驅動程序并設置相關的irq,dma參數
rmmod rtl8139 #刪除名為rtl8139的驅動模塊
gpm -k #停止字符狀態下的mouse服務
gpm -t ps2 #在字符狀態下以ps2類型啟動mouse的服務
----------------------------------------------------------------------
telnet 192.168.1.1 #登陸IP為192.168.1.1的telnet服務器
telnet iserver.com #登陸域名為iserver.com的telnet服務器
ftp 192.168.1.1 或 ftp iserver.com #登陸到ftp服務
1tomcat 部署網站 去掉端口號和項目名稱
去除端口號 conf-->server.xml中查找原始的端口號(如8080),修改為80后,即可在訪問時不用輸入端口號。不過要注意防止其它程序占用80端口。
項目名稱 server.xml <Context path="/myapp" reloadable="true" docBase="D:"myapp" workDir="D:"myapp"work"/>
2 TOMCAT 如何配置多端口
1.修改端口:
在Tomcat的安裝目錄下的"conf目錄下,打開server.xml,
找到
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
將8080改為你想要的端口8081
2.映射路徑:
還是在server.xml配置文件中,
在</host>這個結束標簽之前加上如下的配置信息:
<Context
path="/myapp"
reloadable="true"
docBase="e:"myApp" />
3.添加端口:
在server.xml中添加以下:
<Connector port="65535" protocol="HTTP/1.1"
connectionTimeout="20000" />
Tomcat的端口號最大到65535.
4.上面的端口對于原來Tomcat中的其他Web應用也可以使用,
下面是獨立的,只有你的e:"myApp中的Web應用可用,
也就是在server.xml中的</Service>下另外建立一個Service:
<Service name="test">
<Connector port="65535" protocol="HTTP/1.1"
connectionTimeout="20000" />
<Engine name="myengine" defaultHost="myhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="myhost" appBase="e:"myApp"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
另外:
1818189端口?有這么多位嗎?
我印象中端口號范圍是0~65535,怎么還有這么多位的端口?
http://ttov.blog.163.com/blog/static/3822715201072692912584/
1、安裝VMware workstation。
2、安裝guest系統,這里我安裝的Red Hat
Linux9,安裝過程中確保網絡連接選擇的是NAT方式,當然可以在安裝完后進行修改。

3、到windows XP
中,查看所有的網絡連接,你應該發現除了原有的網卡之外,又多了Vmnet1和Vmnet8。
vmnet1是hostonly的接口,而Vmnet8是就是我們要使用的NAT的網絡接口。
4、在win主機上用ipconfig查看VMnet8的IP地址,
一般是192.168.X.1/255.255.255.0,此時VMnet8的設置應該是自動獲取IP,現在改成靜態IP,并把此IP直接填入
VMnet8里,不設網關。

5、同時在VM網絡設置里的NAT項中查看VMnet8,一般是
192.168.X.2/255.255.255.0這個地址就是VMnet8,NAT的網關。

6、現在在LINUX下把網卡IP設置成和VMnet8一個網段的
IP(192.168.X.Z/255.255.255.0)
7、網關設置成剛才查看的那個IP192.168.X.2即可。

8、DNS和你host主機的一樣就可以。

9、設置完成后,重新啟動linux的網絡服務。

Linux命令
netconfig 設置IP
ifconfig 查看
reboot 重啟
services network restart (重啟網絡)
http://www.cnblogs.com/hakuci/archive/2008/12/07/1349547.html
一般情況下,安裝完vmware,不做其他設置,直接使用nat模式就可以與主機共享上網了。但如果你用的是某些精簡版,或者你自己做過修改,那么就照下
面的步驟檢查一遍吧。
一、先檢查nat是否可用及相關服務是否已經打開。
首先打開虛擬機的虛擬網絡設置功
能,虛擬機菜單欄——編輯——虛擬網絡設置

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_887ae060f330442.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖一
如果你發現上面的選項是灰色的,說明你的精簡版沒有這個功能,想辦法換個版本,或者找下載說明,看看是否還
需要裝其他東西。
在后面的對話框里檢查dhcp和nat服務是否已經打開。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_56d1cfb5e6d2e11.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖二

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_da98e19f2ca0e5a.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖三
如果你在上圖中按下啟動——應用沒有用的話,就要考慮是不是相關服務被禁用了。主機開始菜單——運行——
services.msc檢查相關服務的情況。正確的應該如下:

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_b831307582cc66e.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖四
二、
檢查ics是否有打開,既打開ics又打開nat模式,同時作用,會造成混亂的,必須關閉。(ics就是internet connection
share,也就是internent連接共享)

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_180e7abade984b8.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖五
三、
檢查網絡接口模式
看看虛擬機網卡是不是真的用了nat模式,跟虛擬網絡設置里是不是用了同一個vmnet號,請確保下圖六和圖3中用的是
同一個vmnet號。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_88f83d8b3174401.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖六
虛擬機7.0以前的版本,nat都默認使用了vmnet8作為nat的默認端口號,但vm7.0就不同了。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_742811ec5a6daf6.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖七
nat模式用的是vmnet0了,這個時候,保險為妙,虛擬機網卡請使用自定義vmnet0接口。
四、
開虛擬機系統檢查是否獲取到了ip。檢查ip,網關,dns,是否都正常。

=700)
window.open('http://bbs.crsky.com/1236983883/thumb/Mon_1004/6_194774_724219dda00790b.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖八
4.1關于出現網絡連接紅叉,“電纜被拔出”。在虛擬機里是不存在電纜的,所以肯定是設置問題。
4.1.1
檢查圖六“打開電源時連接”的鉤,或者檢查圖八里,右下角的虛擬網卡圖標是否有叉。
4.1.2
上一條正常的,請安裝一遍vmtools,確保虛擬網卡驅動正常。
4.1.3
上2條都正常的,還是有問題的,應該是某些系統的問題了。ubuntu的話多點幾次連接看看,redflag的話,本地連接屬性里“連接后在通知區域顯示
圖標”前的鉤去掉,眼不見心不煩反而可以連上了。
五、vm7.0還是沒有獲取到ip的,需要把虛擬網絡設置設置為默
認再試一遍。
將虛擬機里的系統關機,打開虛擬網絡配置,如圖7所示,按下左下角的“resore
default”恢復默認設置,在隨后跳出的whql驅動認證里全部選擇“始終安裝此驅動軟件”。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_b329ff341c566c1.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖九
完
成后,請繼續檢查前面的檢查項目,再檢查一遍后再打開虛擬機里的系統。
六、獲取了ip還是無法上網的,有以下的幾種情況。
6.1 主機是win7或是vista,vmware版本低于6.5.3的,請升級vmware的版本。
這個問題的癥狀就是能ping通域名,也上不去網。但qq可以上去,這個應該是個兼容問題,請升級vmware版本。
6.2
使用網絡命令檢查網絡。
1.ping nat網關,以圖8為利,ping 192.168.47.2
2.ping
物理主機公網ip或內網真實ip,
3.可以繼續ping,公網的isp網關或是內網的路由器ip,最后ping下網站域名。
如果都能通,而不是6.1的問題,看是不是瀏覽器上設置了錯誤的代理。
如果dns能解析,
但ping所有外網ip都是丟包的,應該是網關問題,檢查下是否是雙網關,route print檢查下默認網關。
如果可以ping通所
有ip,ping不通域名,則應該是nat服務器的dns解析出了問題,重新啟動主機(和重啟路由器一樣的道理)或是在虛擬機里直接填公網dns,或者設
置nat,直接將dns直接填到虛擬機nat里(如圖十)。

=700)
window.open('http://bbs.crsky.com/1236983883/thumb/Mon_1004/6_194774_c10769a426e7ab1.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
http://www.xpxzlt.cn/simple/?t161677.html
Q:VMware DHCP Service 服務無法啟動 1067 錯誤
A:打開Virtual Network Editor,選擇 Restore Default
Q:VMware Brige 橋接服務無法啟動 發生系統錯誤 2 系統找不到指定的文件
A:替換vmnetbridge.sys
vmnetbridge.dll(下載)
window主機與Ubuntu虛擬機共享文件夾的設置方法:
打開虛擬機,并開啟Ubuntu。
在ubuntu的選項卡右擊 --> Settings --> 點擊 Options --> 窗口左側的 Shared
Folders --> 右側Folder Sharing的 Always enabled --> 右側 Folders 下面的
Add --> Next --> Brower --> 在 瀏覽文件夾 中選擇自己想要共享的文件夾(如:
E:/linuxshare) --> 確定 --> Enable this share --> Finish 。
文件夾共享設置完成。
需要往 Ubuntu上傳什么東西,放在E:/linuxshare 下即可。 linux中的訪問路徑是: /mnt/hgfs/linuxshare
下面附上截圖。

圖一

圖二

圖三

圖四

圖五

圖六
http://www.cnblogs.com/computer/archive/2010/07/21/1781945.html
http://chenjian977355.blog.163.com/blog/static/5544582010229150190/
WIN 7下光盤安裝Ubuntu9.10,簡單配置并修改啟動項~~
先下載最新的Ubuntu9.10版,前幾天剛發布的
下載地址:http://www.ubuntu.org.cn/getubuntu/download/
在下載位置處,選擇“TAIWAN”(中國好像只有臺灣這個選項)

因為覺得光盤安裝比較舒服,所以我選擇了光盤安裝。
用UltraISO或者其他工具把下載下來的鏡像刻進一張空的CD盤。
由于偶的小Y從來沒碰過Ubuntu系統,所以整個安裝過程最主要的就是對硬盤進行分區。
申明:本人安裝時并未想到要來寫教程,部分截圖是9.04版的,但幾乎是一樣的,不一樣處我會指出。
1.將光盤放進光驅后重啟,按F12,選擇光驅啟動,此時光驅開始狂轉,等一會便出現界面,選擇你看得懂的:簡體中文

2.選擇第一項“試用Ubuntu而不改計算機中的任何內容”,按回車確認,也可以選擇第二項直接安裝ubuntu,安裝步驟與以下演示相相同。(為什么要選擇第一項安裝,因為ubuntu
liveCD有個特色,就是可以一臺電腦上用光盤來臨時體驗一下ubutnu的完整系統,進入后進也可安裝系統)

3.毫無懸念的,光驅又開始狂轉,這下等的時間會稍微長點,一段時間后進入系統。在這里你可以先體驗下這個
系統,可以聯網;玩夠了再考慮裝還是不裝
。如果裝的話,就點擊桌面的“安裝”

4.出現以下界面,當然用簡體中文,按默認連續三次Forward(下一步),如圖



5.然后就到了給硬盤分區了,首先進入到如圖的界面(圖顯示的不是WIN7 ,是XP,這個不重要,只要點擊那個“手動指定分區(高級)”就行了)

6.注意:以下內容重要!!!!
我的小Y一共分成了CDEFG,5個區,F盤80G
至今沒用過,所以我打算分出20G來裝Ubuntu。不一定要20G,10G也行,看自身情況。
選中要改變的分區,點“編輯分區”(9.10版里好像是叫“新建”,都一樣,就是“刪除分區”選項之前的那個)

7.出現以下提示,點繼續將進行硬盤分區,不用擔心,你硬盤里的東西不會丟失

8.分區完成,以下我們可以看到硬盤多個一個空閑的空間,這就是我們釋放出來安裝ubunbu的空間。選中
空閑的空間再點下面的新的分區。

9.下面對這個空閑的空間進行分區,首先來分個swap交換空間,這個相當于windows下的虛擬內存,根據你內存的大小填入,一般填為與內存一樣的大小,我的內存2G,因此以下
也填入2048(也有一種說法是:內存小于1G的此處填2倍,大于1G的就填1G就行,自己看著辦吧),再選擇交換空間按確定。

10.依然選中空閑的空間-新的分區,下面來創建個系統空間,這里我把空閑剩下的全部分配給這個分區,再選
擇Ext3日志文件系
統,掛載點選/,再點確定,到這里分區完成。



11.自定義填寫用戶名和密碼,你也可以選擇自動登錄還是需要密碼以登入(這就是決定是否在開機輸入密
碼),再點下一步,當你密碼設置過短時,考慮到安全ubuntu會提示你是否重新設置,我們不用管它,點繼續即可。

12.通過下面我們看到兩個分區,格式為swap和ext3,這兩個分區就是Linux要用到的分區,選中ext3分區再點下一步就行。

13.接下來提示問你是否導入本機WIN 7系統的文檔到ubuntu下使用,如果你需要就勾上,我一個沒勾,再點下一步。
14.好了,到這里準備安裝,現在你要做的是拔掉網線(切記,一定要把網線拔掉),用無線網絡的直接把無線開關掰回去先。因為ubuntu在安裝過
程上會自動從官方下載一些更新,由于這個“源"地址設在歐洲,對于我們國內用戶來說下載特級慢,我們還是把更新放在系統安裝后進行操作,下面點擊安裝即
可!

15.以下進行系統安裝中,請不要斷來電腦電源!

17.過了十幾分鐘,系統安裝完成,點現在重啟,此時電腦會彈出光盤,請取出光盤后敲一下回車。

安裝完成,秀下桌面:

==========================================================================================================
第二部分:
簡單配置
重啟后首次進入ubuntu的桌面,說明系統已安裝成功,下面我們來對系統進行更
新(這類似于windows下的打補丁),
首先要做的是換源,什么是源?源可以理解為ubuntu系統更新的服務器地
址,之前我們已經說過,ubuntu默認的源是設在歐洲,這對于我們國內來說更新過程十分慢,因此可見換源十分重要,我們把這個源換成離我們較近的地區來
提高更新速度。先點擊右上角的網絡標識,連上網絡,很簡單的,一看就會。
1.選擇桌面上方的工具條
依次進入System —— Administration——軟件源
——wnloag
from--other,此時提示輸入密碼(密碼就是你剛才安裝時設置的密碼,以后其它操作會提示都是輸入那個密碼),然后彈出以下窗口,有世界各地區供
選擇,選擇Tai w再選tw.archive.ubuntu.com這個源(因為Tai w這個源在國內被公認較快),最后點Choose
Gerver。

此時,系統會連上“源”更新組件之類的,

2.下載語言包:我們發現系統雖安裝好了,可是菜單卻
大多數是英文,此是要做的是下載并安裝簡體中文語言包,System —— Administration ——Language
Support,此時系統會自動選好漢語,并彈出以下窗口,直接點Install。

3.此時系統正在下載并安裝簡體中文語言包中。

語言安裝完畢后,我們點Close關閉窗口,再選擇桌面右上角的關機按鈕,選擇Restart...重新啟動計算機
4.重啟后,你能發現原來英文的菜單已經變為簡體中文了,說明簡體中文語言包安裝成功。

5.我們發現桌面空空的,什么都沒有,這時要把平時在windows習慣的幾個圖標調出來,選擇桌面上方的應用程序--
附件--終端,在終端輸入gconf-editor再按回車后將彈出配置編輯器窗口。

6.通過以下窗口,依次選擇apps—— nautilus—— desktop,從右邊選擇把需要顯示在桌面圖標,勾上即可

7.在桌面右鍵選擇更改桌面背景,進入視覺效果選項卡,默認是關閉好像,然后點擊正常(或拓展),視個人喜好定,不過這個費顯卡的,反正我選擇正常很流
暢。

接著,系統會自動聯網安裝顯卡驅動程序,裝好后重啟,再次進入該處才能正常開啟視覺效果選項。
=========================================================================================================
第三部分:修改啟動項
ubuntu安裝后每次開機都是默認進入ubuntu系統的,對于以windows為主的朋友,每次開機都要守在畫面切換到XP啟動,可見十分麻
煩,通過下面,你可以設置讓你的WIN 7系統為第一啟動
我嘗試像XP一樣打開menu.lst,結果是空白~~~~幾番詢問后才發現時因為9.10升級為grub2了,于是轉而修改grub.cfg文件。
1.左上角-應用程序-附件-終端,輸入sudo chmod +w /boot/grub/grub.cfg
將grub.cfg設為可寫狀態

2.提示輸入密碼:輸入你設的開機密碼,此處輸入密碼不可見,密碼輸入后直接回車,然后輸入sudo gedit
/boot/grub/grub.cfg

3.編輯grub.cfg

4.自習查看,里面有好幾段以
###BEGIN**************###開頭
###END****************###結尾 的代碼
5.將含有WIN 7那段代碼剪切至圖中位置

6.確認下圖的那段代碼值=0

7.保存后退出。
8.一切順利的話,重啟的菜單項將是這樣的(高亮顯示的即為WIN 7)

注意:如果是XP系統,則第一第二部分通用,要調整啟動順序的話
打開終端(應用程序——>附件——>終端),輸入sudo gedit
/boot/grub/menu.lst,敲下回車,這時要求輸入password,輸入登錄系統的密碼,在終端里不能顯示輸入的密碼,這是正常的,輸入
后回車打開編輯窗口。
在其中找到XP的代碼,把它剪切到最前頭就行了~~~~~
Communications link failure,The last packet successfully received from
the server was *** millisecond ago.The last packet successfully sent to
the server was *** millisecond ago。
最近做測試,發現Mysql 過一段時間會無法連接,導致數據庫數據不一至,極其郁悶。
下面是轉一哥門的
使用Connector/J連接MySQL數據庫,程序運行較長時間后就會報以下錯誤:
Communications link failure,The last packet successfully received
from the server was *** millisecond ago.The last packet successfully
sent to the server was *** millisecond ago。
其中錯誤還會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。
后來查了一些資料,才發現遇到這個問題的人還真不少,大部分都是使用連接池方式時才會出現這個問題,短連接應該很難出現這個問題。這個問題的原因:
MySQL服務器默認的“wait_timeout”是28800秒即8小時,意味著如果一個連接的空閑時間超過8個小時,MySQL將自動斷開該連接,而連接池卻認為該連接還是有效的(因為并未校驗連接的有效性),當應用申請使用該連接時,就會導致上面的報錯。
1.按照錯誤的提示,可以在JDBC
URL中使用autoReconnect屬性,實際測試時使用了autoReconnect=true&
failOverReadOnly=false,不過并未起作用,使用的是5.1版本,可能真像網上所說的只對4之前的版本有效。
2.沒辦法,只能修改MySQL的參數了,wait_timeout最大為31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重啟生效,需要同時修改這兩個參數。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cau99/archive/2009/12/11/4987760.aspx
hibernate-HQL語句(1)
http://java.chinaitlab.com/Hibernate/809957.html
當月第一天 select timestamp(concat(year(curdate()),'-',month(curdate()),'-','1')) 如2010-08-01 00:00:00
當前時間 select now()
測試對于保證軟件開發質量有著非常重要的作用,單元測試更是必不可少,
JUnit是一個非常強
大的單元測試包,可以對一個/多個類的單個/多個方法測試,還可以將不同的TestCase組合成TestSuit,使測試
任務自動化。Eclipse同樣集成了JUnit,可以非常方便地編寫TestCase。
我們創
建一個Java工程,添加一個example.Hello類,首先我們給Hello類添加一個abs()方法,作用是返
回絕對值:

(圖一)
下一
步,我們準備對這個方法進行測試,確保功能正常。選中Hello.java,右
鍵點擊,選擇New->JUnit
Test Case:

(圖二)
Eclipse會詢問是否添加junit.jar包,確定后新建一個HelloTest類,用來測試Hello類。

(圖三)
選中setUp()和tearDown(),然后點擊“Next”:

(圖
四)
選擇要
測試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:

(圖五)
JUnit會以以下順序執行測試:(大致的代碼)
try {
HelloTest test = new HelloTest(); // 建立測試類實例
test.setUp(); // 初始化測試環境
test.testAbs();
// 測試某個方法
test.tearDown(); // 清理資源
}
catch…
setUp()是建立測試環境,這里創建一個Hello類的實例;tearDown()用于清理資源,如釋放打開的文件等等。以test開頭的方法被認為是測試方法,JUnit會依次執行testXxx()方法。在testAbs()方法中,我們對abs()的測試分別選擇
正數,負數和0,如果方法返回值與期待結果相同,則assertEquals不會產生異常。
如果有
多個testXxx方法,JUnit會創建多個XxxTest實例,每次
運行一個testXxx方法,setUp()和tearDown()會在testXxx前后被調用,因此,不要在一個testA()中依賴testB()。
直接運
行Run->Run
As->JUnit Test,就可
以看到JUnit測試結果:

(圖六)
綠色表
示測試通過,只要有1個測試未通過,就會顯示紅色并列出未通過測試的方法。可以試圖改變abs()的代碼,故意返回錯誤的結果(比如return n+1;),然后再運行JUnit就會報告錯誤。
如果沒
有JUnit面板,選擇Window->Show View->Other,打開JUnit的View:

(圖七)
JUnit通過單元測試,能在開發階段就找出許多Bug,并且,多個Test Case可以組合成Test Suite,讓
整個測試自動完成,尤其適合于XP方法。每增加一個小的新功能或者對代碼進行了小的修改,就立刻運行一
遍Test Suite,確保新增和修改的代碼不會破壞原有的功能,大大增強軟件的可維護
性,避免代碼逐漸“腐爛”。
初次學會使用Junit的使用是通過這篇文章的(上文),自己嘗試跟著做了一遍,結果發現它上面提供的代碼例子是錯誤
的,不過流程、圖片都很清楚。所以你可以先看看它上面是怎么說的,至于測試的代碼我稍做了改動,為的是只要說明問題就行——其實不難。
被測試的類代碼:
public class HelloJunit {
public static int abs(int n){
return n>=0?n:(-n);
}
}
Junit的測試代碼:
import junit.framework.TestCase;
public class HelloJunitTest extends TestCase {
public void testAbs() {
assertEquals(HelloJunit.abs(10),10);
assertEquals(HelloJunit.abs(-10),10);
}
}
主要代碼
行為assertEquals(HelloJunit.abs(10),10);
其中參數
的意義為:
HelloJunit.abs(10)執行類HelloJunit的abs方法(參數為10,表示求10的絕對值)。
逗號后面
的10表示為預期的結果(期望值)。
該行表示
將期望值(10)與實際值(類HelloJunit的abs方法執行結果)進行比較,如果不相
等則拋出異常。
這里只是
一個簡簡單單的例子,Junit被大家稱為優秀的白盒自動化測試框架,當然只有自己用過了才會了解。網上有許多的資料介紹這個框架,筆
者也是從自身情況出發來學習它的。當然學習使用它是需要有一定基礎的,筆者擁有C和C++的基礎,對Java的學習也開始不久,所以在這里將力
所能及的知識共享出來與大家分享,希望能夠共同提高。另外筆者是專職的測試人員,所以在描述一些問題時大多都會以測試的角度來闡述。學習此框架的目的在于
能夠在工作中進行白盒測試,在以后的介紹中還會介紹白盒測試相關的理論和工具,希望大家能夠一起提高進步。
由于MySQL目前字段的默認值不支持函數的形式設置默認值是不可能的。
代替的方案是使用TIMESTAMP類型代替DATETIME類型。
CURRENT_TIMESTAMP
:當我更新這條記錄的時候,這條記錄的這個字段不會改變。
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
:當我更新這條記錄的時候,這條記錄的這個字段將會改變。即時間變為了更新時候的時間。(注意一個UPDATE設置一個列為它已經有的值,這將不引起
TIMESTAMP列被更新,因為如果你設置一個列為它當前的值,MySQL為了效率而忽略更改。)如果有多個TIMESTAMP列,只有第一個自動更
新。
TIMESTAMP列類型自動地用當前的日期和時間標記INSERT或UPDATE的操作。
如果有多個
TIMESTAMP列,只有第一個自動更新。
自動更新第一個TIMESTAMP列在下列任何條件下發生:
列
值沒有明確地在一個INSERT或LOAD DATA INFILE語句中指定。
列值沒有明確地在一個UPDATE語句中指定且另
外一些的列改變值。(注意一個UPDATE設置一個列為它已經有的值,這將不引起TIMESTAMP列被更新,因為如果你設置一個列為它當前的
值,MySQL為了效率而忽略更改。)
你明確地設定TIMESTAMP列為NULL.
除第一個以外的
TIMESTAMP列也可以設置到當前的日期和時間,只要將列設為NULL,或NOW()。
另外在5.0以上版本中也可以使用
trigger來實現此功能。
create table test_time (
id int(11),
create_time
datetime
);
delimiter |
create
trigger default_datetime before insert on test_time
for each
row
if new.create_time is null then
set
new.create_time = now();
end if;|
delimiter ;
生成 注釋
應該是選取要注釋內容后, ctrl+shift+c 按一下注釋,按兩下取消注釋
ctrl+shift+"反注釋!能講ctrl+shift+/ 多行注釋掉的內容反注釋掉
CTRL+T 查看接口的實現
MyEclipse調試
1.首先在一個java文件中設斷點,然后運行debug,當程序走到斷點處就會停下。
2.F5鍵與F6鍵均為單步調試,
F5是step into,也就是進入本行代碼中執行(進入函數執行),
F6是step over,也就是執行本行代碼,跳到下一行執行(不進入函數),
3.F7是跳出函數 step return
4.F8是執行到最后。
=====================================
1.Step Into (F5) 跳入
2.Step Over (F6) 跳過
3.Step Return (F7) 執行完當前method,然后return跳出此method
4.step Filter 逐步過濾
一直執行直到遇到未經過濾的位置或斷點(設置Filter:window-preferences-java-Debug-step
Filtering)
5.resume 重新開始執行debug,一直運行直到遇到breakpoint
6.hit count 設置執行次數 適合程序中的for循環(設置 breakpoint view-右鍵hit
count)
7.inspect 檢查 運算。執行一個表達式顯示執行值
8.watch 實時地監視變量的變化
9.我們常說的斷點(breakpoints)是指line breakpoints,除了line
breakpoints,還有其他的斷點類型:field(watchpoint)breakpoint,method
breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(監視點) 當成員變量被讀取或修改時暫掛
11.添加method breakpoint 進入/離開此方法時暫掛(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption時暫掛(待續...)
斷點屬性:
1.hit count 執行多少次數后暫掛 用于循環
2.enable condition 遇到符合你輸入條件(為ture\改變時)就暫掛
3.suspend thread 多線程時暫掛此線程
4.suspend VM 暫掛虛擬機
13.variables 視圖里的變量可以改變變量值,在variables 視圖選擇變量點擊右鍵--change
value.一次來進行快速調試。
14.debug
過程中修改了某些code后--〉save&build-->resume-->重新暫掛于斷點
===========================
例如你有如下程序:
public class debugtest {
來源:(http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html)
- MyEclipse調試_匆匆過客_新浪博客
public String addDays() {
System.out.println("1");//
=============》(3)
String result = "";
//=============》(4)
System.out.println("2");//
=============》(5)
return result;
}
public static void main(String args[]) {
debugtest aa = new
debugtest();
int ii=9;
aa.addDays();//
=============》(1)
System.out.println("eeeeeeeeeeeeeee");//=============》(2)
}
}
你在(1)處加斷點,運行到此處時如果Step Into (F5)為跳入(進入函數),則接著執行到(3)。
再執行Step Over (F6)執行本行,則執行到(4)。
最后執行Step Return (also F7),則跳出addDays方法,跳到(2)
轉http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html
MyEclipse 中顯示行號 要想顯示行號,按住 Ctrl + F10 選擇 show Line Numbers
eclipse/myeclipse注釋模板的修改 alt+shitf+j
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit
/**
*
* 項目名稱:${project_name}
* 類名稱:${type_name}
* 類描述:
* 創建人:${user}
* 創建時間:${date} ${time}
* 修改人:${user}
* 修改時間:${date} ${time}
* 修改備注:
* @version
*
*/
http://www.javaeye.com/topic/585168
myeclipse中如何配置自定義的代碼排版格式 ctrl+shift+f
http://m.tkk7.com/bolo/
http://m.tkk7.com/bolo/archive/2010/04/11/318004.html
com.test.action.user包下:
SaveUserAction.java
SaveUserAction-validation.xml
SaveUserAction.java文件的內容:
package com.test.action.user;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.User;
import com.test.service.UserService;
public class SaveUserAction extends ActionSupport
{
private User user;
private UserService service;
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
public UserService getService()
{
return service;
}
public void setService(UserService service)
{
this.service = service;
}
@Override
public String execute() throws Exception
{
this.service.save(this.user);
return SUCCESS;
}
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
SaveUserAction-validation.xml的文件內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<validators>
<field name="user">
<field-validator type="visitor">
<param name="context">user</param>
<param name="appendPrefix">true</param>
<message>user's </message>
</field-validator>
</field>
</validators>
com.test.bean包下的文件:
User.java;
User-user-validation.xml
User-user-validation.xml文件的內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<validators>
<field name="firstname">
<field-validator type="requiredstring">
<message>required first name</message>
</field-validator>
</field>
<field name="lastname">
<field-validator type="requiredstring">
<message>required last name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>required age</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and
${max}</message>
</field-validator>
</field>
</validators>
還有一個問題,就是校驗信息會重復,在錯誤的情況下。由以下代碼可以測試:
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
解決方法:
applicationContext.xml 文件中的配置action中加入:Struts 2.0 的action 是有狀態的
在spring 配置的action 中加上 scope="prototype";
配置如下:<bean id="saveUserAction"
class="com.test.action.user.SaveUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
關鍵字: struts2,spring2,hibernate3,整合
今天在寢室窩了一天,由于前天老師給了個ss2+toplink的項目源碼,要我去消化。直接看那
三個整合具吃力,于是先從ssh2入手吧!
所使用的工具和環境。
jdk6+myeclipse6.5+tomcat6+mysql5+spring2.0+hibernate3+struts2
好了,開始我們的第一個ssh2之旅吧。
首先先分析一下我們的第一個ssh2項目的需求,簡單的說就是有一張表單,
讓你填寫用戶名和密碼,提交后存入數據庫。就這么簡單,呵呵。
第一步:。我
們首先新建一張mysql數據表
sql如下
CREATE TABLE mytest.users (
id INT
NOT NULL,
username VARCHAR(50),
password VARCHAR(50),
PRIMARY KEY (id)
數據表創建好后結構如下:
當然我已經有幾天數據添加進去了
第二步
打開myeclipse,新建一個web項目,
命名為ssh2-2, java ee規范我們選擇5,如圖
第三步 務必小心的一步
導
入ssh2的各個jar,步驟如下:
選中當前的項目后,點擊菜單爛的myeclipse---project
capablities----add hibernate項,跳出如圖
務必按照圖示選擇,尤其是copy checkde……一項,然后點擊next,默認next,去掉specify
database……復選框,next,去掉create session……復選框,finish。
再次選中選中當前的項目后,點擊
菜單爛的myeclipse---project capablities----add spring項,跳出如圖
依然務必按照如是選擇,jar文件選擇如下5個:
點擊next,
之后按下選擇,務必,
next后finsh即可。
然后導入struts2的jar
如下5個放到lib下
然后放入我們的數據庫驅動jar mysql-connector-java-5.0.8-bin.jar 沒得話附件中有
至
此,包都導入完畢
http://77857.blog.51cto.com/67857/149631
去網上找了一些相關錯誤的信息看了下說Hibernate core下面的xerces.jar包的問題。刪除后正確了。
如果刪除后還是錯誤,看一下項目的lib文件夾下面的是否還有xerces相關jar包,也刪掉。
記住把tomcat 里面xerces.jar也要刪掉
1:login.JSP
<form action="
login.action" method="post">
username:<input type="text" name="username"> <br/>
password:<input type="text" name="password"> <br/>
<input type="submit" name="submit"/>
</form>
<s:form action="login">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"> </s:password>
<s:submit name="submit"></s:submit>
</s:form>
2:action
package com.test.action;
public class LoginAction {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
return "success";
}
}
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
if("smallfa".equals(this.getUsername().trim())&&"smallfa".equals(this.getPassword().trim()))
{
return "success";
}
else
{
this.addFieldError(username, "username or password errors");
return "failer";
}
}
@Override
public void validate() {
if(null==this.getUsername()||"".equals(this.getUsername().trim()))
{
this.addFieldError(username, "username required");
}
if(null==this.getPassword()||"".equals(this.getPassword().trim()))
{
this.addFieldError(username, "username required");
}
}
}
3:struts-xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" namespace="/" extends="struts-default">
<action name="login" class="com.test.action.LoginAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
4:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<!-- 定義核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 定義核心Filter的實現類 -->
<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>
5:result.jsp
username:${requestScope.username}<br/>
password:${requestScope.password}<br/>
6:參考視頻
視頻:
Struts2入門與配置 浪曦 J2EE Struts 2應用開發詳解系列視頻
http://v.youku.com/v_show/id_XNTY4MDUwMzY=.html
離上次打球隔有一段時間了,終于有一個晚上等到好朋友早點下班,到了場地因天氣冷,既是場地有照明燈,過來的人比昔日還顯得稀少,直到打到后面基本也就我們兩隊在玩,今天打的還是挺過隱的,外投好多個球,其中最自感有一個是假動作,突跨步一接三步路擦板進,確實好久沒進這樣的球,只不過有點遺憾的我們隊竟有一個超極品的兄臺,傳球失誤、防過老漏人、亂面、無語。讓我想了前個晚上比賽那位仁兄。
關于數據庫的學習,個人意見,僅供參考,本人也在學習中。
首先需要了解下 數據模型 關系數據庫 DBMS 范式 自然運算 等等概念性的東西,可以去書店或者圖書館查閱相關書籍,可以了解下,沒必要完全掌握,當然你要能掌握的話,那么對你的以后是非常有幫助的。
其實然后就是SQL標準 對象關系SQL 基本的SQL查詢,以及最基本的SELECT/UPDATE/INSERT/DELETE語法,各種不同的數據庫大同小異的。
然后就是不同的數據庫,不同的用法,你也可以專學一門,比如ORACLE
或者MSSQL MYSQL INFORMIX DB2主要這幾種~
這些入門了就可以學習嵌入數據庫了,訪問數據庫的程序
以及數據庫的性能優化,完整性,視圖,安全 目錄 備份 還原等等
當然主要學習ORACLE的話你也可以先直接挑本ORACLE入門看,類似ORACLE10G入門,ORACLE基礎的書,不求完全懂,能看一點是一點,學習ORACLE是一個長期的過程,你在懂了一些后,再去看別的書,你會找到很多相同點,那時候就會有恍然大悟的感覺,一點點看就OK了~
到了一定的程度,你就知道自己怎么去學習,需要掌握些什么,像什么方向發展了。
另外在學習的過程中推薦有疑問的就自己做實驗操作,或者去各大論壇像CSDN,CNOUG,ITPUB,CNBLOGS查找答案或者提問,也可以下載里面的基礎區的教程了,不過大多是達人們整理出來的文檔,也很不錯的,尤其前面兩個論壇你能學到很多東西的,不過還是推薦你先完整的看一本入門的后再說,不管理解了幾成,有什么問題記下來,以后慢慢一點點解決。
ORACLE視頻教程的話有個中科院的什么絕版培訓教程oracle 10g的04年的視頻,非常不錯,迅雷上搜索中科院oracle 10g培訓教程就能搜索到。
數據庫開發工具的話 有TOAD(客戶端連接工具),POWERDESIGN(數據庫設計建模工具,), PL/SQL DESIGNER(PL/SQL開發工具),一般這3個就夠用了,可以自己去迅雷搜索下載最新版本,另外的話還有一個叫DBATRIN,E/R 什么的工具,很多的,其實裝了ORACLE客戶端工具后,自帶的JAVA控制臺也很好用的。
當然你想一蹴而就的話,可以直接去網上找相關的ORACLE入門資料,那些都是些整理出來的條條,不過不推薦,最好多看書,多做實驗。
Hibernate的對象有3種狀態,分別為:瞬時態(Transient)、 持久態(Persistent)、脫管態(Detached)。處于持久態的對象也稱為PO(Persistence Object),瞬時對象和脫管對象也稱為VO(Value Object)。
由new命令開辟內存空間的java對象,
eg. Person person = new Person("amigo", "女");
如果沒有變量對該對象進行引用,它將被java虛擬機回收。
瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時對象與數據庫相關聯,并將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。
處于該狀態的對象在數據庫中具有對應的記錄,并擁有一個持久化標識。如果是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象不再與數據庫的記錄關聯。
當一個session執行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數據庫識別值,但它已不在HIbernate持久層的管理之下。
持久對象具有如下特點:
1. 和session實例關聯;
2. 在數據庫中有與之關聯的記錄。
當與某持久對象關聯的session被關閉后,該持久對象轉變為脫管對象。當脫管對象被重新關聯到session上時,并再次轉變成持久對象。
脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。
脫管對象具有如下特點:
1. 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
2. 比瞬時對象多了一個數據庫記錄標識值。
本文摘自孫衛琴的《精通Hibernate:Java對象持久化技術詳情》
Hibernate有如下5個核心接口:
- Configuration接口:該對象用于配置并且根啟動Hibernate。Hibernate應用通過Configuration實例來指定對象-關系映射文件的位置或動態配置Hibernate的屬性,然后創建SessionFactory實例。
- SessionFactory接口:一個SessionFactory實例對應一個數據存儲源,應用從SessionFactory中獲得Session實例。它具有如下特點:
1)它是線程安全的,這意味著它的同一個實例可以被應用的各個線程共享。
2)它是重量級的,這意味著不能隨意創建或銷毀它的實例。如果應用只訪問一個數據庫,只需創建一個SessionFactory實例,在應用初始化的時候創建該實例。如果應用同時訪問多個數據庫,則需要為每個數據庫創建一個單獨的SessionFactory實例。
之所以說SessionFactory是重量級的,是因為它需要一個很大的緩存,用來存放預定義的SQL語句以及映射元數據等。用戶還可以為SessionFactory配置一個緩存插件,這個緩存插件被稱為Hibernate的第二級緩存,該緩存用來存放被工作單元讀過的數據,將來其它工作單元可能會重用這些數據,因此這個緩存中的數據能夠被所有工作單元共享,一個工作單元通常對應一個數據庫事務。
- Session接口:該接口是Hibernate應用使用最廣泛的接口。Session也被稱為持久化管理器,提供了和持久化相關的操作,如添加、更新、刪除、加載和查詢對象。Session具有一下特點:
1)不是線程安全的,因此在設計軟件架構時,應該避免多個線程共享同一個Session實例;
2)Session實例是輕量級的,所謂輕量級,是指它的創建和銷毀不需要消耗太多的資源。這意味著在程序中可以經常創建和銷毀Session對象,例如為每個客戶請求分配單獨的Session實例,或者為每個工作單元分配單獨的Session實例。
Session有一個緩存,被稱為Hibernate的第一級緩存,它存放被當前工作單元加載的對象。每個Session實例都有自己的緩存,這個Session實例的緩存,這個Session實例的緩存只能被當前工作單元訪問。
- Transaction:該接口是Hibernate的數據庫事務接口,它對底層的事務接口做了封裝,底層事務接口包括:JDBC API、JTA(Java Transaction API)、CORBA(Common Object Requet Broker Architecture) API.
Hibernate應用可通過一致的Transaction接口來聲明事務邊界,這有助于應用在不同環境或容器中移植。
- Query和Criteria接口:它們是Hibernate的查詢接口,用于向數據庫查詢對象,以及控制執行查詢的過程。Query實例封裝了一個HQL(Hibernate Query Language)查詢語句,HQL是面向對象的,它引用類名及類的屬性名,而不是表名及表的字段名。Criteria接口完全封裝了基于字符串形式的查詢語句,比Query接口更加面向對象,Criteria接口更擅長于執行動態查詢。
<set
name="propertyName" (1)
table="table_name" (2)
schema="schema_name" (3)
lazy="true|false" (4)
inverse="true|false" (5)
cascade="all|none|save-update|delete|all-delete-orphan" (6)
sort="unsorted|natural|comparatorClass" (7)
order-by="column_name asc|desc" (8)
where="arbitrary sql where condition" (9)
outer-join="true|false|auto" (10)
batch-size="N" (11)
access="field|property|ClassName" (12)
>
<key .... />
<index .... />
<element .... />
</set>
(1) name 集合屬性的名稱
(2) table (可選——默認為屬性的名稱)這個集合表的名稱(不能在一對多的關聯關系中使用)
(3) schema (可選) 表的schema的名稱, 他將覆蓋在根元素中定義的schema
(4) lazy (可選——默認為false) lazy(可選--默認為false) 允許延遲加載(lazy initialization )(不能在數組中使用)
(5) inverse (可選——默認為false) 標記這個集合作為雙向關聯關系中的方向一端。
(6) cascade (可選——默認為none) 讓操作級聯到子實體
(7) sort(可選)指定集合的排序順序, 其可以為自然的(natural)或者給定一個用來比較的類。
(8) order-by (可選, 僅用于jdk1.4) 指定表的字段(一個或幾個)再加上asc或者desc(可選), 定義Map,Set和Bag的迭代順序
(9) where (可選) 指定任意的SQL where條件, 該條件將在重新載入或者刪除這個集合時使用(當集合中的數據僅僅是所有可用數據的一個子集時這個條件非常有用)
(10) outer-join(可選)指定這個集合,只要可能,應該通過外連接(outer join)取得。在每一個SQL語句中, 只能有一個集合可以被通過外連接抓取(譯者注: 這里提到的SQL語句是取得集合所屬類的數據的Select語句)
(11) batch-size (可選, 默認為1) 指定通過延遲加載取得集合實例的批處理塊大小("batch size")。
(12) access(可選-默認為屬性property):Hibernate取得屬性值時使用的策略
摘要: 原文出處:http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml
說明:該文不得轉載
摘要:本文以詳盡的實例展示了hibernate3.x中調用存儲過程各步驟,從建立測試表、存儲過程的建立、工程的建立以及類的編寫和測試一步一步引導用戶學習hibernate3.x中調用存儲過程的方法.
如果底層數據庫(eg. Oracle、mysq...
閱讀全文
Hibernate的描述文件可以是一個properties屬性文件,也可以是一個xml文件。下面講一下Hibernate.cfg.xml的配置。配置格式如下:
1. 配置數據源
在Hibernate.cfg.xml中既可以配置JDBC,也可以配置JNDI。在本小節中講述數據源如何配置。
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發送給數據庫的sql顯示出來 -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數據庫記錄數 -->
<property name="jdbc.fetch_size">50</property>
<!-- 設定對數據庫進行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!—下面為JNDI的配置 -->
<!-- 數據源的名稱 -->
<property name="connection.datasource">java:comp/env/jdbc/datasourcename</property>
<!-- Hibernate的連接加載類 -->
<property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2. c3p0連接池
c3p0連接池是Hibernate推薦使用的連接池,若需要使用該連接池時,需要將c3p0的jar包加入到classpath中。c3p0連接池的配置示例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅動程序,在后續的章節中將講述mysql、sqlserver和Oracle數據庫的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數據庫用戶名 -->
<property name="connection.username">user</property>
<!-- 數據庫密碼 -->
<property name="connection.password">pass</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在上述配置中,Hibernate根據配置文件生成連接,再交給c3p0管理。
3. proxool連接池
proxool跟c3p0以及dbcp不一樣,它是自己生成連接的,因此連接信息放在proxool配置文件中。使用它時,需要將proxool-0.8.3.jar加入到classespath中。配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!—proxool的配置 -->
<property name="proxool.pool_alias">pool1</property>
<property name="proxool.xml">ProxoolConf.xml</property>
<property name="connection.provider_class">net.sf.hibernate.connection.ProxoolConnectionProvider</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在hibernate.cfg.xml的同目錄下編寫proxool的配置文件:ProxoolConf.xml,該文件的配置實例如下:
ProxoolConf.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>pool1</alias>
<!--proxool只能管理由自己產生的連接-->
<!-- 驅動的url-->
<!-- jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK-->
<driver-url>… </driver-url>
<!-- 驅動類,eg. com.mysql.jdbc.Driver-->
<driver-class>… </driver-class>
<driver-properties>
<!-- 數據庫用戶名,eg. value為root-->
<property name="user" value="…"/>
<!-- 數據庫密碼,eg. value為root-->
<property name="password" value="…."/>
</driver-properties>
<!-- proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受-->
<maximum-new-connections>20</maximum-new-connections>
<!-- 最少保持的空閑連接數-->
<prototype-count>5</prototype-count>
<!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定-->
<maximum-connection-count>100</maximum-connection-count>
<!-- 最小連接數-->
<minimum-connection-count>10</minimum-connection-count>
</proxool>
</something-else-entirely>
4. dbcp連接池
在hibernate3.0中,已經不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實踐中發現dbcp有 BUG,在某些種情會產生很多空連接不能釋放,所以拋棄了對dbcp的支持。若需要使用dbcp,開發人員還需要將commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar兩個jar包加入到classpath中。dbcp與c3p0一樣,都是由hibernate建立連接的。
在hibernate2.0中的配置建立如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實際操作數據庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅動程序,在后續的章節中將講述mysql、sqlserver和Oracle數據庫的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數據庫用戶名,eg. root -->
<property name="connection.username">…</property>
<!-- 數據庫密碼, eg. root-->
<property name="connection.password">…</property>
<property name="dbcp.maxActive">100</property>
<property name="dbcp.whenExhaustedAction">1</property>
<property name="dbcp.maxWait">60000</property>
<property name="dbcp.maxIdle">10</property>
<property name="dbcp.ps.maxActive">100</property>
<property name="dbcp.ps.whenExhaustedAction">1</property>
<property name="dbcp.ps.maxWait">60000</property>
<property name="dbcp.ps.maxIdle">10</property>
<!-- 對象與數據庫表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. MySql連接配置
在hibernate中,可以配置很多種數據庫,例如MySql、Sql Server和Oracle,MySql的配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發送給數據庫的sql顯示出來 -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數據庫記錄數 -->
<property name="jdbc.fetch_size">50</property>
<!-- 設定對數據庫進行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!--驅動程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>
<!-- 數據庫用戶名-->
<property name="connection.username">root</property>
<!-- 數據庫密碼-->
<property name="connection.password">root</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上面使用的驅動類是com.mysql.jdbc.Driver。需要將MySql的連接器jar包(eg. mysql-connector-java-5.0.4-bin.jar)加入到classpath中。
6. Sql Server連接配置
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!--驅動程序-->
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>
<!-- 數據庫用戶名-->
<property name="connection.username">sa</property>
<!-- 數據庫密碼-->
<property name="connection.password"></property>
上例的驅動類使用的是jtds的驅動類,因此讀者需要將jtds的jar包(eg. jtds-1.2.jar)加入到classpath中。
7. Oracle連接配置
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!--驅動程序-->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>
<!-- 數據庫用戶名-->
<property name="connection.username">test</property>
<!-- 數據庫密碼-->
<property name="connection.password">test</property>
上例使用的驅動類為:oracle.jdbc.driver.OracleDriver,開發人員需要將相關的jar包(ojdbc14.jar)加入到classpath中。
http://m.tkk7.com/amigoxie/archive/2007/12/29/171395.html
本節講述如何使用Hibernate實現記錄的增、刪、改和查功能。
1 查詢
在Hibernate中使用查詢時,一般使用Hql查詢語句。
HQL(Hibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQL與SQL的最根本的區別,就是它是面向對象的。
使用HQL時需要注意以下幾點:
l 大小寫敏感
因為HQL是面向對象的,而對象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。
Eg.
HQL語句:from Cat as cat where cat.id > 1;與from Cat as cat where cat.ID > 1;是不一樣的,這點與SQL不同。
l from子句
Eg. from Cat,該句返回Cat對象實例,開發人員也可以給其加上別名,eg. from Cat as cat,對于多表查詢的情況,可參考如下:
from Cat as cat, Dog as dog
其它方面都與SQL類似,在此不再贅述。
接下來講一個在Hibernate中查詢的例子。
1.1簡單查詢
List list = session.createQuery("from User as user order by user.loginName").list();
1.2帶單個參數的查詢
List list = session.find("from User as user where user.loginName=?",
loginName,
Hibernate.STRING);
1.3多個參數的查詢
Eg1. 此例采用“?”占位符的方式
String hql = "from User as user where user.loginName=? and user.orgId=? ";
Query query = session.createQuery(hql);
query.setParameter(1, 'amigo');
query.setParameter(2, new Long(1)) ;
List list = query .list();
Eg2. 此例采用“:paramName”的方式
String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId ";
Query query = session.createQuery(hql);
query.setParameter('loginName', 'amigo');
query.setParameter('orgId', new Long(1)) ;
List list = query .list();
1.4查詢數量
int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();
1.5限制查詢起始值和數量的查詢
這種一般是在記錄需要分頁的時候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數為50。
String hql = "from User as user order by user.loginName";
int firstResult= 50;
int maxResults = 50;
Query query = session.createQuery(hql);
query = query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
1.6子查詢
在某些情況下,也需要用到子查詢,例如在下面的例子中,User為用戶對象,UserRole為用戶與角色關聯對象。如下HQL語句將沒有分配角色的用戶對象查找出來。
String hql = "from User user where user.loginName"
+ " not in(select ur.user.loginName from UserRole ur) ";
List list = (session.createQuery(hql)).list();
1.7原生SQL查詢
對于某些復雜的查詢語句,需要調用某種特定的數據庫的特定函數才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞數據庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連接即可。
Eg. 在下面的例子中,用到了Sql Server數據庫中的原生sql語句,如下所示:
String timeUnit = "13";
String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log";
SQLQuery query = session.createSQLQuery(sql)
.addScalar("count", Hibernate.INTEGER)
.addScalar("timeUnit", Hibernate.STRING);
List list = query.list();
2 新增
在數據庫中新增記錄在Hibernate中不需要使用insert命令,只需要構造新增的對象后,調用Session對象的save(…)方法即可。
2.1新增單個對象
新增單個對象的實例如下,該實例將在用戶表中新增一條記錄。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
User user = new User();
user.setLoginName("amigo");
user.setFullName("阿蜜果");
……
session.save(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
2.2批量新增對象
對于批量新增對象的情況,需要在新增一部分對象后flush和clear一次,例如,沒批量新增20個對象時手動的flush一次,假設在list為一個用戶列表,里面包含很多User對象,那么要將實現這些對象的批量新增,可采用如下方法:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
User user = (User) list.get(i);
session.save(user) ;
if (i % 20 == 0) {
session.flush();
session.clear();
}
}
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
3 更新
在hibernate中,更新對象前不需要使用查詢語句:update…,一般需要在取得需要更新的持久化對象后,執行Session對象的update(…)方法。例如:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對象
User user = session.get(User.class, "amigo");
//對需要修改的屬性進行修改
user.setFullName("阿蜜果");
……
session.update(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4 刪除
4.1刪除單個對象
一般在取得某對象后,開發人員可以調用Session對象的delete(…)方法刪除該對象。
Eg. 下面的實例中取得loginName(主鍵)為“amigo”的User對象后,將它刪除。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對象
User user = session.get(User.class, "amigo");
session.delete(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4.2批量刪除對象
對于批量刪除對象的情況,開發人員可以在取得待刪除的對象列表后,一個一個的將對象刪除,對于每個對象的刪除方法,見3.4.1小節。開發人員還可以hql語句來做批量刪除。
Eg. 該實例通過delete語句來刪除記錄,除了loginName為“amigo”的對象為,其余都刪除,代碼如下所示:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
String hql = "delete User as user where user.loginName != 'amigo'";
Query query = session.createQuery(hql);
int count = query.executeUpdate();
ts.commit();
System.out.println("delete count : " + count); //刪除條數
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
http://m.tkk7.com/amigoxie/archive/2008/01/01/171972.html
本文總結Hibernate中常見的異常。
1. net.sf.hibernate.MappingException
當出現net.sf.hibernate.MappingException: Error reading resource:…異常時一般是因為映射文件出現錯誤。
當出現net.sf.hibernate.MappingException: Resource: … not found是因為XML配置文件沒找到所致,有可能是放置目錄不正確,或者沒將其加入hibernate.cfg.xml中。
2. net.sf.hibernate.PropertyNotFoundException
當出現net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class …時,原因一般是因為XML映射文件中的屬性與對應的Java類中的屬性的getter或setter方法不一致。
3. org.hibernate.id.IdentifierGenerationException
當出現org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():異常時,一般是因為<id>元素配置不正確,<id>元素缺少其子元素<generator></generator>的配置引起。
解決方案:<id>元素映射了相應數據庫表的主鍵字段,對其子元素<generator class="">,其中class的取值可以為increment、identity、sequence、hilo、native……等,更多的可參考hibernate參考文檔,一般取其值為native 。具體可參考2.2.2.1小節。
4. a different object with the same identifier value was already associated with the session
當出現a different object with the same identifier value was already associated with the session時,一般是因為在hibernate中同一個session里面有了兩個相同標識但是是不同實體。
有如下幾種解決方案:
(1)使用session.clean(),如果在clean操作后面又進行了saveOrUpdate(object)等改變數據狀態的操作,有可能會報出"Found two representations of same collection"異常。
(2)使用session.refresh(object),當object不是數據庫中已有數據的對象的時候,不能使用session.refresh(object)因為該方法是從hibernate的session中去重新取object,如果session中沒有這個對象,則會報錯所以當你使用saveOrUpdate(object)之前還需要判斷一下。
(3)session.merge(object),Hibernate里面自帶的方法,推薦使用。
5. SQL Grammer Exception,Could not execute JDBC batch update
當出現SQL Grammer Exception,Could not execute JDBC batch update異常時,一般是由如下問題引起:
(1)SQL語句中存在語法錯誤或是傳入的數據有誤;
(2)數據庫的配置不合法,或者說是配置有誤。較容易出現的有數據表的映射文件(,hbm.xml文件)配置有誤;Hibernate.cfg.xml文件配置有誤;
(3) 當前的數據庫用戶權限不足,不能操作數據庫。以是以Oracle 數據庫為例,這種情況下在錯誤提示中會顯示java.sql.BatchUpdateException: ORA-01031: insufficient privileges這樣的信息。
針對上面的各種原因,開發人員可以找出對應的解決方案。
http://m.tkk7.com/amigoxie/category/19976.html
在Hibernate
中,各表的映射文件….hbm.xml
可以通過工具生成,例如在使用MyEclipse
開發時,它提供了自動生成映射文件的工具。本節簡單的講述一下這些配置文件的配置。
配置文件的基本結構如下:
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="包名">
<class name="類名" table="表名">
<id name="主鍵在java類中的字段名" column="對應表中字段" type="類型 ">
<generator class="主鍵生成策略"/>
</id>
……
</class>
</hibernate-mapping>
1. 主鍵(id)
Hibernate的主鍵生成策略有如下幾種:
1) assigned
主鍵由外部程序負責生成,在 save() 之前指定。
2) hilo
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。
3) seqhilo
與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,需要數據庫中的 Sequence,適用于支持 Sequence 的數據庫,如Oracle。
4) increment
主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:不能在集群下使用。
5) identity
采用數據庫提供的主鍵生成機制。如DB2、SQL Server、MySQL 中的主鍵生成機制。
6) sequence
采用數據庫提供的 sequence 機制生成主鍵。如 Oralce 中的Sequence。
7) native
由 Hibernate 根據使用的數據庫自行判斷采用 identity、hilo、sequence 其中一種作為主鍵生成方式。
8) uuid.hex
由 Hibernate 基于128 位 UUID 算法 生成16 進制數值(編碼后以長度32 的字符串表示)作為主鍵。
9) uuid.string
與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在 PostgreSQL 數據庫中。
10) foreign
使用另外一個相關聯的對象的標識符作為主鍵。
主鍵配置舉例如下:
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
另外還可以擴展Hibernate的類來做自己的主鍵生成策略,具體例子見:http://www.javaeye.com/topic/93391。
2. 普通屬性(property)
開發人員可以打開網址:http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
來查看hibernate3.0的dtd信息,可看到property的定義如下:
<!ELEMENT property (meta*,(column|formula)*,type?)>
<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property node CDATA #IMPLIED>
<!ATTLIST property access CDATA #IMPLIED>
<!ATTLIST property type CDATA #IMPLIED>
<!ATTLIST property column CDATA #IMPLIED>
<!ATTLIST property length CDATA #IMPLIED>
<!ATTLIST property precision CDATA #IMPLIED>
<!ATTLIST property scale CDATA #IMPLIED>
<!ATTLIST property not-null (true|false) #IMPLIED>
<!ATTLIST property unique (true|false) "false">
<!ATTLIST property unique-key CDATA #IMPLIED>
<!ATTLIST property index CDATA #IMPLIED> <!-- include the columns spanned by this property in an index -->
<!ATTLIST property update (true|false) #IMPLIED>
<!ATTLIST property insert (true|false) #IMPLIED>
<!ATTLIST property optimistic-lock (true|false) "true"> <!-- only supported for properties of a class (not component) -->
<!ATTLIST property formula CDATA #IMPLIED>
<!ATTLIST property lazy (true|false) "false">
<!ATTLIST property generated (never|insert|always) "never">
它的各屬性中比較常用的有:name(對應的java類的屬性名稱)、column(對應的表中的字段)、tyope(屬性的類型,eg.java.lang.String)、not-null(設置該屬性是否為空,為true時表示非空,默認為false)和length(字段的長度限制)。
Eg1. <property name="accessname" column="accessName" type="java.lang.String" not-null="true" />
Eg2. <property name="state" column="state" type="java.lang.Byte" not-null="true" />
Eg3. <property name="description" column="description" type="java.lang.String" />
3. 一對多關系(<many-to-one…/>和<set…></set>)
一對多關系一般是用在一個表與另一個表存在外鍵關聯的時候,例如用戶表的組織id與組織表存在外鍵關聯,則“一”方為組織表,“多”方為用戶表,因為一個組織可以包含多個用戶,而一個用戶只能隸屬于一個組織。
對于存在一對多關系和多對一關系的雙方,需要在…hbm.xml中進行相應配置,這時在“一”方(例如:組織)需要在映射文件中添加<set…></set>元素,因為它包含多個“多”方的對象,一般的格式如下:
<set name="java映射類中對應的屬性" inverse="true" lazy="true">
<key column="表中對應字段"/>
<one-to-many class="多方的類"/>
</set>
Eg.
<set name="userSet" inverse="true" lazy="true">
<key column="orgId"/>
<one-to-many class="User"/>
</set>
“多”方(例如:用戶)隸屬于一個“一”方對象,一般的格式如下:
<many-to-one name="java映射類中對應的屬性" column="表中對應字段" class="類名" not-null="true" />
Eg.
<many-to-one name="org" column="orgId" class="Organization" not-null="true" />
4. 一對一關系(<one-to-one…/>)
一對一關系相對一對多關系來說比較少見,但也在某些情況下要用到,例如有一個用戶的基本信息表(USER)和一個用戶的密碼表(PASSWD)就存在一對一的關系。下面來看一下一對一關系在Hibernate的配置。
其中主表(eg. 用戶的基本信息表)的配置如下:
<one-to-one name="主表對象中子表對象的屬性名" class="子表對象的類名" cascade="save-update"/>
Eg. <one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>
子表(eg. 用戶的密碼表)的配置如下:
<one-to-one name="子表對象中主表對象的屬性名" class="主表對象的類名" constrained="true" />
Eg. <one-to-one name="user" class="com.amigo.dao.pojo.User " constrained="true" />
5. 多對多關系(<many-to-many…/>)
在數據庫設計時,一般將多對多關系轉換為兩個一對多(或多對一)關系,例如在基于角色的權限系統中,用戶和角色存在的關系就是典型的多對多關系,即一個用戶可以具有多個角色,而一個角色又可以為多個用戶所有,一般在設計時,都會加一個用戶與角色的關聯表,該表與用戶表以及角色表都存在外鍵關聯。
在本小節中講述的是沒有分解的多對多關系在Hibernate中如何配置。設置格式如下:
<set name="java對象的屬性名" table="表名" cascade="all" outer-join="false">
<key column="表的對應字段"/>
<many-to-many class="另一個表的對象類" column="另一個表的字段"/>
</set>
Eg. 上述的多對多關系可以表示為:
t_user方:
<set name="roleSet" table="t_user" cascade="all" outer-join="false">
<key column="roleId"/>
<many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>
</set>
t_role方:
<set name="userSet" table="t_role" cascade="all" outer-join="false">
<key column="roleId"/>
<many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>
</set>
6. 完整實例
在本小節中舉一些.hbm.xml映射文件的例子,讓開發人員對其有一個感性的認識。接下來講述一個用戶表(tbl_user)、用戶與角色關聯表(tbl_user_role)、角色表(tbl_role)以及組織表(tbl_organization)的例子。
(1)tbl_user
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.amigo.dao.pojo">
<class name="User" table="tbl_user">
<id name="loginname" column="loginName" type="java.lang.String">
<generator class="assigned"/>
</id>
<property name="name" column="name" type="java.lang.String" not-null="true" />
<property name="password" column="password" type="java.lang.String" not-null="true" />
<property name="mobile" column="mobile" type="java.lang.String" />
<property name="telephone" column="telephone" type="java.lang.String" />
<property name="email" column="email" type="java.lang.String" />
<property name="createtime" column="createTime" type="java.util.Date" not-null="true" />
<property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />
<property name="logintimes" column="loginTimes" type="java.lang.Long" not-null="true" />
<property name="state" column="state" type="java.lang.Byte" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<many-to-one name="organization" column="orgId" class="Organization" not-null="true" />
<set name="userRoleSet" inverse="true" cascade="all-delete-orphan" lazy="true">
<key column="loginName"/>
<one-to-many class="UserRole"/>
</set>
</hibernate-mapping>
(2)tbl_organization
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.amigo.dao.pojo">
<class name="Organization" table="tbl_organization">
<id name="orgid" column="orgId" type="java.lang.Long">
<generator class="native"/>
</id>
<property name="parentorgid" column="parentOrgId" type="java.lang.Long" not-null="true" />
<property name="orgname" column="orgName" type="java.lang.String" not-null="true" />
<property name="orgfullname" column="orgFullName" type="java.lang.String" />
<property name="orglevel" column="orgLevel" type="java.lang.Integer" not-null="true" />
<property name="state" column="state" type="java.lang.Byte" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<property name="creator" column="creator" type="java.lang.String" />
<property name="createtime" column="createTime" type="java.util.Date" />
<set name="userSet" inverse="true" lazy="true">
<key column="orgId"/>
<one-to-many class="User"/>
</set>
</class>
</hibernate-mapping>
(3)tbl_user_role
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.cotel.netvote.dao.model">
<class name="UserRole" table="tbl_user_role">
<id name="urid" column="urId" type="java.lang.Integer">
<generator class="native"/>
</id>
<many-to-one name="role" column="roleId" class="Role" not-null="true" />
<many-to-one name="user" column="loginName" class="User" not-null="true" />
</class>
</hibernate-mapping>
(4)tbl_ role
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.cotel.netvote.dao.model">
<class name="Role" table="tbl_role">
<id name="roleid" column="roleId" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="rolename" column="roleName" type="java.lang.String" not-null="true" />
<property name="createdate" column="createDate" type="java.util.Date" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<set name="userRoleSet" inverse="true" lazy="true" cascade="all">
<key column="roleId"/>
<one-to-many class="UserRole"/>
</set>
</class>
</hibernate-mapping>
http://m.tkk7.com/amigoxie/archive/2007/12/31/171831.html