2008年6月1日
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>2列右側(cè)固定左側(cè)自適應(yīng)寬度,未知高度且底部平齊+頭部+導(dǎo)航+尾部——<a >標(biāo)準(zhǔn)之路www.aa25.cn</a></title>
<link href="layout.css" rel="stylesheet" type="text/css" />
<meta name="Keywords" content="標(biāo)準(zhǔn)之路,www.aa25.cn,網(wǎng)頁(yè)標(biāo)準(zhǔn)布局,DIV+CSS" />
<meta name="" content="標(biāo)準(zhǔn)之路,www.aa25.cn,網(wǎng)頁(yè)標(biāo)準(zhǔn)布局,DIV+CSS" />
<meta name="author" content"×××,有問(wèn)題請(qǐng)到www.68css.cn網(wǎng)站留言" />
<meta name="Description" content="本套網(wǎng)頁(yè)標(biāo)準(zhǔn)布局模板是由標(biāo)準(zhǔn)之路(www.aa25.cn)制作完成,如果您要轉(zhuǎn)載,請(qǐng)保留版權(quán)" />
</head>
<body>
<div id="container">
<div id="header">This is the Header</div>
<br class="clearfloat" />
<div id="menu">This is the Menu</div>
<br class="clearfloat" />
<div id="mainContent">
<div id="sidebar">This is the sidebar<br />
</div>
<div id="content">2列右側(cè)固定左側(cè)自適應(yīng)寬度,未知高度且底部平齊+頭部+導(dǎo)航+尾部——<a >標(biāo)準(zhǔn)之路www.aa25.cn</a><br />
<br />
本例和例21差不多,一個(gè)是固定寬度,一個(gè)是自適應(yīng),同樣是未知高度。<br />
<br />
此例中需要說(shuō)明一點(diǎn)的是:當(dāng)content設(shè)定高度后,3像素會(huì)跑到content外側(cè),反之,在content內(nèi)部。這樣,我們用!important修正在ie下向左多浮動(dòng)2像素,加上3像素的bug正好是5像素,所以在火狐和IE下顯示是一樣的,這是大家必須注意的一點(diǎn)。而當(dāng)content設(shè)定高度后,如100px,那么在IE6下,當(dāng)高度超過(guò)100px時(shí),它會(huì)自動(dòng)把conent撐高,而火狐去不會(huì)。所以用!important修正在IE下設(shè)定高度值使它的3像素跑到外側(cè),火狐下因不存在3像素問(wèn)題,所以高度自動(dòng)。<br />
<br />
<br />
總之,實(shí)現(xiàn)的方法是多種多樣的,這只是本人在學(xué)習(xí)過(guò)程中總結(jié)的一點(diǎn)經(jīng)驗(yàn),權(quán)當(dāng)拋磚引玉,希望能對(duì)您有所幫助,當(dāng)然您有更好的辦法和布局,歡迎一塊來(lái)學(xué)習(xí),交流,讓web標(biāo)準(zhǔn)在中國(guó)得到更好的發(fā)展。同時(shí)希望您繼續(xù)關(guān)注標(biāo)準(zhǔn)之路(www.aa25.cn)<br />
<br />
如果您要實(shí)現(xiàn)未知高度底部平齊,請(qǐng)參考23例<br />
</div>
</div>
<br class="clearfloat" />
<div id="footer">This is the footer<span style="display:none"><script language="javascript" type="text/javascript" src="http://js.users.51.la/1967272.js"></script></span></div>
</div>
</body>
</html>
?
css
body { font-family:Verdana; font-size:14px; margin:0;}
#container {margin:0 auto; width:100%;}
#header { height:100px; background:#9c6; margin-bottom:5px;}
#menu { height:30px; background:#693; margin-bottom:5px;}
#mainContent { background:url(bg.gif) right 0 repeat-y; overflow:auto;zoom:1; margin-bottom:5px;}
#sidebar { float:right; width:200px;background:#cf9;}
#content { margin-right:205px !important; margin-right:202px; height:auto !important; height:100px; background:#ffa;}
#footer { height:60px; background:#9c6;}
.clearfloat { clear:both; height:0; font-size: 1px; line-height: 0px;}
?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
winver-檢查Windows版本
?
wmimgmt.msc打開(kāi)windows管理體系結(jié)構(gòu)(WMI)
?
wupdmgrwindows更新程序
?
wscriptwindows腳本宿主設(shè)置
?
write寫(xiě)字板
?
winmsd-系統(tǒng)信息
?
wiaacmgr-掃描儀和照相機(jī)向?qū)?/p>
?
winchatXP自帶局域網(wǎng)聊天
?
mem.exe顯示內(nèi)存使用情況
?
Msconfig.exe-系統(tǒng)配置實(shí)用程序
?
mplayer2-簡(jiǎn)易widnows media player
?
mspaint畫(huà)圖板
?
mstsc遠(yuǎn)程桌面連接
?
mplayer2-媒體播放機(jī)
?
magnify放大鏡實(shí)用程序
?
mmc打開(kāi)控制臺(tái)
?
mobsync同步命令
?
dxdiag-檢查DirectX信息
?
drwtsn32 系統(tǒng)醫(yī)生
?
devmgmt.msc- 設(shè)備管理器
?
dfrg.msc-磁盤(pán)碎片整理程序
?
diskmgmt.msc-磁盤(pán)管理實(shí)用程序
?
dcomcnfg-打開(kāi)系統(tǒng)組件服務(wù)
?
ddeshare-打開(kāi)DDE共享設(shè)置
?
dvdplayDVD播放器
?
net stop messenger-停止信使服務(wù)
?
net start messenger開(kāi)始信使服務(wù)
?
notepad打開(kāi)記事本
?
nslookup-網(wǎng)絡(luò)管理的工具向?qū)?/p>
?
ntbackup-系統(tǒng)備份和還原
?
narrator-屏幕“講述人”
?
ntmsmgr.msc移動(dòng)存儲(chǔ)管理器
?
ntmsoprq.msc-移動(dòng)存儲(chǔ)管理員操作請(qǐng)求
?
netstat -an(TC)命令檢查接口
?
syncapp創(chuàng)建一個(gè)公文包
?
sysedit系統(tǒng)配置編輯器
?
sigverif-文件簽名驗(yàn)證程序
?
sndrec32-錄音機(jī)
?
shrpubw創(chuàng)建共享文件夾
?
secpol.msc-本地安全策略
?
syskey-系統(tǒng)加密,一旦加密就不能解開(kāi),保護(hù)windows xp系統(tǒng)的雙重密碼
?
services.msc-本地服務(wù)設(shè)置
?
Sndvol32-音量控制程序
?
sfc.exe系統(tǒng)文件檢查器
?
sfc /scannow-windows文件保護(hù)
?
tsshutdn-60秒倒計(jì)時(shí)關(guān)機(jī)命令
?
tourstartxp簡(jiǎn)介(安裝完成后出現(xiàn)的漫游xp程序)
?
taskmgr任務(wù)管理器
?
eventvwr-事件查看器
?
eudcedit-造字程序
?
explorer-打開(kāi)資源管理器
?
packager-對(duì)象包裝程序
?
perfmon.msc計(jì)算機(jī)性能監(jiān)測(cè)程序
?
progman程序管理器
?
regedit.exe注冊(cè)表
?
rsop.msc-組策略結(jié)果集
?
regedt32-注冊(cè)表編輯器
?
rononce -p 15秒關(guān)機(jī)
?
regsvr32 /u *.dll停止dll文件運(yùn)行
?
regsvr32 /u zipfldr.dll取消ZIP支持
?
cmd.exeCMD命令提示符
?
chkdsk.exe-Chkdsk磁盤(pán)檢查
?
certmgr.msc證書(shū)管理實(shí)用程序
?
calc-啟動(dòng)計(jì)算器
?
charmap啟動(dòng)字符映射表
?
cliconfg-SQL SERVER 客戶端網(wǎng)絡(luò)實(shí)用程序
?
Clipbrd剪貼板查看器
?
conf-啟動(dòng)netmeeting
?
compmgmt.msc-計(jì)算機(jī)管理
?
cleanmgr-垃圾整理
?
ciadv.msc索引服務(wù)程序
?
osk打開(kāi)屏幕鍵盤(pán)
?
odbcad32-ODBC數(shù)據(jù)源管理器
?
oobe/msoobe /a檢查XP是否激活
?
lusrmgr.msc本機(jī)用戶和組
?
logoff-注銷(xiāo)命令
?
iexpress-木馬捆綁工具,系統(tǒng)自帶
?
Nslookup-IP地址偵測(cè)器
?
fsmgmt.msc-共享文件夾管理器
?
utilman輔助工具管理器
?
gpedit.msc-組策略
?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
package com.shine;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.swing.Timer;
public class Tetris extends JFrame {
public Tetris() {
Tetrisblok a = new Tetrisblok();
addKeyListener(a);
add(a);
}
public static void main(String[] args) {
Tetris frame = new Tetris();
JMenuBar menu = new JMenuBar();
frame.setJMenuBar(menu);
JMenu game = new JMenu("游戲");
JMenuItem newgame = game.add("新游戲");
JMenuItem pause = game.add("暫停");
JMenuItem goon = game.add("繼續(xù)");
JMenuItem exit = game.add("退出");
JMenu help = new JMenu("幫助");
JMenuItem about = help.add("關(guān)于");
menu.add(game);
menu.add(help);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(220, 275);
frame.setTitle("Tetris內(nèi)測(cè)版");
// frame.setUndecorated(true);
frame.setVisible(true);
frame.setResizable(false);
}
}
// 創(chuàng)建一個(gè)俄羅斯方塊類
class Tetrisblok extends JPanel implements KeyListener {
// blockType 代表方塊類型
// turnState代表方塊狀態(tài)
private int blockType;
private int score = 0;
private int turnState;
private int x;
private int y;
private int i = 0;
int j = 0;
int flag = 0;
// 定義已經(jīng)放下的方塊x=0-11,y=0-21;
int[][] map = new int[13][23];
// 方塊的形狀 第一組代表方塊類型有S、Z、L、J、I、O、T 7種 第二組 代表旋轉(zhuǎn)幾次 第三四組為 方塊矩陣
private final int shapes[][][] = new int[][][] {
// i
{ { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
// s
{ { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
// z
{ { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
// j
{ { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// o
{ { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// l
{ { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// t
{ { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
// 生成新方塊的方法
public void newblock() {
blockType = (int) (Math.random() * 1000) % 7;
turnState = (int) (Math.random() * 1000) % 4;
x = 4;
y = 0;
if (gameover(x, y) == 1) {
newmap();
drawwall();
score = 0;
JOptionPane.showMessageDialog(null, "GAME OVER");
}
}
// 畫(huà)圍墻
public void drawwall() {
for (i = 0; i < 12; i++) {
map[i][21] = 2;
}
for (j = 0; j < 22; j++) {
map[11][j] = 2;
map[0][j] = 2;
}
}
// 初始化地圖
public void newmap() {
for (i = 0; i < 12; i++) {
for (j = 0; j < 22; j++) {
map[i][j] = 0;
}
}
}
// 初始化構(gòu)造方法
Tetrisblok() {
newblock();
newmap();
drawwall();
Timer timer = new Timer(1000, new TimerListener());
timer.start();
}
// 旋轉(zhuǎn)的方法
public void turn() {
int tempturnState = turnState;
turnState = (turnState + 1) % 4;
if (blow(x, y, blockType, turnState) == 1) {
}
if (blow(x, y, blockType, turnState) == 0) {
turnState = tempturnState;
}
repaint();
}
// 左移的方法
public void left() {
if (blow(x - 1, y, blockType, turnState) == 1) {
x = x - 1;
}
;
repaint();
}
// 右移的方法
public void right() {
if (blow(x + 1, y, blockType, turnState) == 1) {
x = x + 1;
}
;
repaint();
}
// 下落的方法
public void down() {
if (blow(x, y + 1, blockType, turnState) == 1) {
y = y + 1;
delline();
}
;
if (blow(x, y + 1, blockType, turnState) == 0) {
add(x, y, blockType, turnState);
newblock();
delline();
}
;
repaint();
}
// 是否合法的方法
public int blow(int x, int y, int blockType, int turnState) {
for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
+ b + 1][y + a] == 1))
|| ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
+ b + 1][y + a] == 2))) {
return 0;
}
}
}
return 1;
}
// 消行的方法
public void delline() {
int c = 0;
for (int b = 0; b < 22; b++) {
for (int a = 0; a < 12; a++) {
if (map[a][b] == 1) {
c = c + 1;
if (c == 10) {
score += 10;
for (int d = b; d > 0; d--) {
for (int e = 0; e < 11; e++) {
map[e][d] = map[e][d - 1];
}
}
}
}
}
c = 0;
}
}
// 判斷你掛的方法
public int gameover(int x, int y) {
if (blow(x, y, blockType, turnState) == 0) {
return 1;
}
return 0;
}
// 把當(dāng)前添加map
public void add(int x, int y, int blockType, int turnState) {
int j = 0;
for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
if (map[x + b + 1][y + a] == 0) {
map[x + b + 1][y + a] = shapes[blockType][turnState][j];
}
;
j++;
}
}
}
// 畫(huà)方塊的的方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 畫(huà)當(dāng)前方塊
for (j = 0; j < 16; j++) {
if (shapes[blockType][turnState][j] == 1) {
g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
}
}
// 畫(huà)已經(jīng)固定的方塊
for (j = 0; j < 22; j++) {
for (i = 0; i < 12; i++) {
if (map[i][j] == 1) {
g.fillRect(i * 10, j * 10, 10, 10);
}
if (map[i][j] == 2) {
g.drawRect(i * 10, j * 10, 10, 10);
}
}
}
g.drawString("score=" + score, 125, 10);
g.drawString("抵制不良游戲,", 125, 50);
g.drawString("拒絕盜版游戲。", 125, 70);
g.drawString("注意自我保護(hù),", 125, 90);
g.drawString("謹(jǐn)防受騙上當(dāng)。", 125, 110);
g.drawString("適度游戲益腦,", 125, 130);
g.drawString("沉迷游戲傷身。", 125, 150);
g.drawString("合理安排時(shí)間,", 125, 170);
g.drawString("享受健康生活。", 125, 190);
}
// 鍵盤(pán)監(jiān)聽(tīng)
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
down();
break;
case KeyEvent.VK_UP:
turn();
break;
case KeyEvent.VK_RIGHT:
right();
break;
case KeyEvent.VK_LEFT:
left();
break;
}
}
// 無(wú)用
public void keyReleased(KeyEvent e) {
}
// 無(wú)用
public void keyTyped(KeyEvent e) {
}
// 定時(shí)器監(jiān)聽(tīng)
class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
repaint();
if (blow(x, y + 1, blockType, turnState) == 1) {
y = y + 1;
delline();
}
;
if (blow(x, y + 1, blockType, turnState) == 0) {
if (flag == 1) {
add(x, y, blockType, turnState);
delline();
newblock();
flag = 0;
}
flag = 1;
}
;
}
}
}
?轉(zhuǎn)自CSDN
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
function htmlToubb(h,u){
str = pattern(document.getElementById(h).value);
document.getElementById(u).value=str;
}
function ubbTohtml(u,h){
str = up(document.getElementById(u).value);
document.getElementById(h).value=str;
}
function pattern(str){
str = str.replace(/<br[^>]*>/ig,'\n');
str = str.replace(/<p[^>\/]*\/>/ig,'\n');
str = str.replace(/\son[\w]{3,16}\s?=\s*([\'\"]).+?\1/ig,'');
str = str.replace(/<hr[^>]*>/ig,'[hr]');
str = str.replace(/<(sub|sup|u|strike|b|i|pre)>/ig,'[$1]');
str = str.replace(/<\/(sub|sup|u|strike|b|i|pre)>/ig,'[/$1]');
str = str.replace(/<(\/)?strong>/ig,'[$1b]');
str = str.replace(/<(\/)?em>/ig,'[$1i]');
str = str.replace(/<(\/)?blockquote([^>]*)>/ig,'[$1blockquote]');
str = str.replace(/<img[^>]*smile=\"(\d+)\"[^>]*>/ig,'[s:$1]');
str = str.replace(/<img[^>]*src=[\'\"\s]*([^\s\'\"]+)[^>]*>/ig,'[img]'+'$1'+'[/img]');
str = str.replace(/<a[^>]*href=[\'\"\s]*([^\s\'\"]*)[^>]*>(.+?)<\/a>/ig,'[url=$1]'+'$2'+'[/url]');
str = str.replace(/<[^>]*?>/ig, '');
str = str.replace(/&/ig, '&');
str = str.replace(/</ig, '<');
str = str.replace(/>/ig, '>');
return str;
}
function up(str){
str = str.replace(/</ig,'<');
str = str.replace(/>/ig,'>');
str = str.replace(/\n/ig,'<br />');
str = str.replace(/\[code\](.+?)\[\/code\]/ig, function($1, $2) {return phpcode($2);});
str = str.replace(/\[hr\]/ig,'<hr />');
str = str.replace(/\[\/(size|color|font|backcolor)\]/ig,'</font>');
str = str.replace(/\[(sub|sup|u|i|strike|b|blockquote|li)\]/ig,'<$1>');
str = str.replace(/\[\/(sub|sup|u|i|strike|b|blockquote|li)\]/ig,'</$1>');
str = str.replace(/\[\/align\]/ig,'</p>');
str = str.replace(/\[(\/)?h([1-6])\]/ig,'<$1h$2>');
str = str.replace(/\[align=(left|center|right|justify)\]/ig,'<p align="$1">');
str = str.replace(/\[size=(\d+?)\]/ig,'<font size="$1">');
str = str.replace(/\[color=([^\[\<]+?)\]/ig, '<font color="$1">');
str = str.replace(/\[backcolor=([^\[\<]+?)\]/ig, '<font style="background-color:$1">');
str = str.replace(/\[font=([^\[\<]+?)\]/ig, '<font face="$1">');
str = str.replace(/\[list=(a|A|1)\](.+?)\[\/list\]/ig,'<ol type="$1">$2</ol>');
str = str.replace(/\[(\/)?list\]/ig,'<$1ul>');
str = str.replace(/\[s:(\d+)\]/ig,function($1,$2){ return smilepath($2);});
str = str.replace(/\[img\]([^\[]*)\[\/img\]/ig,'<img src="$1" border="0" />');
str = str.replace(/\[url=([^\]]+)\]([^\[]+)\[\/url\]/ig, '<a href="$1">'+'$2'+'</a>');
str = str.replace(/\[url\]([^\[]+)\[\/url\]/ig, '<a href="$1">'+'$1'+'</a>');
return str;
}
?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
PL/SQL 或UE中進(jìn)行設(shè)置時(shí)發(fā)現(xiàn),找不到Courier New
字體。重裝也沒(méi)作用。
根本原因是沒(méi)有將?Courier New 設(shè)置為“顯示”

已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
Windows Registry Editor Version 5.00
?
[HKEY_CLASSES_ROOT\*\shell]
[HKEY_CLASSES_ROOT\*\shell\UltraEdit]
@="UltraEdit-32"
[HKEY_CLASSES_ROOT\*\shell\UltraEdit\Command]
@="C:\\Program Files (x86)\\IDM Computer Solutions\\UltraEdit\\Uedit32.exe %1"
C:\\Program Files (x86)\\IDM Computer Solutions\\UltraEdit\\Uedit32.exe這個(gè)改為實(shí)際路徑
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
每次一按回車(chē),序號(hào)后面跟著一個(gè)箭頭,雖然打印的時(shí)候不會(huì)顯示出來(lái),但這種排版效果不好。
好像是樣式的問(wèn)題,不知道怎么處理?

解決辦法如圖:

已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
錯(cuò)誤提示:

設(shè)置方式:

?
?
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦
1,當(dāng)選擇了一段文本后 (如一個(gè)變量名)在整個(gè)類中用到該文本的地方都高亮顯示
Eclipse工具欄上有個(gè)類似鋼筆的圖標(biāo),按下去就可以了。
2,當(dāng)想要修改一個(gè)變量在類中所有用到的地方時(shí) 如 A a = new A(); 還有很多其它位置用到a 現(xiàn)在想要把a(bǔ) 改為a1
可以選正a后在菜單上選Refactor->Rename 就可以。類中有a 的地方都會(huì)改為a1
作者:caoyinghui1986 發(fā)表于2009-9-4 21:41:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/06a9261120fd9b78cb80c435.html
5.6 其他功能
在這一節(jié)中,我們將介紹幾個(gè)非常有用的Eclipse功能。這些功能有助于您提高CVS和Eclipse的使用效率。
5.6.1 編輯器中的快速差別功能對(duì)CVS的支持
在本書(shū)第2章“Eclipse入門(mén)”中,您知道編輯
器所支持的快速差別功能可對(duì)文件的添加和修改操作加上注釋。如果您在Workbench | Editor | Quick
Diff首選項(xiàng)頁(yè)面中啟用了Latest CVS
Revision選項(xiàng),那么快速差別功能所添加的文件注釋是在參考CVS中該文件最新版本的基礎(chǔ)之上添加的。在將更改提交到CVS或用CVS中該文件的某
一版本來(lái)替換該文件時(shí),快速差別功能所添加的注釋會(huì)被刪除。
5.6.2 補(bǔ)丁程序:快速而又簡(jiǎn)單地共享更改
補(bǔ)丁程序(patch)是一個(gè)包含了某一資源的資源庫(kù)實(shí)例和該資源的工作空間實(shí)例之間差別的文件。補(bǔ)丁程序可表示出一個(gè)單獨(dú)文件(或完整項(xiàng)目)中的差別。補(bǔ)丁程序允許您共享尚未提交到CVS的更改。有很多原因使得補(bǔ)丁程序非常有用。
● 由于您沒(méi)有向CVS提交資源的權(quán)限,所以您需要將該補(bǔ)丁程序發(fā)送給具有資源提交權(quán)限的人,然后再由他向CVS提交資源。
● 您需要為所遇到的問(wèn)題準(zhǔn)備一個(gè)應(yīng)急修改或臨時(shí)工作空間。
● 在將重要的更改提交到CVS之前,您可能想讓別人對(duì)您的更改進(jìn)行校驗(yàn)。在這種情況下,您可以將補(bǔ)丁程序發(fā)送給校驗(yàn)人以讓他們進(jìn)行測(cè)試。
通過(guò)使用快捷菜單Team | Create
Patch…,我們就可以創(chuàng)建補(bǔ)丁文件。該操作會(huì)調(diào)用Create
Patch向?qū)?lái)指導(dǎo)您完成補(bǔ)丁文件的創(chuàng)建。若要應(yīng)用某補(bǔ)丁程序,則使用快捷菜單Team | Apply Patch…。該操作會(huì)調(diào)用Apply
Patch向?qū)Аclipse聯(lián)機(jī)文檔Workbench User Guide的Working with patches
一節(jié)中有關(guān)上述兩個(gè)操作的描述非常精彩。
5.6.3 項(xiàng)目集:加快新工作空間
小組支持為工作空間中的項(xiàng)目(一個(gè)或多個(gè))提供了版
本控制信息的封裝功能。該封裝功能被稱為項(xiàng)目集。項(xiàng)目集的目的是從執(zhí)行任務(wù)所需的資源庫(kù)中把需要的全部項(xiàng)目都預(yù)先準(zhǔn)備到一個(gè)工作空間中。在應(yīng)用程序構(gòu)建過(guò)
程中可能要用到存在相互依賴關(guān)系的多個(gè)項(xiàng)目。下述操作可能是單調(diào)乏味而又容易產(chǎn)生錯(cuò)誤的:決定所需項(xiàng)目,然后再將這些所需的正確項(xiàng)目從資源庫(kù)中手動(dòng)添加到
工作空間中。項(xiàng)目集是Eclipse的一個(gè)功能單元。資源庫(kù)提供程序可對(duì)是否支持該功能進(jìn)行選擇(很多資源庫(kù)提供程序都會(huì)選擇是)。CVS對(duì)項(xiàng)目集提供了
支持。一個(gè)項(xiàng)目集所封裝的項(xiàng)目可能是由不同資源庫(kù)管理的。
項(xiàng)目集信息包含在一個(gè)文件中。若要?jiǎng)?chuàng)建該項(xiàng)目集信息
文件,則在菜單欄上選擇File | Export | Team Project Set選項(xiàng)。若要使用該項(xiàng)目集信息文件,則在菜單欄上選擇File
| Import | Team Project
Set選項(xiàng)。通過(guò)使用Export向?qū)В覀兛梢詫?duì)項(xiàng)目集中所包含的項(xiàng)目進(jìn)行定義。出于通用的考慮,最終的項(xiàng)目集信息文件可被發(fā)送給別人以在CVS中進(jìn)行
導(dǎo)入或維護(hù)。對(duì)于所開(kāi)發(fā)的應(yīng)用程序來(lái)說(shuō),您可以為其開(kāi)發(fā)生命周期關(guān)鍵節(jié)點(diǎn)處的快照維護(hù)多個(gè)項(xiàng)目集文件。
在導(dǎo)入過(guò)程中,項(xiàng)目集文件中定義的所有項(xiàng)目都被從
CVS中自動(dòng)檢出到您的工作空間中。在導(dǎo)入過(guò)程中,一種可能比較穩(wěn)健的做法是禁用自動(dòng)構(gòu)建首選項(xiàng)設(shè)置(Workbench首選項(xiàng)頁(yè)面中的Build
Automatically設(shè)置)。通過(guò)禁用Build
Automatically設(shè)置,我們就可以在導(dǎo)入過(guò)程中避免編譯和構(gòu)建操作,進(jìn)而加快資源的導(dǎo)入。但在導(dǎo)入操作完成后,請(qǐng)記住要重新啟用該首選項(xiàng)。
5.6.4 斷開(kāi)項(xiàng)目與CVS的連接或?yàn)轫?xiàng)目重分派一個(gè)CVS資源庫(kù)
通過(guò)使用Team |
Disconnect…操作,您可以斷開(kāi)項(xiàng)目與CVS的連接。在選擇了快捷菜單Team |
Disconnect…后會(huì)出現(xiàn)一個(gè)對(duì)話框。該對(duì)話框會(huì)對(duì)您進(jìn)行詢問(wèn),以讓您對(duì)是否保存該項(xiàng)目的CVS元數(shù)據(jù)作出決定。如果選擇了保留該項(xiàng)目的CVS元數(shù)
據(jù),那么通過(guò)使用Team | Share
Project…操作,我們就可以將該項(xiàng)目與同一CVS資源庫(kù)進(jìn)行重新連接。如果您刪除了該CVS元數(shù)據(jù),那么可以將該項(xiàng)目共享給其他資源庫(kù)。
作為選擇,如想將項(xiàng)目重新分派給另外一個(gè)CVS資源庫(kù),那么您可以先為該項(xiàng)目打開(kāi)CVS資源庫(kù)頁(yè)面,然后再選擇Change Sharing…按鈕。該操作與使用Disconnect…以及Share Project…操作在邏輯上等價(jià)。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:58:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/8265f309c5d35bc93ac76334.html
5.5 特殊情況及其處理
這里將給出一些您每天或在軟件開(kāi)發(fā)周期中可能會(huì)碰到的常見(jiàn)情況,以及如何使用Eclipse來(lái)處理這些情況的建議。某些情況的解決可能需要使用CVS,但通常只使用Eclipse就可以處理它們。
5.5.1 對(duì)項(xiàng)目資源進(jìn)行重命名、移動(dòng)和刪除
●
避免重命名CVS控制之下的項(xiàng)目。如果您這樣做了,那么所做的命名修改只在該項(xiàng)目所處的工作空間中有效。保留在CVS中的仍是該項(xiàng)目的初始名。如果必須修
改項(xiàng)目的名稱,那么您最好先使用Team |
Disconnect…操作來(lái)解除該項(xiàng)目與CVS的關(guān)聯(lián)關(guān)系,然后再對(duì)該項(xiàng)目重命名。事實(shí)上,重命名后的項(xiàng)目會(huì)被看作是新項(xiàng)目。在將重命名后的項(xiàng)目重新連
接到CVS時(shí),您必須像定義任何新項(xiàng)目一樣將該重命名后的項(xiàng)目定義到CVS中。
● 對(duì)文件夾的重命名操作會(huì)導(dǎo)致CVS中出現(xiàn)一個(gè)新文件夾。幸運(yùn)的是,原文件夾中的內(nèi)容會(huì)被移動(dòng)到新文件夾中。如果您啟用了CVS首選項(xiàng)Prune empty directories,那么在從CVS檢出資源后,該舊文件夾將不會(huì)出現(xiàn)在您的工作空間中。
●
如果您將工作空間中的某資源刪除了,那么在向CVS提交了更改后,保存在CVS中的該資源也會(huì)被刪除。要記住的是文件夾決不會(huì)在CVS中刪除。CVS首選
項(xiàng)Prune empty directories使得這些文件夾隱藏在視圖中。默認(rèn)情況下,CVS首選項(xiàng)Prune empty
directories是被啟用的。
● 因?yàn)樾薷目赡軙?huì)涉及多個(gè)項(xiàng)目,所以在進(jìn)行全局修改前,您需要確保工作空間中的所有項(xiàng)目是資源庫(kù)中的最新版本。Java類的重構(gòu)是一個(gè)可能導(dǎo)致工作空間被廣泛修改的操作。項(xiàng)目間的資源移動(dòng)也可能產(chǎn)生這種影響。
● 在CVS透視圖中,項(xiàng)目之間資源移動(dòng)的結(jié)果是:所要移動(dòng)的資源添加到目標(biāo)項(xiàng)目中,而源項(xiàng)目中的該資源會(huì)被刪除。移動(dòng)到目標(biāo)項(xiàng)目中的資源必須被添加到版本控制中。而資源重命名的效果與此相同。
●
在文件被修改后,如果您要執(zhí)行諸如同步等CVS操作,那么我們建議您在項(xiàng)目層次上進(jìn)行同步(即使您的更改可能僅涉及一個(gè)單獨(dú)文件)。例如,如果您對(duì)一個(gè)文
件進(jìn)行了重命名這一CVS的刪除和添加操作,那么在文件層次上的同步將只會(huì)檢測(cè)添加操作而不檢測(cè)刪除操作。而項(xiàng)目層次上的同步則會(huì)對(duì)添加和刪除操作都進(jìn)行
檢測(cè)。
● 在所進(jìn)行的修改涉及整個(gè)應(yīng)用程序的情況下,您應(yīng)該將這次修改通知給自己所在的小組,以避免不必要的沖突。此時(shí),一旦條件滿足,您就應(yīng)該提交修改。沖突的解決可能是冗長(zhǎng)乏味而又難以解決的。
5.5.2 取消修改:使用替換和比較操作
有時(shí),我們都希望事情能夠重新開(kāi)始。在人的一生中,
這可能不容易。但是對(duì)于Eclipse和CVS來(lái)說(shuō),這要簡(jiǎn)單得多。根據(jù)您的需要,您有多種選擇。在先前的幾章中,您看到了如何使用快捷菜單操作
Replace With和Compare
With用工作空間中的本地歷史記錄來(lái)替換和比較資源。通過(guò)使用CVS,您對(duì)資源的替換和比較操作就有了額外的選擇。如果您尚未最終完成某個(gè)修改,而且之
后一段時(shí)間里根本就沒(méi)有繼續(xù)這次修改。這種情況下,Compare
With操作可能會(huì)非常有用,它會(huì)使您記起上次停止修改的地方。在使用上述Replace With和Compare
With操作時(shí),您是用來(lái)自HEAD流(或者其他分支/版本、某一個(gè)具體版本)的最新資源來(lái)替換或比較當(dāng)前資源的。
5.5.3 通過(guò)建立分支來(lái)進(jìn)行版本維護(hù)和新版本開(kāi)發(fā)
在小組已經(jīng)交付了您的應(yīng)用程序并準(zhǔn)備開(kāi)始下一個(gè)版本的開(kāi)發(fā)工作時(shí),您可能喜歡所有的后續(xù)開(kāi)發(fā)能在下一版本所指派的特定分支處開(kāi)始,同時(shí)還要允許先前版本的服務(wù)。這里所給出的就是在Eclipse中可用的一種方法。
●
在包含了最近已完成版本的分支(或HEAD)中,請(qǐng)選擇所有的項(xiàng)目。然后在所選項(xiàng)目上使用Branch…快捷菜單,并輸入該新版本的新分支名。這樣,所選
擇的全部項(xiàng)目以及這些項(xiàng)目的內(nèi)容將用下一個(gè)版本分支名來(lái)標(biāo)記。在CVS
Repositories視圖中,這些項(xiàng)目會(huì)被列在那個(gè)分支名之下。在從那個(gè)分支處將這些項(xiàng)目檢出到您的工作空間之后,接下來(lái)的操作是基于該新版本分支
的。
● 您可重復(fù)上述過(guò)程以創(chuàng)建一個(gè)單獨(dú)的維護(hù)分支。該維護(hù)分支獨(dú)立于上面所創(chuàng)建的新版本分支。
●
為了能以維護(hù)分支為基礎(chǔ),在工作空間中對(duì)新版本分支進(jìn)行合適的前向修改,您可以通過(guò)使用Compare With | Another Branch
or Version…操作來(lái)確定這兩個(gè)分支之間的差別。在Compare視圖中,您可以手動(dòng)合并從維護(hù)分支到新版本分支的更改。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:56:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/8eab160264428f094afb512b.html
5.4.9 處理同一文件的并發(fā)更新
首先,我們討論一下一個(gè)被建議用來(lái)進(jìn)行修改操作的協(xié)
議。當(dāng)在工作空間中使用資源時(shí),您的操作是獨(dú)立于CVS資源庫(kù)的。因?yàn)榘l(fā)生在資源庫(kù)中的更改可能是在您不知道的情況下發(fā)生的,所以非常重要的一點(diǎn)是,如果
還未檢查資源庫(kù)中是否有更新取代了您的更改,那么您一定不要提交任何更改。Team |
Update…操作會(huì)用資源庫(kù)中那些取代了您的更改的任何更改來(lái)更新項(xiàng)目的本地副本。對(duì)于文本文件(包括Java類)來(lái)說(shuō),Team |
Update…操作會(huì)自動(dòng)對(duì)任何更改進(jìn)行合并(從資源庫(kù)到工作空間),即使這些更改可能造成沖突。在遇到?jīng)_突時(shí),合并操作會(huì)用特定的CVS標(biāo)記文本來(lái)標(biāo)識(shí)
文件中的沖突,以幫助您識(shí)別出沖突行。標(biāo)記文本并不是與任何類型的文件都兼容,例如它可能導(dǎo)致編譯錯(cuò)誤。
Update…
操作是一個(gè)非常強(qiáng)大的操作,我們?cè)诰毩?xí)時(shí)一定要小心。在下面這個(gè)例子中,Pat和Lynn更新了一個(gè)簡(jiǎn)單的文本文件。無(wú)需知道它,它們都對(duì)以“B”和
“C”開(kāi)始的行進(jìn)行了更新。標(biāo)記文本會(huì)對(duì)沖突的那些行以及引入了沖突的版本號(hào)(1.2)進(jìn)行了標(biāo)識(shí)。對(duì)于一個(gè)帶有眾多沖突的復(fù)雜Java文件來(lái)說(shuō),您可能
很難解決其中的沖突。
A is for apple
<<<<<<< sample.txt
B is for bird (updated by pat
)
C is for crow (updated by pat
)
=======
B is for bobcat (updated by lynn
)
C is for cow (updated by lynn
)
>>>>>>> 1.2
D is for dog
E is for excellent
F is for farm
G is for goat...
Team | Synchronize with
Repository…操作也支持更新,但是該操作不會(huì)自動(dòng)進(jìn)行更新。在執(zhí)行該操作后會(huì)顯示Synchronize視圖,并會(huì)列出工作空間副本和資源庫(kù)最
新資源之間那些不一致的資源。在Synchronize視圖中,您可以對(duì)這些差別進(jìn)行檢查,并決定所要采取的操作。由于Team |
Synchronize with Repository…操作可使您擁有更多的控制權(quán),所以我們建議您使用該操作來(lái)代替Update…操作。
下面總結(jié)一下文件并發(fā)更新的基本規(guī)則:在對(duì)工作空間
中的文件進(jìn)行修改之前,您必須用資源庫(kù)中的所有更改來(lái)更新工作空間中的資源。為了安全起見(jiàn),此時(shí)請(qǐng)使用Team | Synchronize with
Repository…操作。在Synchronize視圖中,您可執(zhí)行更新操作,還可提交更改,并可協(xié)調(diào)沖突。
5.4.10 使用CVS的Watch/Edit支持以避免對(duì)同一文件的并行更新
CVS
的Watch/Edit支持是Eclipse本身就提供的。如果您同意使用CVS的Watch/Edit支持,那么在提交資源時(shí),您和小組其他成員之間就
可以避免沖突。在啟用了CVS的Watch/Edit支持之后,您的項(xiàng)目小組可以更好地理解在所有具體項(xiàng)目中,當(dāng)前誰(shuí)正更新文件。相反,前面所討論的
CVS Annotate視圖為您所顯示的是先前的更改以及誰(shuí)做的更改。CVS的Watch/Edit支持是在項(xiàng)目層次上被啟用的。如果在Team |
CVS >Watch/Edit的首選項(xiàng)設(shè)置頁(yè)面中選中了Configure projects to use Watch/Edit on
checkout復(fù)選框,那么在項(xiàng)目被檢出時(shí),Watch/Edit支持將被自動(dòng)激活。您也可以通過(guò)設(shè)置項(xiàng)目的CVS屬性在受CVS管理的現(xiàn)有項(xiàng)目上啟用
Watch/Edit支持。在CVS的Watch/Edit支持被啟用時(shí),該項(xiàng)目中的文件處于只讀狀態(tài)。此時(shí),如果您在編輯器中打開(kāi)了某文件后又試圖對(duì)該
文件進(jìn)行修改,那么CVS服務(wù)器會(huì)被詢問(wèn)。在編輯文件時(shí),如果其他人也正在編輯該文件,那么就會(huì)出現(xiàn)一個(gè)對(duì)話框以通知您小組中其他成員也正在編輯該文件
(見(jiàn)圖5-9)。這時(shí),您可以繼續(xù)對(duì)該文件進(jìn)行編輯,但是在您提交該文件時(shí)需要進(jìn)行沖突管理。在文件被修改時(shí),檢查標(biāo)記修飾符
會(huì)被添加到該文件上。
圖5-9 顯示其他人正在編輯同一文件的對(duì)話框
在項(xiàng)目、文件夾以及文件上執(zhí)行Team |
Show Editors操作后會(huì)打開(kāi)CVS Editors視圖。CVS
Editors視圖中列出的是所有正在被其他人更新的資源(見(jiàn)圖5-10)。無(wú)論是否處于Watch/Edit的控制之下,您在任何項(xiàng)目及項(xiàng)目資源上都可
以使用Team | Show Editors操作。但是Team | Show
Editors操作只會(huì)對(duì)啟用了Watch/Edit支持的項(xiàng)目資源進(jìn)行標(biāo)識(shí)。
圖5-10 列出了哪個(gè)用戶正在更新文件夾中文件的CVS Editors視圖
您可以使用Team |
Edit操作來(lái)顯式地通知CVS服務(wù)器,讓CVS服務(wù)器知道您想對(duì)文件進(jìn)行更新。您還可以使用Team |
Unedit操作來(lái)通知CVS服務(wù)器,讓CVS服務(wù)器知道您不想再編輯該文件。這樣,您所做的任何更改都會(huì)被從CVS資源庫(kù)中檢出。表5-3給出了有關(guān)這
些操作的信息。在向CVS提交了更改之后,Watch/Edit列表中的資源會(huì)被隱式刪除掉。
Watch/Edit是一個(gè)非常有用的工具。但是該
工具的使用需要遵循一些規(guī)則,并要注意一些考慮事項(xiàng)。首先,如果要使Watch/Edit功能高效,那么小組中的每個(gè)成員都必須在存在潛在沖突的項(xiàng)目中啟
動(dòng)Watch/Edit功能。其次,您必須連接到CVS服務(wù)器上。如果您沒(méi)有和CVS服務(wù)器相連,并且想更新一個(gè)文件,那么您將不得不顯式地將該文件的只
讀狀態(tài)(從該文件的屬性頁(yè)面中可獲得該屬性)取消掉。當(dāng)然,該支持現(xiàn)在是折中的。這是因?yàn)椋瑳](méi)有任何人知道該更新,而且在提交過(guò)程中存在潛在的沖突。如果
您刪除了一個(gè)項(xiàng)目并且該項(xiàng)目資源的Watch/Edit首選項(xiàng)設(shè)置沒(méi)有被啟用,那么CVS服務(wù)器將不會(huì)被通知,并且CVS服務(wù)器會(huì)繼續(xù)向外報(bào)告您正在對(duì)這
些資源進(jìn)行編輯。如果您的小組計(jì)劃使用Watch/Edit支持,那么明智的做法是小組中所有人都啟用被標(biāo)注為Configure projects
to use Watch/Edit on checkout的CVS Watch/Edit首選項(xiàng)設(shè)置。
5.4.11 恢復(fù)被刪除的文件
有時(shí)候,在文件被刪除并且更改被提交給CVS后,您
可能需要恢復(fù)所刪除的文件。幸運(yùn)的是,CVS不會(huì)將所刪除的文件從該文件所在的資源庫(kù)中移除。您可以使用Team | Restore from
Repository操作來(lái)恢復(fù)所刪除的文件。如果被刪除的文件在資源庫(kù)中存在,那么您將看到一個(gè)對(duì)話框。在該對(duì)話框中,您可以選擇所要恢復(fù)的文件的具體
修訂版(見(jiàn)圖5-11)。而文件的最新修訂版則是一個(gè)對(duì)所刪除文件的引用。這是因?yàn)槲募h除是一個(gè)CVS修訂操作。
圖5-11 顯示可恢復(fù)的被刪除文件的Restore from Repository對(duì)話框
當(dāng)一個(gè)文件被恢復(fù)到工作空間中的時(shí)候,該文件被看作是一個(gè)新文件。在提交該文件之前或提交該文件時(shí),必須將該新文件添加到版本控制中。
5.4.12 其他CVS用戶界面元素
1. Checkout向?qū)?/h4>
在New wizard對(duì)話框中獲得的是CVS向?qū)е械臋z出項(xiàng)目。通常,您會(huì)使用CVS Repositories視圖來(lái)檢出項(xiàng)目。但是,有些CVS資源庫(kù)是不允許被瀏覽的。在這種情況下,檢出向?qū)Э赡芫捅容^有用。但是在這種情況下,您必須預(yù)先知道該項(xiàng)目的名稱。
2. CVS備忘單
若要打開(kāi)Cheat Sheet Selection對(duì)話框,則選擇Help | Cheat Sheets…命令。對(duì)于CVS任務(wù)來(lái)說(shuō),備忘單用來(lái)為分支和合并操作提供幫助。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:53:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/6d090c22ffe227f5d6cae22b.html
5.4.3 CVS Annotate視圖
CVS
Annotate視圖與CVS Repository Exploring透視圖中的CVS
Repositories視圖使用的是同一界面空間。CVS Annotate視圖用來(lái)標(biāo)識(shí)各版本文件中所添加的新行以及被更改過(guò)的行。CVS
Annotate視圖還會(huì)指出做出這次修改的是誰(shuí)。現(xiàn)在您知道是誰(shuí)做出了這些難以解釋的更新,或者是誰(shuí)應(yīng)該對(duì)這些難以解釋的更新負(fù)責(zé)。對(duì)于所選擇的任何版
本來(lái)說(shuō),文件中所添加的新行會(huì)在編輯器中突出顯示(見(jiàn)圖5-4)。若要打開(kāi)CVS Annotate視圖,則從CVS
Repositories視圖、CVS Resource History視圖的快捷菜單Team中選擇Show
Annotation操作。打開(kāi)CVS Annotate視圖的一種比較方便的方法是從Navigator透視圖或Package
Explorer視圖中所顯示的某一個(gè)文件上選擇Team | Show Annotation操作。在打開(kāi)CVS Repository
Exploring透視圖時(shí)會(huì)打開(kāi)CVS Annotate視圖,CVS Resource
History視圖,并且在編輯器中所打開(kāi)的文件的版本是最新的。CVS
Annotate視圖中的選擇操作會(huì)將編輯器復(fù)位到被更新的代碼行,并且相應(yīng)的版本會(huì)在CVS Resource
History視圖中突出顯示出來(lái)。相反,如果在編輯器中選擇了一行代碼,那么在CVS Repository
Exploring透視圖的那些視圖中就會(huì)適當(dāng)?shù)貙?duì)所更改的對(duì)象進(jìn)行突出顯示。現(xiàn)在您就可以非常容易地對(duì)任何文本文件的、詳細(xì)的更改歷史信息進(jìn)行檢查。
圖5-4 CVS Repository Exploring透視圖中的CVS Annotate視圖
5.4.4 CVS Resource History視圖
CVS Resource
History視圖可顯示某一具體文件的所有版本的詳細(xì)信息(見(jiàn)圖5-5)。CVS Resource History視圖是CVS
Repository Exploring透視圖的一部分。在CVS
Repositories視圖中先選擇一個(gè)文件,然后再在單擊右鍵所出現(xiàn)的快捷菜單中選擇Show in Resource
History命令,這樣您就可以看到該文件的歷史版本信息。在受CVS控制的項(xiàng)目上單擊鼠標(biāo)右鍵后所出現(xiàn)的Team快捷菜單項(xiàng)中也有Show in
Resource History命令。作為一種查看文件歷史的快速方法,您可以將受CVS控制的工作空間中的某一文件拖放到CVS Resource
History視圖以直接查看該文件的歷史信息。
圖5-5 CVS Resource History視圖
對(duì)于任何被選擇的修訂版本來(lái)說(shuō),與該修訂版本相關(guān)的
分支和版本標(biāo)記,連同該版本的文件被提交到資源庫(kù)時(shí)所提供的注釋,都會(huì)一起顯示在CVS Resource
History視圖的底部(見(jiàn)圖5-5)。通過(guò)在CVS Resource
History視圖的下拉菜單中進(jìn)行相應(yīng)選擇,我們可以隱藏該視圖中的“Tags”項(xiàng)和“Comment”項(xiàng)。
文件的歷史記錄可能比較長(zhǎng),這時(shí),您可以使用CVS Resource History視圖工具欄上的Filter History
按鈕來(lái)過(guò)濾CVS Resource History視圖。也可以根據(jù)作者、注釋值、日期變化等來(lái)對(duì)CVS Resource History視圖中的顯示內(nèi)容進(jìn)行過(guò)濾。CVS Resource History視圖工具欄上的Link with Editor操作
會(huì)使CVS Resource History視圖與當(dāng)前活動(dòng)編輯器(僅對(duì)CVS控制之下的文件)保持同步。
對(duì)于在CVS Resource History視圖中被選擇的那些版本來(lái)說(shuō),您對(duì)它們可以執(zhí)行的操作是依賴于資源是否已被復(fù)制到工作空間而發(fā)生變化的。這些操作被列在表5-2中。
表5-2 CVS Resource History視圖中的操作
操 作
|
描 述
|
Compare
|
該操作會(huì)對(duì)所選的兩個(gè)版本進(jìn)行相互比較
|
Get Contents
|
該操作會(huì)用所選版本的內(nèi)容來(lái)替換該資源的本地工作副本中的內(nèi)容
|
Get Sticky Revision
|
該
操作會(huì)將資源的本地工作副本還原為一個(gè)先前版本。本地副本會(huì)作為資源庫(kù)修訂版,并會(huì)保留相同的版本標(biāo)記。需要指出的是,只有在對(duì)CVS非常熟悉的情況下,
您才可以使用該操作。該操作的后果之一是,除非“sticky
revision”標(biāo)記被移走(直接使用CVS命令),否則您不能提交任何進(jìn)一步的修改。當(dāng)然,您可使用Replace With | Latest
from Repository操作返回到原版本。通常,除非您是一個(gè)熟練的CVS用戶,否則您可能不會(huì)對(duì)“sticky revision”標(biāo)記感興趣
|
Open
|
該操作會(huì)在編輯器中打開(kāi)所選的修訂版文件。這時(shí),您是不能對(duì)該版本文件作出任何更改的
|
(續(xù)表)
操 作
|
描 述
|
Refresh View
|
該操作會(huì)用CVS資源庫(kù)中的內(nèi)容來(lái)更新CVS Resource History視圖
|
Show Annotation
|
該操作會(huì)使Eclipe切換到CVS Repository Exploring透視圖,并使得CVS Annotate視圖變?yōu)楫?dāng)前焦點(diǎn)以顯示出所選文件的注釋
|
Tag with Existing…
|
該操作會(huì)將已有的資源庫(kù)版本或分支標(biāo)記應(yīng)用到所選的資源上。該操作是一個(gè)特殊的操作。請(qǐng)查看聯(lián)機(jī)幫助中的Moving Version Tags專題以獲得何時(shí)使用該操作的詳細(xì)信息
|
5.4.5 查看CVS命令
Eclipse
Console視圖可顯示出CVS與Eclipse之間的所有的命令和響應(yīng);在您碰到問(wèn)題的時(shí)候,該視圖是非常有用的。在Eclipse
Console視圖中還顯示了所發(fā)布的供用戶使用的任何Eclipse CVS操作的所有CVS命令。在Team | CVS |
Console首選項(xiàng)頁(yè)面中,您可以對(duì)該控制臺(tái)的外觀和行為進(jìn)行配置。
5.4.6 CVS是如何管理工作空間中項(xiàng)目的
圖5-6顯示了Package
Explorer視圖中一個(gè)處在CVS控制之下的項(xiàng)目。通過(guò)觀察圖標(biāo)上的標(biāo)記修飾符以及附加的文字信息,您可以很明顯地看出這一點(diǎn)。只有在啟用了
Workbench | Label Decorations首選項(xiàng)設(shè)置后,Eclipse才會(huì)在Package
Explorer視圖中顯示附加文字信息。對(duì)于那些受版本控制所有資源來(lái)說(shuō),在它們的資源圖標(biāo)上都有一個(gè)很小的磁盤(pán)標(biāo)志修飾符
。對(duì)于那些CVS所不知道的、被添加到項(xiàng)目中的文件來(lái)說(shuō),在這些文件的圖標(biāo)中也有一個(gè)很小的標(biāo)志修飾符
。
在如圖5-6所示的Package
Explorer視圖中,緊接著項(xiàng)目名后面的是該項(xiàng)目所屬CVS資源庫(kù)服務(wù)器的名稱(位于方括號(hào)中)。如果該項(xiàng)目是被作為一個(gè)分支部分來(lái)使用的,那么該分
支的名稱也會(huì)被包含在方括號(hào)中。文本修飾符>表明本地資源是一個(gè)傳出更改(outgoing
change),這就意味著該本地資源已經(jīng)在本地修改過(guò),并與CVS中相應(yīng)內(nèi)容不一致。Package
Explorer視圖中受CVS控制的文件夾(直至項(xiàng)目文件夾)也具有這個(gè)特征。資源名后面的圓括號(hào)中所顯示的文本表示的是該資源的文件格式(ASCII
格式或二進(jìn)制格式)。我們知道,對(duì)于ASCII文件來(lái)說(shuō),在CVS文件實(shí)例和本地文件實(shí)例之間的并行修改可被合并。而二進(jìn)制文件只能被替換。
圖5-6 Label Decorations首選項(xiàng)被啟用時(shí)受CVS控制的項(xiàng)目
在Team | CVS | Label Decorations首選項(xiàng)頁(yè)面中,您可以對(duì)CVS標(biāo)簽修飾的表示和規(guī)則進(jìn)行修改。
5.4.7 在Team快捷菜單中可獲得的CVS操作
Team菜單可從任何工作空間資源的快捷菜單中獲
得。有幾個(gè)CVS操作是與Team菜單相關(guān)的。我們將對(duì)使用CVS進(jìn)行工作維護(hù)中最常用的操作進(jìn)行總結(jié)。Team菜單下的具體子菜單隨著所選擇的是否是一
個(gè)項(xiàng)目而發(fā)生變化。只有在項(xiàng)目沒(méi)有被CVS或任何其他資源庫(kù)管理時(shí),所選擇的項(xiàng)目才會(huì)有一個(gè)Share
Project…操作。表5-3所提供的是一個(gè)所有CVS小組操作的參考列表。其中有些操作可能是您不熟悉的。我們將在本章后面對(duì)這些操作進(jìn)行討論。通常
情況下,您最常用的操作是Share Project…、Synchronize with
Repository…、Update…以及Commit…。Share
Project操作是一個(gè)允許您將項(xiàng)目加到CVS中的綜合性向?qū)А亩xCVS資源庫(kù)連接到提交項(xiàng)目資源之間的每一個(gè)步驟都包括在該向?qū)е小?/p>
表5-3 Team菜單中的CVS操作
操 作
|
描 述
|
Add to .cvsignore…
|
該
操作會(huì)將所選的項(xiàng)目文件排除在CVS管理之外。這些被排除的文件不會(huì)出現(xiàn)在Synchronize視圖之中,也不會(huì)被提交給CVS資源庫(kù)。CVS在您的項(xiàng)
目中維護(hù)了一個(gè)名為.cvsignore的文件。在該文件中會(huì)標(biāo)識(shí)出那些被排除的文件實(shí)例。一開(kāi)始,.cvsignore文件是不存在的;在該操作第一次
執(zhí)行時(shí),才會(huì)創(chuàng)建.cvsignore文件。您必須將.cvsignore文件添加到版本控制中,并在CVS中維護(hù)該文件
|
Add to Version Control
|
該操作會(huì)將所選文件置于CVS控制之下。典型情況下,在項(xiàng)目中創(chuàng)建新文件時(shí)會(huì)使用該操作。如果您沒(méi)有將資源顯式地添加到版本控制中,那么在執(zhí)行提交操作時(shí),Eclipse會(huì)對(duì)您作出提示
|
Apply Patch…
|
該操作將使用由Create Patch操作所創(chuàng)建的補(bǔ)丁文件來(lái)修補(bǔ)程序
|
Branch…
|
該操作會(huì)創(chuàng)建一個(gè)分支。這樣,項(xiàng)目(或所選資源)可獨(dú)立于其他開(kāi)發(fā)過(guò)程而被修改
|
Change ASCII/Binary
Property…
|
執(zhí)行該操作后會(huì)顯示Set Keyword Substitution向?qū)АT撓驅(qū)г试S您為所選文件選擇期望的CVS關(guān)鍵字替換模式。它對(duì)CVS如何解釋ASCII或二進(jìn)制文件進(jìn)行了定義
|
Commit…
|
如
果沒(méi)有沖突發(fā)生,該操作會(huì)使用您的本地更改來(lái)更新CVS資源庫(kù),并會(huì)提示您給出一個(gè)注釋。如果執(zhí)行該操作時(shí)所選擇的操作對(duì)象是一個(gè)項(xiàng)目或文件夾,那么項(xiàng)目
或文件夾中的所有被修改資源都將提交到CVS中。如果CVS中的相應(yīng)文件取代了所要提交的文件,那么Commit…操作將失敗
|
Create Patch…
|
該操作會(huì)基于本地資源和CVS之間的不同而創(chuàng)建一個(gè)補(bǔ)丁文件。其他人可共享該補(bǔ)丁文件。這就允許在資源庫(kù)之外共享您的工作
|
Disconnect…
|
該操作會(huì)在所選工作空間項(xiàng)目中刪除所有CVS連接信息
|
(續(xù)表)
操 作
|
描 述
|
Edit
|
該
操作只可用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目。該操作會(huì)通知CVS服務(wù)器,讓它知道您
正在更新該文件。如果有其他人(一個(gè)或多個(gè))正在編輯該文件,那么您將被提示,以就是否繼續(xù)該操作作出決定。此時(shí),您可忽略該提示并對(duì)文件進(jìn)行修改。但
是,在您試圖對(duì)修改進(jìn)行提交時(shí)可能會(huì)碰到?jīng)_突。如果您只是想先打開(kāi)所要編輯的文件,那么該文件會(huì)被打開(kāi)。但是在試圖對(duì)該文件進(jìn)行修改時(shí),您會(huì)得到相同的提
示。如果要使用外部編輯器,那么您首先必須要做的是取消該文件的只讀狀態(tài),然后再使用外部編輯器打開(kāi)該文件。在后面,我們會(huì)對(duì)該操作繼續(xù)進(jìn)行討論
|
Merge…
|
該操作會(huì)將某一具體分支中的修改合并回該分支之前的代碼庫(kù)中
|
Restore from
Repository…
|
對(duì)于那些被刪除的項(xiàng)目文件來(lái)說(shuō),如果它們?nèi)源嬖谟陧?xiàng)目中,并允許您將它們恢復(fù)回原工作空間,則執(zhí)行該操作后會(huì)列出這些被刪除的文件。在本章后面,我們將會(huì)對(duì)該操作進(jìn)行詳細(xì)討論
|
Share Project…
|
只有項(xiàng)目才能使用該操作。而且,只有在那些不受資源庫(kù)管理的項(xiàng)目上才可以看到該操作。執(zhí)行該操作后會(huì)顯示向?qū)АT谠撓驅(qū)е校梢酝瓿傻娜蝿?wù)有:將項(xiàng)目與一個(gè)可以使用的資源庫(kù)相關(guān)聯(lián),以及提交項(xiàng)目資源。其他資源庫(kù)提供程序也可能會(huì)使用該操作
|
Show Annotation
|
執(zhí)行該操作后將切換到CVS Repository Exploring透視圖,并會(huì)將焦點(diǎn)集中到CVS Annotate視圖以顯示出所選文件的注釋
|
Show Editors
|
該
操作適用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目中的文件夾和文件。在執(zhí)行該操作后會(huì)打開(kāi)
CVS編輯器視圖。在該視圖中會(huì)標(biāo)識(shí)出其他正在編輯該文件或該文件夾中內(nèi)容的用戶。只有那些啟用了Watch/Edit的項(xiàng)目才可能顯示在CVS編輯器視
圖中
|
Show in Repository
History
|
該操作為所選資源顯示CVS Repository History視圖
|
Synchronize with
Repository…
|
該
操作會(huì)將所選擇的文件與CVS資源庫(kù)中的對(duì)應(yīng)文件進(jìn)行比較,并切換到Team
Synchronizing透視圖。比較后所發(fā)現(xiàn)的任何差異都會(huì)顯示在Synchronize視圖中。對(duì)于項(xiàng)目或文件夾來(lái)說(shuō),在執(zhí)行該操作時(shí),它們里面所
包含的全部資源都將與CVS中的對(duì)應(yīng)資源進(jìn)行比較。而那些與CVS中對(duì)應(yīng)資源相比發(fā)生了變化的資源會(huì)被顯示在Synchronize視圖中。在您檢查所有
更改、與資源庫(kù)實(shí)例進(jìn)行比較,以及解決沖突時(shí),這是一種最安全的CVS使用方法
|
Tag as Version…
|
該操作會(huì)為所選項(xiàng)目、文件夾(或文件)以及所有的子文件資源的所有CVS實(shí)例添加版本標(biāo)志。您也可以在CVS Repositories視圖中進(jìn)行版本標(biāo)識(shí)
|
(續(xù)表)
操 作
|
描 述
|
Unedit
|
該
操作只可用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目文件。該操作會(huì)將您從當(dāng)前正在編輯某一文
件的那個(gè)用戶列表中刪除掉。執(zhí)行該操作后,您會(huì)從當(dāng)前活動(dòng)用戶列表中被刪除,并且所做的任何更改都會(huì)被取消,而所編輯的文件會(huì)恢復(fù)到執(zhí)行任何更新之前的內(nèi)
容。在向CVS提交文件時(shí),如果工作空間副本與服務(wù)器副本完全相同,那么Unedit操作會(huì)被隱式調(diào)用。在本章后面部分,我們還將對(duì)該操作進(jìn)行討論
|
Update…
|
該
操作會(huì)使用CVS中所有最新版本來(lái)更新本地資源。CVS中的更新將與本地資源(二進(jìn)制文件除外)進(jìn)行合并。建議您在使用Commit…操作前執(zhí)行
Update…操作。如果其他人在您的最近一次更新后又進(jìn)行了提交操作,那么您的提交操作將會(huì)失敗。建議您用Synchronize with
Repository…操作來(lái)代替Update…操作
|
5.4.8 Team Synchronizing透視圖和Synchronize向?qū)?/h3>
Team
Synchronizing透視圖是您對(duì)工作空間與CVS(其他資源庫(kù)提供程序可被集成到Team
Synchronizing透視圖中)進(jìn)行同步的大本營(yíng)。在選擇了Team | Synchronize with
Repository…操作后,您會(huì)被提示并切換到Team Synchronizing透視圖。在Team
Synchronizing透視圖中含有Synchronize視圖和一個(gè)編輯器區(qū)域。所有被打開(kāi)的編輯器都會(huì)顯示在該編輯器區(qū)域中。圖5-7所顯示的就
是一個(gè)Team
Synchronizing透視圖的例子。在Synchronize視圖中,您可以對(duì)本地項(xiàng)目和該項(xiàng)目的CVS副本之間的差別進(jìn)行觀察和操作。其他想使用
該透視圖的資源庫(kù)提供程序也可使用該視圖。在打開(kāi)一個(gè)文件的同時(shí),Eclipse也會(huì)打開(kāi)一個(gè)適當(dāng)?shù)谋容^編輯器(文本、Java、XML或圖像)。在比較
編輯器中會(huì)顯示出工作空間文件和CVS中該文件的最新版本之間的差別。這樣,您就可以在將文件提交到CVS之前瀏覽和最終確定該文件的內(nèi)容。
在Synchronize視圖的工具欄上有如下一組按鈕:Incoming Mode
(從CVS中更新)、Outgoing Mode
(提交到CVS)、Incoming and Outgoing Mode
以及Conflicts Mode
。
通過(guò)使用上述按鈕,您可以對(duì)同步信息進(jìn)行過(guò)濾。在使用了Incoming
Mode按鈕后,您會(huì)看到有哪些操作正在進(jìn)行。如果小組中只有您一個(gè)人,那么可能只有Outgoing
Mode按鈕才是您感興趣的。若要接受所有的傳入更改,則使用Synchronize視圖工具欄上的Update All Incoming
Changes…按鈕
。若要提交您的所有更改,則使用Synchronize視圖工具欄上的Commit All Outgoing Changes…按鈕
。工具欄操作Pin Current Synchronization
允
許您對(duì)先前同步中所使用的一組資源進(jìn)行引用。Synchronize視圖的工具欄上的這些按鈕允許您通過(guò)工作集來(lái)過(guò)濾內(nèi)容。您可對(duì)比較標(biāo)準(zhǔn)進(jìn)行調(diào)整,并可
使用Layout菜單在樹(shù)、壓縮文件夾以及提交集(Commit
Set)之間進(jìn)行視圖切換。提交集允許您查看資源庫(kù)更改。這些更改會(huì)按照提交者、注釋和提交日期來(lái)分類顯示。在確定傳入更改集的更詳細(xì)信息時(shí),這種分類非
常有用。Synchronize視圖擁有自己的Preferences對(duì)話框。在Synchronize視圖的菜單中,您可以打開(kāi)該
Preferences對(duì)話框。在Synchronize視圖的菜單中,您還可以執(zhí)行Schedule…操作。該操作允許您按照所選擇的某一重復(fù)進(jìn)度來(lái)自
動(dòng)執(zhí)行資源庫(kù)的同步操作。
圖5-7 顯示傳入更改和傳出沖突文件三方比較的Team Synchronizing透視圖
1. Synchronize向?qū)?/h4>
從工作臺(tái)工具欄(或Synchronize視圖菜單欄)的下拉菜單中選擇Synchronize…操作
后
會(huì)出現(xiàn)Synchronize向?qū)АT赟ynchronize向?qū)е校梢詫?duì)要與CVS(以及其他那些被允許使用Eclipse小組同步支持的資源庫(kù)提
供程序)進(jìn)行同步的項(xiàng)目進(jìn)行選擇。如圖5-8所示,您可對(duì)工作空間、所選資源或者一個(gè)工作集進(jìn)行同步。在Synchronize向?qū)ЫY(jié)束后,您會(huì)返回到
Team Synchronizing透視圖。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:50:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/b66d38afeb3688ca7dd92a2a.html
Eclipse中的CVS用戶界面
現(xiàn)在,您已經(jīng)對(duì)CVS有了一個(gè)基本的理解。接下來(lái),
我們將討論Eclipse是如何為CVS使用者提供幫助的。在對(duì)其進(jìn)行討論之前,先略為詳細(xì)地看一下Eclipse的CVS用戶界面。在開(kāi)始之
前,Eclipse的CVS用戶界面是毫無(wú)價(jià)值的。這是因?yàn)椋cEclipse中的很多操作相似,大多數(shù)的CVS資源庫(kù)訪問(wèn)操作都在后臺(tái)運(yùn)行,這些操作不
會(huì)對(duì)其他操作造成妨礙。諸如檢出、提交、同步等可能需要長(zhǎng)時(shí)間運(yùn)行的操作并不會(huì)對(duì)您所要完成的其他任務(wù)造成妨礙。在下面所給出的這個(gè)簡(jiǎn)短列表中,列出了在
Eclipse用戶界面中使用CVS時(shí)會(huì)碰到的最常見(jiàn)任務(wù)。在練習(xí)5中,您會(huì)實(shí)踐所有這些任務(wù)。
● 定義到CVS資源庫(kù)的連接。
● 瀏覽CVS資源庫(kù)。
● 將新的工作空間項(xiàng)目定義到CVS中。
● 從CVS中檢出已有項(xiàng)目。
● 將工作空間中的更改提交給CVS。
● 使用CVS中的最新版本來(lái)更新自己的工作空間項(xiàng)目。
● 在合適的里程碑處進(jìn)行版本設(shè)置。
● 用資源庫(kù)中的資源來(lái)比較或替換工作空間中的資源。
5.4.1 CVS Repository Exploring透視圖:資源庫(kù)主頁(yè)
如圖5-1所示的CVS Repository
Exploring透視圖是在Eclipse中使用CVS的大本營(yíng)。在該透視圖中含有CVS Repositories視圖、CVS Resource
History視圖以及編輯器區(qū)域。在CVS Repositories視圖中會(huì)顯示出您的工作空間所知道的CVS資源庫(kù)。而在CVS
Resource History視圖中所顯示的則是受CVS控制的任何已知文件的修改歷史記錄。在CVS Repository
Exploring透視圖中,您可以建立與CVS服務(wù)器的連接。
5.4.2 CVS Repositories視圖
CVS
Repositories視圖扮演著資源庫(kù)瀏覽器的角色。在CVS
Repositories視圖中,您可以對(duì)資源庫(kù)中存在的項(xiàng)目進(jìn)行選擇,并可將這些項(xiàng)目檢出到工作空間中。如圖5-1所示,CVS
Repositories視圖位于CVS Repository Exploring透視圖的左邊窗格中。通過(guò)使用快捷菜單New |
Repository Location...或選擇Add CVS Repository
命
令,您可以在自己的工作空間中定義CVS資源庫(kù)的位置。Eclipse支持各種類型的CVS連接(見(jiàn)圖5-2)。在CVS
Repositories視圖中,您可以定義多個(gè)CVS資源庫(kù)。在瀏覽資源庫(kù)時(shí),您可以看到資源庫(kù)中的內(nèi)容。如圖5-1所示,這些內(nèi)容包括HEAD、
Branches、versions目錄中的項(xiàng)目以及Dates條目。您可展開(kāi)目錄樹(shù)或使用工具欄中的Go Into
和Back
操作來(lái)往下一直看到具體文件。在工具欄上有一個(gè)Refresh View
操作,由于CVS Repositories視圖不會(huì)與資源庫(kù)中的內(nèi)容更改自動(dòng)保持一致,所以在做任何重要操作之前,您可能要使用Refresh View
按鈕來(lái)刷新CVS Repositories視圖。
出于方便的考慮,如果您從Resource透視圖中打開(kāi)了CVS Repositories視圖,那么該視圖將作為一個(gè)選項(xiàng)卡式視圖顯示在Navigator透視圖的旁邊。
在CVS Repositories視圖中,一個(gè)最常見(jiàn)的任務(wù)是從資源庫(kù)中將項(xiàng)目檢出到您的工作空間中。要完成上述任務(wù),請(qǐng)先在Branches、HEAD或Versions下選擇一個(gè)項(xiàng)目,然后再在單擊鼠標(biāo)右鍵后所出現(xiàn)的快捷菜單中選擇Check Out命令。
圖5-1 CVS Repository Exploring透視圖
圖5-2 在工作空間中定義新的CVS資源庫(kù)位置
在第一次展開(kāi)CVS
Repositories視圖中的Branches目錄時(shí),您會(huì)看到該目錄中沒(méi)有任何內(nèi)容。在使用了快捷菜單操作Refresh
Branches…后會(huì)出現(xiàn)Refresh Branches對(duì)話框(見(jiàn)圖5-3)。在Refresh
Branches對(duì)話框中,您可以為一個(gè)或多個(gè)資源庫(kù)項(xiàng)目執(zhí)行CVS中的分支標(biāo)記檢索請(qǐng)求。CVS資源庫(kù)中可以包含大量分支。而您可能僅對(duì)其中的部分分支
感興趣。在Refresh Branches對(duì)話框中,您可以對(duì)要進(jìn)行分支標(biāo)記信息檢索的項(xiàng)目進(jìn)行選擇。在表5-1所示的參考列表中,列出了CVS
Repositories視圖中的所有可用的快捷菜單操作。其中有些操作依賴于您在圖5-3的第3個(gè)欄目中的選擇。一開(kāi)始,您可能需要使用以下這些操
作:New | Repository Location…、Check Out…、Compare with…以及Show in Resource
History。現(xiàn)在,您不必理解這些操作,它們僅為您提供一個(gè)參考。
圖5-3 Refresh Branches對(duì)話框
表5-1 在CVS Repositories視圖中可使用的上下文操作
操 作
|
描 述
|
從快捷菜單中可獲得該命令
|
Add to Branch
List…
|
將一個(gè)項(xiàng)目(但不包括該項(xiàng)目的內(nèi)容)添加至一個(gè)新的或已經(jīng)存在的分支上。該操作可代替Team | Branch操作。對(duì)于那些將在一個(gè)分支中單獨(dú)開(kāi)發(fā)的新項(xiàng)目來(lái)說(shuō),該操作是比較有用的
|
被選擇的項(xiàng)目
|
Check Out
|
把從資源庫(kù)中所選擇的內(nèi)容復(fù)制到自己的工作空間中。而且文件夾可被檢出,同時(shí)該文件夾與項(xiàng)目的一致性會(huì)得到維護(hù)。對(duì)于含有獨(dú)立部分的大型項(xiàng)目來(lái)說(shuō),該操作非常有用
|
被選擇的項(xiàng)目,以及在Branches、HEAD或Versions下所選擇的項(xiàng)目文件夾
|
Check Out As…
|
把從資源庫(kù)中所選擇的內(nèi)容復(fù)制到自己的工作空間中,并以另外一個(gè)名稱來(lái)命名。在對(duì)所做的更改進(jìn)行提交時(shí),該項(xiàng)目保持它在CVS中的初始一致性。當(dāng)需要在工作空間中同時(shí)擁有某一項(xiàng)目的多個(gè)實(shí)例時(shí),該操作非常有用
|
被選擇的項(xiàng)目,以及在Branches、HEAD或Versions下所選擇的項(xiàng)目文件夾
|
(續(xù)表)
操 作
|
描 述
|
從快捷菜單中可獲得該命令
|
Compare
|
在選擇了兩個(gè)資源庫(kù)文件后,執(zhí)行該操作會(huì)顯示出Compare視圖
|
兩個(gè)被選擇的資源庫(kù)
|
Compare With…
|
該操作會(huì)打開(kāi)Compare with Branch or Verson對(duì)話框,并允許您將所選資源與Branches、HEAD或Versions中的資源進(jìn)行比較
|
被選擇的資源
|
Configure Branches and
Versions…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框。在所顯示的對(duì)話框中會(huì)顯示出資源中的分支或版本標(biāo)記。而對(duì)話框中所顯示的那些標(biāo)記會(huì)顯示在CVS Repositories視圖中
|
各種對(duì)象
|
Copy to Clipboard
|
將連接字符串復(fù)制到寫(xiě)字板上。例如:pserver: anonymous@dev.eclipse.org:/home/eclipse
|
被選擇的資源庫(kù)
|
Discard location
|
從CVS Repositories視圖中刪除所選資源庫(kù)的位置定義
|
被選擇的資源庫(kù)
|
New | Date Tag…
|
執(zhí)行該操作后會(huì)顯示出一個(gè)對(duì)話框以創(chuàng)建新的日期標(biāo)記
|
被選擇的資源庫(kù),在CVS Repositories視圖中所選擇的Dates條目
|
New | Repository Location…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框以定義新的CVS資源庫(kù)位置。另外還可獲得一個(gè)工具欄圖標(biāo)
|
任何對(duì)象
|
Open
|
執(zhí)行該操作后會(huì)在編輯器中打開(kāi)所選文件的最新版本
|
被選擇的文件
|
Properties
|
顯示所選資源庫(kù)的屬性及其連接信息
|
被選擇的資源庫(kù)
|
Refresh Branches…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框以允許您發(fā)現(xiàn)一個(gè)或多個(gè)項(xiàng)目的分支
|
在CVS Repositories視圖中所選擇的Branches條目,被選擇(或沒(méi)有被選擇)的資源庫(kù)位置
|
Refresh View
|
使用資源庫(kù)的當(dāng)前信息來(lái)刷新CVS Repositories視圖
|
各種對(duì)象
|
Remove
|
將所選的日期標(biāo)記從CVS Repositories視圖刪除掉
|
被選擇的日期標(biāo)記
|
Show Annotation
|
該操作會(huì)為所選文件顯示CVS Annotate視圖
|
被選擇的文件
|
Show In Resource History
|
該操作會(huì)在CVS Resource History視圖中顯示所選文件的版本歷史信息
|
被選擇的文件
|
Tag As Version…
|
將一個(gè)版本標(biāo)記應(yīng)用到所選的資源及其子資源上
|
被選擇的資源
|
Tag With
Existing…
|
該操作會(huì)將一已有的資源庫(kù)版本或分支標(biāo)記應(yīng)用到所選的資源上。這是一個(gè)比較特殊的操作。有關(guān)何時(shí)使用該操作的更多信息請(qǐng)參見(jiàn)聯(lián)機(jī)幫助中的Moving Version Tags專題
|
被選擇的資源
|
作者:caoyinghui1986 發(fā)表于2009-8-28 21:47:00
原文鏈接
原文地址:http://hi.baidu.com/xublog/blog/item/6579e60e8364fdcc7bcbe19e.html
版本控制在團(tuán)隊(duì)開(kāi)發(fā)中是必不可少的。CVS是優(yōu)秀的開(kāi)源版本控制軟件,Eclipse本身就內(nèi)置了對(duì)CVS的支持,只需簡(jiǎn)單配置,即可使用CVS。
首先我們要正確安裝并配置好CVS服務(wù)器,通常Linux Server都自帶CVS服務(wù),不過(guò)命令行操作比較繁瑣。Windows下也有簡(jiǎn)單易用的CVS服務(wù)器,這里我們推薦CVSNT,可以下載CVSNT 2.0.51a,安裝并啟動(dòng)CVSNT:
然后切換到Repositories面板,添加一個(gè)Repository,命名為/cvs-java,CVSNT會(huì)提示是否初始化這個(gè)Repository,選擇是:
然后在Advanced面板上選中“Pretend to be a Unix CVS version”:
然后,在Windows賬戶中為每一個(gè)開(kāi)發(fā)人員添加用戶名和口令。
現(xiàn)在,CVSNT的安裝配置已經(jīng)完成,下一步,啟動(dòng)Eclipse,我們可以使用原有的Hello工程,或者新建一個(gè)Project,然后選擇菜單
Window->Show View->Other,打開(kāi)CVS->CVS Repositories:
然后點(diǎn)擊按鈕
,添加一個(gè)Repository:
注意用戶名和口令直接填Windows的用戶名和口令,然后選中“Validate Connection on Finish”,點(diǎn)擊Finish完成:
首先,我們要將一個(gè)現(xiàn)有的工程放到CVS服務(wù)器中,切換到Package Explorer,選中Hello工程,右鍵點(diǎn)擊,選擇Team->Share Project…:
使用剛才我們添加的Repository,繼續(xù),并將所有文件都添加到CVS中,最后Eclipse提示Commit:
填入一個(gè)簡(jiǎn)單的注釋,確定,然后Eclipse會(huì)把整個(gè)工程提交到CVS服務(wù)器,可以在Package
Explorer中看到圖標(biāo)發(fā)生了變化,Hello.java文件后面會(huì)有版本號(hào)1.1。在CVS
Repositories面板中刷新,可以看到剛添加進(jìn)來(lái)的工程:
在團(tuán)隊(duì)開(kāi)發(fā)中,當(dāng)創(chuàng)建了一個(gè)基本的工程并提交到CVS后,別的開(kāi)發(fā)人員首先要Check
Out這個(gè)工程到各自的本地計(jì)算機(jī)上,這里為了演示,首先我們?cè)赑ackage Explorer中刪除Hello工程,然后打開(kāi)CVS
Repositories(如果沒(méi)有看到Repository就按照上面的方法添加Repository),選擇Hello工程,右鍵點(diǎn)擊,選擇
Check Out As…:
作為一個(gè)Project簽出,就可以在Package Explorer中看到簽出的工程。
當(dāng)對(duì)某些源文件作了修改后,需要提交更改到CVS服務(wù)器。選中更改的文件或工程,右鍵點(diǎn)擊,選擇Team->Commit…:
然后填入簡(jiǎn)單的注釋,就可以提交到CVS服務(wù)器上了,可以看到源文件的版本號(hào)變成了1.2。
以上簡(jiǎn)單介紹了如何搭建CVS服務(wù)器以及在Eclipse中如何使用CVS,可以參考CVS手冊(cè)以便了解Branch、Merge等更多功能的使用。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:40:00
原文鏈接
曾因項(xiàng)目的迫切需要計(jì)劃開(kāi)發(fā)一打包軟件,最終卻夭折。現(xiàn)在回想多有遺撼。不得不令我反思當(dāng)中的教訓(xùn)。
我認(rèn)為要想開(kāi)發(fā)一個(gè)成功的軟件兩個(gè)大的環(huán)境是必不可少的,一個(gè)是外部環(huán)境,包括公司的支持,領(lǐng)導(dǎo)的鼓勵(lì)和擁有一個(gè)穩(wěn)定的,成熟的項(xiàng)目團(tuán)隊(duì),相對(duì)穩(wěn)定的用戶群體。還有一個(gè)是對(duì)軟件本身的規(guī)劃,包括對(duì)需求的明確,系統(tǒng)的架構(gòu),工作量的評(píng)估,明確的項(xiàng)目計(jì)劃和有序的計(jì)劃執(zhí)行。
打包工具的失敗就是一個(gè)印證。
打包工具的構(gòu)想是源于項(xiàng)目中,繁鎖的,重復(fù)的人工打包操作,包括從配置庫(kù)一下代碼,編譯,打包,上傳FTP等操作,由于打包后進(jìn)行問(wèn)題驗(yàn)證時(shí)又時(shí)常出問(wèn)題,所以該過(guò)程不得反復(fù)多次執(zhí)行。執(zhí)行過(guò)程中又難免出現(xiàn)放錯(cuò)文件,漏打文件等不必要的錯(cuò)誤從而嚴(yán)重影響項(xiàng)目進(jìn)度。
打包工具就是為解決打包過(guò)程中的繁鎖操作,提供可視化界面,為打包提供一鍵式操作。一開(kāi)始構(gòu)想時(shí)好的。但是一開(kāi)始也是錯(cuò)的,因?yàn)榇虬ぞ咭婚_(kāi)始就缺乏一個(gè)可供運(yùn)作的外部環(huán)境。公司不知道有這個(gè)項(xiàng)目的存在,或許還稱不上是一個(gè)項(xiàng)目,因?yàn)樗皇俏覀€(gè)人提出的一個(gè)優(yōu)化項(xiàng)目流程的簡(jiǎn)單方案。但是也由于這個(gè)問(wèn)題,為項(xiàng)目的失敗埋下了一個(gè)定時(shí)炸彈。
開(kāi)始對(duì)項(xiàng)目進(jìn)行簡(jiǎn)單的規(guī)劃后,包括簡(jiǎn)單的需求分析,系統(tǒng)的架構(gòu)。沒(méi)有正式的文檔,也沒(méi)有對(duì)文檔進(jìn)行評(píng)審和風(fēng)險(xiǎn)評(píng)估。就開(kāi)始著手開(kāi)發(fā)了。開(kāi)發(fā)過(guò)程中不斷的變更架構(gòu)(因?yàn)橐婚_(kāi)始就沒(méi)有一個(gè)好的架構(gòu)),不斷的變更需求(雖然需求是自己做的),沒(méi)改一個(gè)地方,對(duì)代碼都是翻天覆地的變化,當(dāng)中的辛酸或許只有我自己才能體會(huì)。先拋開(kāi)架構(gòu)不說(shuō),為什么自己做的需求,自己開(kāi)發(fā),需求都還會(huì)變呢?那是因?yàn)樵陂_(kāi)發(fā)過(guò)程中,你站在用戶的角度一想,發(fā)現(xiàn)那樣做確實(shí)不當(dāng),得改。這就告訴我們問(wèn)題越早發(fā)現(xiàn),就越容易被解決。想想如果該需求是在需求文檔中詳細(xì)體現(xiàn)出來(lái),在需求評(píng)審的時(shí)候被發(fā)現(xiàn),那改改文檔也就了事了,等到了開(kāi)發(fā)時(shí)才發(fā)現(xiàn)這個(gè)問(wèn)題,想想那個(gè)時(shí)候去改那又會(huì)有多大的改動(dòng)。這也告訴我們好的文檔不僅能有效的指導(dǎo)開(kāi)發(fā),提高質(zhì)量。也能更及時(shí)的發(fā)現(xiàn)問(wèn)題,避免不必要的改動(dòng)。更是后期維護(hù)升級(jí)的一個(gè)依據(jù)。
當(dāng)然這些變化還不足以讓一個(gè)項(xiàng)目夭折。打包工具一開(kāi)始規(guī)劃其中一部份包含了對(duì)開(kāi)發(fā)人員的代碼進(jìn)行檢視等功能,但由于公司推出了一個(gè)工具已經(jīng)具備這一功能,使得打包工具的這一需求已不在具備這一用戶群體。所以穩(wěn)定的用戶群體在一個(gè)軟件開(kāi)發(fā)過(guò)程中也是一個(gè)不可忽視的環(huán)節(jié)。
在項(xiàng)目開(kāi)發(fā)到中期,我被分配到一個(gè)實(shí)際項(xiàng)目中,由于沒(méi)有多余的時(shí)間來(lái)做這個(gè)不被重視的工具,打包工具開(kāi)始慢慢夭折。從這個(gè)事分析,我個(gè)人其實(shí)也算是這個(gè)項(xiàng)目的一個(gè)穩(wěn)定項(xiàng)目團(tuán)隊(duì)。我被分配到其它項(xiàng)目中就算是為這個(gè)穩(wěn)定的團(tuán)隊(duì)帶來(lái)了不穩(wěn)定因素。結(jié)果導(dǎo)致項(xiàng)目夭折。可見(jiàn)一個(gè)穩(wěn)定的,成熟的項(xiàng)目團(tuán)隊(duì)在項(xiàng)目中的重要性。
這個(gè)項(xiàng)目雖然失敗了,但我從中吸取了很多教訓(xùn)。如果再給我一次機(jī)會(huì)來(lái)做這個(gè)項(xiàng)目,有幾個(gè)事情我必須得做。
1,向公司審請(qǐng),將該項(xiàng)目作為公司內(nèi)部項(xiàng)目正式立項(xiàng)。確保有一個(gè)穩(wěn)定的外部環(huán)境。
2,向廣大用戶(開(kāi)發(fā)人員)收集需求,整理形成軟件的基本規(guī)格。
3,明確制定項(xiàng)目計(jì)劃,有組織,有目地的進(jìn)行研發(fā)。
4,根據(jù)基本規(guī)格編寫(xiě)需求文檔,明確功能點(diǎn),進(jìn)行大眾評(píng)審,及時(shí)發(fā)現(xiàn)問(wèn)題。
5,制定詳細(xì)的架構(gòu)規(guī)劃。進(jìn)行評(píng)審。
6,協(xié)調(diào)有扎實(shí)功底的開(kāi)發(fā)人員,確保技術(shù)難題被攻破
7,協(xié)調(diào)有豐富經(jīng)驗(yàn)的測(cè)試人沒(méi),保證版本質(zhì)量
作者:caoyinghui1986 發(fā)表于2009-8-28 21:27:00
原文鏈接
Create DataBase SHOPPING;
go
use SHOPPING;
go
/*==============================================================*/
/* Table: CATEGORIES */
/*==============================================================*/
create table CATEGORIES (
CATEGORY_ID bigint identity,
CATEGORY_NAME varchar(100) not null,
CATEGORY_DESCN varchar(500) null,
constraint PK_CATEGORIES primary key (CATEGORY_ID)
)
go
/*==============================================================*/
/* Table: PRODUCTS */
/*==============================================================*/
create table PRODUCTS (
PRODUCT_NO varchar(10) not null,
CATEGORY_ID bigint not null,
PRODUCT_NAME varchar(300) not null,
PRODUCT_PRICE float not null,
PHOTO_PATH varchar(100) null,
PRODUCT_DESCN varchar(2000) null,
constraint PK_PRODUCTS primary key (PRODUCT_NO)
)
go
/*==============================================================*/
/* Table: PRODUCT_SUPPLY */
/*==============================================================*/
create table PRODUCT_SUPPLY (
SUPPLY_NO varchar(10) null,
PRODUCT_NO varchar(10) null
)
go
/*==============================================================*/
/* Table: SUPPLIERS */
/*==============================================================*/
create table SUPPLIERS (
SUPPLY_NO varchar(10) not null,
SUPPLY_NAME varchar(200) not null,
SUPPLY_DESCN varchar(400) null,
constraint PK_SUPPLIERS primary key (SUPPLY_NO)
)
go
/*==============================================================*/
/* Create Relation */
/*==============================================================*/
alter table PRODUCTS
add constraint FK_PRODUCTS_REFERENCE_CATEGORI foreign key (CATEGORY_ID)
references CATEGORIES (CATEGORY_ID)
go
alter table PRODUCT_SUPPLY
add constraint FK_PRODUCT__REFERENCE_PRODUCTS foreign key (PRODUCT_NO)
references PRODUCTS (PRODUCT_NO)
go
alter table PRODUCT_SUPPLY
add constraint FK_PRODUCT__REFERENCE_SUPPLIER foreign key (SUPPLY_NO)
references SUPPLIERS (SUPPLY_NO)
go
創(chuàng)建數(shù)據(jù)庫(kù)腳本的
PRODUCTS(產(chǎn)品表) 和 CATEGORIES(類別表)一對(duì)多 PRODUCT_SUPPLY 為中間表 SUPPLIERS(供貨商表) 和 PRODUCTS 為多對(duì)多的關(guān)系。
products 表 hbm.xml
<many-to-one name="category" class="Category" cascade="save-update">
<column name="CATEGORY_ID" />
</many-to-one>
<!--多對(duì)多的關(guān)系中table指向的是中間表-->
<set name="supplys" table="PRODUCT_SUPPLY" cascade="save-update">
<!--key指向的是外鍵-->
<key column="PRODUCT_NO"></key>
<!--column對(duì)應(yīng)中間表中的外鍵-->
<many-to-many class="Supply" column="SUPPLY_NO"></many-to-many>
</set>
category 表 hbm.xml
<set name="productes" table="productes" cascade="save-update" inverse="true">
<!--key指向的是外鍵-->
<key column="CATEGORY_ID"></key>
<one-to-many class="Product"/>
</set>
supply 表 hbm.xml
<set name="products" table="PRODUCT_SUPPLY" inverse="true" cascade="save-update">
<key column="SUPPLY_NO"></key>
<many-to-many class="Product" column="PRODUCT_NO"></many-to-many>
</set>
1, 添加一個(gè)的新商品名稱為”Compaq 2620” 該商品屬于“筆記本”類別 由當(dāng)前所有的提供商提供貨源
List list = session.createQuery("from Supply").list(); Category c = (Category) session.get(Category.class, new Long(1)); product.setCategory(c); product.setSupplys(new HashSet(list)); session.save(product);
2, 查詢編號(hào)為” S0001”的提供商提供的所有商品 //通過(guò)隱式內(nèi)連接導(dǎo)航 List list = session.createQuery("from Product p where p.supplys.supply_no='S0001'").list(); 隱式內(nèi)連接導(dǎo)航 要注意的一個(gè)問(wèn)題是 從many端到 one 端 可以無(wú)限導(dǎo)航 但從one到many端只能導(dǎo)航一級(jí)
3,查詢編號(hào)為”S0002”的提供商提供的所有商品所涉及的類別 session.createQuery("from Category c where c.productes.product_no in (select p.product_no from Product p where p.supplys.supply_no='S0002' ) ").list(); 用到子查詢
4,查詢名稱為”TCL SHE8533”的商品的每個(gè)提供商的編號(hào)、名稱(部分屬性查詢) session.createQuery("select s.supply_no,s.supply_name from Supply s where s.products.product_name='TCL SHE8533'").list(); //投影查詢。如果想將查詢出來(lái)的 結(jié)果封裝成對(duì)象 用 select new package.Temp(s.a,s.b...) from .... Temp提供相應(yīng)的構(gòu)造方法包含可選的字段注意帶包名。
5, 查詢多于3種商品的類別信息(使用size函數(shù)處理) session.createQuery("from Category s where s.productes.size>3").list(); 注意其中的 size 表示的是 商品類別中產(chǎn)品數(shù)量多于3的類別。size用來(lái)處理集合中的大小
6,查詢至少有一個(gè)商品的類別信息(使用exists處理) session.createQuery("from Category c where exists( from c.productes) ").list();
7,查詢可以提供某種商品的供應(yīng)商信息(使用elements處理) session.createQuery("from Supply s where :product in elements(s.products) ")..setParameter("product", product).list(); product為 一個(gè) 對(duì)象 。 product in elements(s.products) 表示這個(gè)對(duì)象是否在這個(gè)集合中
8,使用本地SQL,顯示所有商品的商品名、價(jià)格以及類別信息,并降序排列。 session.createSQLQuery("select p.PRODUCT_NAME,p.PRODUCT_PRICE ,c.* from PRODUCTS p ,CATEGORIES c where p.CATEGORY_ID = c.CATEGORY_ID order by p.PRODUCT_PRICE desc") 的到的 集合中是個(gè) Object[]; 如果想返回對(duì)象 可以用 命名sql并在配置文件中指定返回的對(duì)象類型。
9 分頁(yè)查詢 :將商品按價(jià)格升序排列后,取第三頁(yè)的記錄,(每頁(yè)顯示2條記錄) Query query = session.createQuery("from Product p order by p.product_price ") .setFirstResult(2*(3-1)) .setMaxResults(2);
10,查詢所有類別的名字,及該類別包含的商品數(shù)量 (使用group by ,count函數(shù)) session.createQuery("select max(c.category_name), count(p) from Category c inner join c.productes p group by c.category_id ") 還有一種簡(jiǎn)單的方式就是 "select c.category_name, c.products.size from Category c "
11,批處理: 將某個(gè)類別下的商品修改為現(xiàn)有的另一個(gè)類別。 int count = session.createQuery("update Product p set p.category=:category where p.category.category_id='1'") .setParameter("category",c ).executeUpdate(); c為加載的一個(gè)新的類別
12,往數(shù)據(jù)庫(kù)中初始化3個(gè)名稱相同的商品(其他字段自行設(shè)置)。 要求:查詢所有商品,如果多個(gè)商品的名稱相同,則取其中任意一個(gè)完整的商品信息
hql = "from Prodcut pp where pp.product_no in (select max(p.category_id) from Product p group by p.product_name") ; 注意后面的一個(gè) 小技巧。 由于group by 后只能包含 group by字段和聚合函數(shù) 所以如果我想?yún)^(qū)別的字段似乎不可能 。但我們不妨將你要取的那個(gè)字段也加個(gè)聚合函數(shù)min 或 max 這樣就可以取出你要的 任意字段了。適應(yīng)sql sql2000中不妨 在pubs 下運(yùn)行 select max(title_id) as 編號(hào) ,count(type) as 數(shù)量, type from titles group by type 看看結(jié)果就知道了 雖然只 group by 了 type但 還是可以得到title_id
作者:caoyinghui1986 發(fā)表于2008-6-15 12:39:00
原文鏈接
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script> //供DEMO02_01頁(yè)面的關(guān)閉按鈕調(diào)用 function myFunction(v){ //alert("這里是父窗口中的函數(shù)"+v); document.getElementById("parentText").value=v; }
//打開(kāi)新窗口 function openNewWindow(){ window.open("DEMO02_01.html","","height=300;width=300;location=0;status =0;toolbar=0");
}
</script> </head>
<body>
<button onclick="openNewWindow();">打開(kāi)新窗口</button> <hr> 此文本框的值要從子窗口中取得 <input type="text" id="parentText"> </body> </html>
DEMO02_01.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script> function funClose(){ //:調(diào)用父窗體(DEMO02.html)中的myFunction 函數(shù) //window.opener獲得父窗口的window對(duì)象的引用 并調(diào)用 myFunction () 函數(shù)在js中作為window的屬性 window.opener.myFunction(document.getElementById("childText").value);
window.close(); } </script>
</head>
<body> <button onclick="funClose();">關(guān)閉本窗口</button> <hr> 此文本框的值將要傳遞到父窗口 <input type="text" id="childText" value="子窗口的值:1"> </body> </html>
作者:caoyinghui1986 發(fā)表于2008-6-15 12:31:00
原文鏈接
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//補(bǔ)充完成下邊的函數(shù),打開(kāi)新的一個(gè)模式窗口
function openShowModalDialog(){
var obj = window;
var params = new Array("aaaa",obj);
var returnValue = window.showModalDialog("DEMO04_01.html",params);
document.getElementById("showContentDiv").innerHTML=returnValue;
}
</script>
</head>
<body>
<h1>模式窗口的使用:</h1>
<h3>補(bǔ)充完成openShowModalDialog函數(shù),打開(kāi)新的一個(gè)模式窗口</h3>
<button onclick="openShowModalDialog();">打開(kāi)新的模式窗口</button>
<br>
<hr>
<div id="showContentDiv">
</div>
</body>
</html>
DEM004-01.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//補(bǔ)充完成函數(shù),將文本框returnValue的值設(shè)置為父窗口返回值,并關(guān)閉本窗口
function closeShowModalDialog(){
//獲得模式窗體的參數(shù)。
var p = window.dialogArguments;
window.returnValue=document.getElementById("returnValue").value;
//設(shè)置父窗體的返回值 p[1] 事實(shí)上是拿到了父窗體的引用
p[1].returnValue=document.getElementById("returnValue").value;
window.close();
}
</script>
</head>
<body>
<h1>模式窗口的使用:</h1>
<h3>補(bǔ)充完成closeShowModalDialog函數(shù),將文本框returnValue的值設(shè)置為父窗口返回值,并關(guān)閉本窗口</h3>
<button onclick="closeShowModalDialog();">設(shè)置返回值,并關(guān)閉窗口</button>
<hr>
窗口的返回值
<input type="text" id="returnValue" value="在這里設(shè)置返回值">
</body>
</html>
作者:caoyinghui1986 發(fā)表于2008-6-15 12:27:00
原文鏈接
DEM003.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<frameset rows="70,*" cols="*" framespacing="0" frameborder="yes" style="border:0px">
<frame src="DEMO03_bar.html" name="bar" scrolling="No" noresize="noresize" id="bar"arginwidth="0" marginheight="0" />
<frameset cols="150,*" frameborder="yes" border="1" framespacing="0">
<frame src="DEMO03_menu.html" name="menu" scrolling="No" noresize="noresize" id="menu" marginwidth="0" marginheight="0" />
<frame src="DEMO03_main.html" name="mainFrame" id="main" marginwidth="0" marginheight="0" />
</frameset>
</frameset>
<noframes><body>
</body>
</noframes></html>
DEM003_bar.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//補(bǔ)充完成此函數(shù),用于刷新Menu窗體的頁(yè)面
function flushMenuFrame(){
//top表示頂級(jí)窗口 的 window對(duì)象
window.top.menu.location.href="DEMO03_menu.html";
}
//補(bǔ)充完成此函數(shù),將barText文本框的值寫(xiě)入到Main窗口的mainText中去。
function writeValueToMainFrame(){
//parent表示 但前窗口的 上級(jí)窗口的 window對(duì)象
window.parent.mainFrame.document.getElementById("mainText").value=document.getElementById("barText").value;
}
</script>
</head>
<body>
<center>BAR頁(yè)面</center>
<button onclick="flushMenuFrame();">刷新框架Menu窗口的頁(yè)面</button>
Bar頁(yè)面的文本框:<input type="text" id="barText" value="Bar頁(yè)面的值1"><button onclick="writeValueToMainFrame();">向Main窗口寫(xiě)值</button>
</body>
</html>
DEMO003_main.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<body>
<center>Main窗體</center>
<br><br>
Main窗體中的文本框
<input type="text" id="mainText" value="Main頁(yè)面的值2">
</body>
</html>
作者:caoyinghui1986 發(fā)表于2008-6-15 12:24:00
原文鏈接
實(shí)現(xiàn)功能是 用戶本地瀏覽一個(gè)圖片后(本來(lái)要用上傳 為簡(jiǎn)單起見(jiàn)就制作本地測(cè)試) 功過(guò)Hibernate中向數(shù)據(jù)庫(kù)插入圖片 并在另一個(gè)頁(yè)面把這個(gè)圖片顯示出來(lái)
index.jsp
<body>
<form name="frm" action="imgServlet" method="post">
<input type="file" name="path"/>
<input type="submit" value="提交">
</form>
</body>
一個(gè)簡(jiǎn)單的表單用于瀏覽圖片
Img.java
public class Img implements java.io.Serializable {
// Fields
private Integer id;
private byte[] img;
......
}
Img.hbm.xml
<hibernate-mapping>
<class name="hib.Img" table="img" schema="dbo" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="img" type="binary">
<column name="img" not-null="true" />
</property>
</class>
</hibernate-mapping>
servlet中的處理方式 (web.xml 中 <url-pattern>/imgServlet</url-pattern> 對(duì)這個(gè)servlet的配置)
public void doPostt(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
//PrintWriter out2 = response.getWriter();
//servlet 中 out 對(duì)象只可取一次.
//如果要用與輸出二進(jìn)制數(shù)據(jù) . 就必須用 OutputStream 對(duì)象.
OutputStream out = response.getOutputStream();
request.setCharacterEncoding("UTF-8");
String path = request.getParameter("path");
java.io.File file = new File(path);
InputStream inputStream = new FileInputStream(file);
byte[] buff= new byte[(int) file.length()];
inputStream.read(buff, 0, (int) file.length());
Img img = new Img();
img.setImg(buff);
Session session = HibernateSessionFactory.getSession();
session.save(img);
session.beginTransaction().commit();
String realPath = request.getSession().getServletContext().getRealPath("/");
System.out.println("realPath"+realPath);
System.out.println("path:"+path);
System.out.println("插入成功!!!");
try {
//將圖片寫(xiě)入到輸出流中
out.write(img.getImg());
} catch (Exception e) {
e.printStackTrace();
}
//request.getRequestDispatcher("show.jsp").forward(request, response);
response.sendRedirect("show.jsp");
out.flush();
out.close();
}
show.jsp
<body>
<img src="imgServlet"/>
</body>
通過(guò)提交就可以在 show.jsp看到用戶提交的圖片并且改圖片保存到了數(shù)據(jù)庫(kù)
作者:caoyinghui1986 發(fā)表于2008-6-6 14:52:00
原文鏈接
每次在CSDN回貼的時(shí)候都會(huì)遇到好多關(guān)于連接池的貼。自己在測(cè)試的時(shí)候也發(fā)現(xiàn)這個(gè)東西,有時(shí)候確實(shí)比較麻煩。干脆就花了一點(diǎn)時(shí)間把他們總結(jié)了
一下.
我機(jī)器的環(huán)境是 Eclipse3.2 + tomcate5.5+ JDK1.5 +sqlserver2000
測(cè)試前 首先要確保 sql2000 打了spk3,spk4補(bǔ)丁包。
struts中c3p0 連接池的配置。
<data-sources >
<data-source key="ds" type="com.mchange.v2.c3p0.ComboPooledDataSource">
<set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs" />
<set-property property="maxCount" value="10"/>
<set-property property="minCount" value="1"/>
<set-property property="username" value="sa" />
<set-property property="password" value="" />
</data-source>
Action中獲得這個(gè)連接的方式。
DataSource ds = this.getDataSource(request,"ds");
struts中dbcp 連接池的配置
<data-source key="dsDBCP" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs" />
<set-property property="maxCount" value="10"/>
<set-property property="minCount" value="1"/>
<set-property property="username" value="sa" />
<set-property property="password" value="" />
</data-source>
使用 dbcp 連接池 時(shí)除了要注意 導(dǎo)入必要的 3個(gè)連接池驅(qū)動(dòng)包外 還要引入sql的三個(gè)驅(qū)動(dòng)包。
-------------------------------------------------------------------------------------------------------------------------------
Spring中dbcp 連接池的配置
jdbc.properties
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs
jdbc.username=sa
jdbc.password=
jdbc.properties 文件來(lái)定義連接信息。
在 dbcpPoolBean.xml文件中的bean配置。
<bean id="aa" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 對(duì)與單個(gè)文件 這里可以直接用 location屬性 然后給一個(gè) value單值 原因是因?yàn)樵谄?父類的實(shí)現(xiàn)中
PropertiesLoaderSupport 有個(gè) setLocation方法.
public void setLocation(Resource location) {
this.locations = new Resource[] {location};
}
public void setLocations(Resource[] locations) {
this.locations = locations;
}
所以單個(gè)文件可以簡(jiǎn)單的用 location對(duì)應(yīng)一個(gè) 值(value)
-->
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="password" value="${jdbc.password}"/>
<property name="username" value="${jdbc.username}"/>
</bean>
客戶段可以通過(guò)
ApplicationContext ctx = new ClassPathXmlApplicationContext("dbcpPoolBean.xml");
DataSource ds = (org.apache.commons.dbcp.BasicDataSource )ctx.getBean("dataSource");
來(lái)獲得數(shù)據(jù)源。當(dāng)然在web開(kāi)發(fā)中可以通過(guò)容器自動(dòng)注入。
----------------------------------------------------------------------------------------------------------------------------
Tocmate5.5中配置數(shù)據(jù)源:
自己在配置這個(gè)東西的時(shí)候搞了好久 ,最后還是求助 CSDN解決的
貼子http://topic.csdn.net/u/20080605/20/7fdd0eee-9c43-428a-8b82-5db9a1968151.html
總結(jié)下幾個(gè)需要注意的地方:
1,首先在 tomcate 的server.xml文件中正確配置
2,要將相關(guān)的驅(qū)動(dòng)包(sql的和連接池的)copy到 C:/Tomcat 5.5/common/lib(我的tomcate在c盤(pán))
server.xml中的配置信息:
<Context path="/testPool"
docBase="F:/Exercise/Newer/tomcatePool/WebRoot"
debug="5"
reloadable="true"
crossContext="true">
<Resource name="jdbc/userDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
username="sa"
password=""
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
maxActive="100"
maxIdle="1000"
maxWait="5000"/>
</Context>
讀取連接池的方法:
try{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/userDB");
//可以獲得 ds
System.out.println(ds);
Connection con = ds.getConnection();
System.out.println("我的到了連接拉:"+con);
//out.println( ds.getConnection());
}catch(Exception ex){
ex.printStackTrace();
}
通過(guò)這兩步配置后你就可以用 http://localhost:8080/testPool/來(lái)訪問(wèn) 你的資源 testPool 是你在 <Context path="/testPool"/> 中path的值匹配
如果你吧你的項(xiàng)目部署到tomcate還是不能獲得連接。 這是你要在 C:/Tomcat 5.5/conf/Catalina/localhost 下新建一個(gè)xml 文件 (tomcatePool.xml)
tomcatePool 是你的當(dāng)前項(xiàng)目的名字。
這樣就可以通過(guò) http://localhost:8080/tomcatePool/ 來(lái)訪問(wèn)你的資源了。這時(shí) server.xml文件中就可以不配置。
tomcatePool.xml
<Context path=""
docBase=""
debug="5"
reloadable="true"
crossContext="true">
<Resource name="jdbc/userDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
username="sa"
password=""
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
maxActive="100"
maxIdle="1000"
maxWait="5000"/>
</Context>
注意path和docBase 因?yàn)槭峭ㄟ^(guò)項(xiàng)目名來(lái)訪問(wèn)的所以這兩個(gè)值沒(méi)有意義。
------------------------------------------------------------------------------------------------------------------------------
hibernate 中獲得容器(tomcate)中的數(shù)據(jù)源。
只要加 一個(gè)配置。
hibernate.cfg.xml文件
<property name="connection.datasource">java:comp/env/jdbc/userDB</property>
有了這個(gè)后
<!-- <property name="connection.username">sa</property>-->
<!-- <property name="connection.url">-->
<!-- jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=temp-->
<!-- </property>-->
<!-- <property name="myeclipse.connection.profile">sql2000</property>-->
<!-- <property name="connection.driver_class">-->
<!-- com.microsoft.jdbc.sqlserver.SQLServerDriver -->
<!-- </property>-->
這些就可以注釋掉呢。
另外測(cè)試中發(fā)現(xiàn) .hbm.xml 文件中的 catalog="temp" 屬性可以覆蓋 數(shù)據(jù)源中
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" 這里配置的數(shù)據(jù)庫(kù)名稱。
****************************************************************************************************
目前就只做了這么多 以后遇到了新的再來(lái)補(bǔ)充.
作者:caoyinghui1986 發(fā)表于2008-6-6 14:28:00
原文鏈接
Hibernate映射類型對(duì)照表
java類型 |
Hibernate映射類型 |
SQL類型 |
java.math.BigDecimal |
big_decimal |
numeric |
byte[] |
binary |
varbinary(blob) |
boolean(java.lang.Boolean) |
boolean |
bit |
byte(java.lang.Byte) |
byte |
tinyint |
java.util.Calendar |
calendar |
timestamp |
java.sql.Clob |
clob |
clob |
java.util.Date 或java.sql.Date |
date |
date |
double(java.lang.Double) |
double |
double |
float(java.lang.Float) |
float |
float |
int (java.lang.Integer) |
integer |
integer |
java.util.Local |
local |
varchar |
long(java.lang.Long) |
long |
bigint |
java.io.Serializable的某個(gè)實(shí)例 |
serializable |
varbinary(或blob) |
java.lang.String |
string |
varchar |
java.lang.String |
text |
clob |
java.util.Date 或 java.sql.Timestamp |
time |
timestamp |
從書(shū)上把這個(gè)表抄下來(lái)方便以后查閱.
考慮到 操作 blob 的字段太復(fù)雜 一個(gè)變換的技巧是 . 實(shí)體類用 byte[] 類型 , hibernate 類型用 binary ,數(shù)據(jù)庫(kù)還是用 blob .這樣 可以簡(jiǎn)化一些操作.
作者:caoyinghui1986 發(fā)表于2008-6-4 20:56:00
原文鏈接
Spring 和 struts 整合的三種方式。
1,使用Spring 的 ActionSupport
2, 使用Spring 的 DelegatingRequestProcessor 類。
3,全權(quán)委托。
無(wú)論用那種方法來(lái)整合第一步就是要為struts來(lái)裝載spring的應(yīng)用環(huán)境。 就是在 struts 中加入一個(gè)插件。
struts-config.xml中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
spring 的配置文件被作為參數(shù)配置進(jìn)來(lái)。這樣可以省略對(duì)web.xml 文件中的配置。確保你的applicationContext.xml 在WEB-INF目錄下面
1,使用Spring的ActionSupport .
Spring 的ActionSupport 繼承至 org.apache.struts.action.Action
ActionSupport的子類可以或得 WebApplicationContext類型的全局變量。通過(guò)getWebApplicationContext()可以獲得這個(gè)變量。
這是一個(gè) servlet 的代碼:
public class LoginAction extends org.springframework.web.struts.ActionSupport {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//獲得 WebApplicationContext 對(duì)象
WebApplicationContext ctx = this.getWebApplicationContext();
LoginDao dao = (LoginDao) ctx.getBean("loginDao");
User u = new User();
u.setName(loginForm.getName());
u.setPwd(loginForm.getPwd());
if(dao.checkLogin(u)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}
}
}
applicationContext.xml 中的配置
<beans>
<bean id="loginDao" class="com.cao.dao.LoginDao"/>
</beans>
這中配置方式同直接在web.xml文件配置差別不大。注意:Action繼承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。
但實(shí)現(xiàn)了表示層和業(yè)務(wù)邏輯層的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。
2,使用Spring 的 DelegatingRequestProcessor 類
DelegatingRequestProcessor 繼承自 org.apache.struts.action.RequestProcessor 并覆蓋了里面的方法。
sturts-config.xml 中 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通過(guò) <controller >來(lái)替代
org.apache.struts.action.RequestProcessor 的請(qǐng)求處理。
public class LoginAction extends Action {
//利用spring來(lái)注入這個(gè)對(duì)象。
private LoginDao dao ;
public void setDao(LoginDao dao) {
System.out.println("執(zhí)行注入");
this.dao = dao;
}
public LoginDao getDao() {
return dao;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//這樣一改這行代碼似乎沒(méi)有必要了。
//WebApplicationContext ctx = this.getWebApplicationContext();
//LoginDao dao = (LoginDao) ctx.getBean("loginDao");
User u = new User();
u.setName(loginForm.getName());
u.setPwd(loginForm.getPwd());
//直接用dao來(lái)調(diào)用spring會(huì)將這個(gè)對(duì)象實(shí)例化。
if(dao.checkLogin(u)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}
}
}
這里的。
LoginAction extends Action 說(shuō)明 struts 每有和spring 耦合。
看一下
applicationContext.xml 中的配置。
<beans>
<bean id="loginDao" class="com.cao.dao.LoginDao"/>
<bean name="/login" class="com.cao.struts.action.LoginAction">
<property name="dao">
<ref local="loginDao"/>
</property>
</bean>
</beans>
這里 name="/login" 與struts 中的path匹配
class="com.cao.struts.action.LoginAction" 與struts 中的type匹配
還要為 LoginAction 提供必要的setXXX方法。 獲得ApplicationCotext和依賴注入的工作都在DelegatingRequestProcessor中完成。
3,全權(quán)委托:
Action 的創(chuàng)建和對(duì)象的依賴注入全部由IOC容器來(lái)完成。 使用Spring的DelegatingAcionProxy來(lái)幫助實(shí)現(xiàn)代理的工作
org.springframework.web.struts.DelegatingActiongProxy繼承于org.apache.struts.action.Action .
全權(quán)委托的配置方式同 方式 2 類似 (applcationContext.xml文件的配置和 Action類的實(shí)現(xiàn)方式相同)。
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="com.cao.struts.form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<!-- type指向的是spring 的代理類 -->
<action
attribute="loginForm"
input="login.jsp"
name="loginForm"
path="/login"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy" >
<forward name="success" path="/ok.jsp" />
<forward name="error" path="/error.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.cao.struts.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
</struts-config>
不同之處
1, <action>中 type指向的是spring 的代理類
2, 去掉struts-config.xml中 <controller >
三種整和方式中我們優(yōu)先選用 全權(quán)委托的方式。
理由:
1,第一種使得過(guò)多的耦合了Spring和Action .
2,RequestProcessor類已經(jīng)被代理 如果要再實(shí)現(xiàn)自己的實(shí)現(xiàn)方式(如:編碼處理)怕有點(diǎn)麻煩。
總結(jié)一下:
整合工作中的步驟:
1,修改struts-config.xml
2, 配置applicationContext.xml
3, 為Action添加get/set方法 來(lái)獲得依賴注入的功能。
作者:caoyinghui1986 發(fā)表于2008-6-2 6:16:00
原文鏈接
1,通過(guò)Listener加載ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
-----------------------------------------------------------------------------------------------------------------------------------------
通過(guò)Servlet加載ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-------------------------------------------------------------------------------------------------------------------------------------------
兩種加載方式中要特別注意 路徑問(wèn)題。
<param-value>/WEB-INF/applicationContext.xml</param-value>
其中要確保你的 WEB-INF 下 有 applicationContext.xml 這個(gè)文件
測(cè)試發(fā)現(xiàn)WEB-INF區(qū)分大小寫(xiě)。 空格好象沒(méi)有發(fā)現(xiàn)問(wèn)題。
Listener 接口 是在 servelt2.3 版本被引入的 我機(jī)器的配置是Eclipse3.2 +Tomcate5.0+JDK1.5
使用這個(gè)沒(méi)有問(wèn)題。
還有一個(gè) applicationContext.xml 如果放在 WEB-INF目錄外似乎在這里
哪怕是改成相應(yīng)的路徑好象也訪問(wèn)不到。
servlet中可以通過(guò)
ApplicationContext context = org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
得到 context 對(duì)象。
作者:caoyinghui1986 發(fā)表于2008-6-1 15:52:00
原文鏈接