2007年5月24日
關(guān)于LINUX權(quán)限-bash: ./startup.sh: Permission denied
<script type="text/javascript"></script><script type="text/javascript"></script>
在執(zhí)行./startup.sh,或者./shutdown.sh的時(shí)候,爆出了Permission denied,
其實(shí)很簡(jiǎn)單,就是今天在執(zhí)行tomcat的時(shí)候,用戶沒有權(quán)限,而導(dǎo)致無(wú)法執(zhí)行,
用命令chmod 修改一下bin目錄下的.sh權(quán)限就可以了
如chmod u+x *.sh
在此執(zhí)行,OK了。
2011-03-16 10:34
最近在開發(fā)中遇到了表單提交前驗(yàn)證的問題,用一個(gè)普通的button按鈕代替submit按鈕,
在提交前觸發(fā)這個(gè)button的onclick事件,在其事件中觸發(fā)form的submit事件。問題出現(xiàn)了:
以下是出現(xiàn)相關(guān)代碼:
<form action="http://www.baidu.com/s?wd=this.form.submit%28%29%3B&cl=3" method="post" name="form1" onsubmit="return alert('已提交!'); return false;">
<table align="center" width="420px" cellPadding="2" cellSpacing="1" bgcolor="#A4B6D7" style="word-wrap:Break-word;">
<tr style="cursor: hand;background:#d7e3f6" >
<td width="20%" align="right">條型碼</td>
<td><input style="width:90%" type="text" name="GOODSNUM" size="30" maxlength="8" ></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="button" name="save" value="保存" onclick="if((confirm('確定要提交嗎?'))) this.form.submit();"/>
</td>
</tr>
</table>
</form>
卻發(fā)現(xiàn)并沒有觸發(fā)form的onsubmit方法,而是直接提交了。奇怪了,難道沒有這種方式無(wú)法結(jié)合form的onsubmit方法嗎?
仔細(xì)想了想,既然this.form表示form這個(gè)對(duì)象,那么肯定能獲取到form的屬性和方法的
,就改成this.form.onsubmit(); 成功!
我又查了查手冊(cè),原來(lái)submit的方法是這樣解釋的:
The submit method does not invoke the onsubmit event handler. Call the onsubmit event handler directly. When using Microsoft® Internet Explorer 5.5 and later, you can call the fireEvent method with a value of onsubmit in the sEvent parameter.
意思是說(shuō)submit這個(gè)方法是不觸發(fā)onsubmit時(shí)間的,如果想要觸發(fā)它,需要調(diào)用
fireEvent方法。嘗試一下:this.form.fireEvent('onsubmit');哈哈,果然也成功!不過這樣不是多此一舉嗎?呵呵!
就這個(gè)小問題也搞了我將近一個(gè)小時(shí),不過為了以后不為這個(gè)問題煩惱,這也是值得的。
this.form.submit(); //直接提交表單
this.form.onsubmit(); //調(diào)用form的onsubmit方法
this.form.fireEvent('onsubmit'); //同上,
PS:又學(xué)到了fireEvent這個(gè)方法,
2.onsubmit()與submit() :
<sCript>
funCtion fun()
{
alert("form_submit");
}
</sCript>
<form onsubmit="fun()">
<input type="submit" id="aaa" value="submit"> <!--能彈出form_submit-->
<input type="button" id="bbb" value="onCliCk_submit" onCliCk="doCument.forms[0].submit()">
<!--
表單會(huì)提交,但是不會(huì)運(yùn)行fun() 原因是 onsubmit事件不能通過此種方式觸發(fā)(在IE環(huán)境)
直接用腳本doCumetn.formName.submit()提交表單是不會(huì)觸發(fā)表單的onsubmit()事件的
-->
<input type="button" id="bb1" value="onCliCk_onsubmit" onCliCk="doCument.forms[0].onsubmit()">
<!--會(huì)觸發(fā)fun()參數(shù)-->
</form>
service()是在javax.servlet.Servlet接口中定義的, 在 javax.servlet.GenericServlet 中實(shí)現(xiàn)了這個(gè)接口, 而 doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實(shí)現(xiàn)的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子類. 所有可以這樣理解, 其實(shí)所有的請(qǐng)求均首先由 service() 進(jìn)行處理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要做的事情就是判斷請(qǐng)求類型是 Get 還是 Post, 然后調(diào)用對(duì)應(yīng)的 doGet/doPost 執(zhí)行.
doGet:處理GET請(qǐng)求 doPost:處理POST請(qǐng)求 doPut:處理PUT請(qǐng)求 doDelete:處理DELETE請(qǐng)求 doHead:處理HEAD請(qǐng)求 doOptions:處理OPTIONS請(qǐng)求 doTrace:處理TRACE請(qǐng)求 通常情況下,在開發(fā)基于HTTP的servlet時(shí),開發(fā)者只需要關(guān)心doGet和doPost方法,其它的方法需要開發(fā)者非常的熟悉HTTP編程,因此這些方法被認(rèn)為是高級(jí)方法。 而通常情況下,我們實(shí)現(xiàn)的servlet都是從HttpServlet擴(kuò)展而來(lái)。 doPut和doDelete方法允許開發(fā)者支持HTTP/1.1的對(duì)應(yīng)特性; doHead是一個(gè)已經(jīng)實(shí)現(xiàn)的方法,它將執(zhí)行doGet但是僅僅向客戶端返回doGet應(yīng)該向客戶端返回的頭部的內(nèi)容; doOptions方法自動(dòng)的返回servlet所直接支持的HTTP方法信息; doTrace方法返回TRACE請(qǐng)求中的所有頭部信息。 對(duì)于那些僅僅支持HTTP/1.0的容器而言,只有doGet, doHead 和 doPost方法被使用,因?yàn)镠TTP/1.
下邊是CSDN里邊的一些討論:
1.doGet和doPost的區(qū)別,在什么時(shí)候調(diào)用,為什么有時(shí)doPost中套用doGet
2.提交的form method=Post就執(zhí)行DOPOST,否則執(zhí)行GOGET 套用是不管method是post還是get都執(zhí)行dopost方法
3.get:你可以通過URL傳參數(shù)。http://www.csdn.net/index.asp?user=1234 , Post不行
4.你的表單提交都有方法的,如果提交為get就調(diào)用get方法,用post就調(diào)用post方法.
get顯示你傳過去的參數(shù),post則不顯示.
5.通常的寫法:先用doGet(),然后在doPost()中調(diào)用doGet(),這樣就萬(wàn)無(wú)一失了
6. 簡(jiǎn)單的說(shuō),get是通過http header來(lái)傳輸數(shù)據(jù),有數(shù)量限制,而post則是通過http body來(lái)傳輸數(shù)據(jù),沒有數(shù)量限制。
7.還有一點(diǎn):get和post提交的數(shù)據(jù)量是不一樣的.
get好像最多只能在url后跟64K(?具體多少忘記了),
post好像沒這個(gè)限制,至少我post過5M以上的文本
還有url刷新時(shí)get好像可以不用重復(fù)提交原來(lái)提交的數(shù)據(jù),
而post則會(huì)說(shuō)內(nèi)容已提交,想刷新請(qǐng)?jiān)偬峤?
這是我總結(jié)的一些基本用法,可能對(duì)初用者會(huì)有幫助,獨(dú)樂樂不如眾樂樂,是吧!
說(shuō)明:以下黑色為vi和vim均有的一般功能,而紅色為Vim(Vi Improved)所特有功能。Vim一般的Unix和Linux下均有安裝。
? 三種狀態(tài)
Command: 任何輸入都會(huì)作為編輯命令,而不會(huì)出現(xiàn)在屏幕上,任何輸入都引起立即反映
Insert: 任何輸入的數(shù)據(jù)都置于編輯寄存器,按ESC,可跳回command方式
Escape: 以“:”或者“/”為前導(dǎo)的指令,出現(xiàn)在屏幕的最下一行,任何輸入都被當(dāng)成特別指令。
? 離開vi
:q! 離開vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容。
:wq 將緩沖區(qū)內(nèi)的資料寫入磁盤中,并離開vi。
:x 同wq。
(注意—— :X 是文件加密,一定要與:x存盤退出相區(qū)別)
? 進(jìn)入輸入模式
a (append) 由游標(biāo)之后加入資料。
A 由該行之末加入資料。
i (insert) 由游標(biāo)之前加入資料。
I 由該行之首加入資料。
o (open) 新增一行於該行之下供輸入資料之用。
O 新增一行於該行之上供輸入資料之用。
? 刪除與修改
x 刪除游標(biāo)所在該字元。
X 刪除游標(biāo)所在之前一字元。
r 用接於此指令之后的字元取代(replace)游標(biāo)所在字元。如:ra將游標(biāo)所在字元以 a 取代之。
R 進(jìn)入取代狀態(tài),直到《ESC》為止。
s 刪除游標(biāo)所在之字元,并進(jìn)入輸入模式直到《ESC》。
S 刪除游標(biāo)所在之該行資料,并進(jìn)入輸入模式直到《ESC》。
? 光標(biāo)的移動(dòng)
m<a-z> 設(shè)置書簽<a-z>
‘<a-z> 移至?xí)?lt;a-z>處
0 移至該行之首
$ 移至該行之末。
e 移動(dòng)到下個(gè)字的最後一個(gè)字母
w 移動(dòng)到下個(gè)字的第一個(gè)字母。
b 移動(dòng)到上個(gè)字的第一個(gè)字母。
^ 移至該行的第一個(gè)字元處。
H 移至視窗的第一行。
M 移至視窗的中間那行。
L 移至視窗的最后一行。
G 移至該文件的最后一行。
+ 移至下一列的第一個(gè)字元處。
- 移至上一列的第一個(gè)字元處。
:n 移至該文件的第 n 列。
n+ 移至游標(biāo)所在位置之后的第 n 列。
n- 移至游標(biāo)所在位置之前的第 n 列。
<Ctrl><g> 顯示該行之行號(hào)、文件名稱、文件中最末行之行號(hào)、游標(biāo)所在行號(hào)占總行號(hào)之百分比。
(Vim) 光標(biāo)移動(dòng)基本用法小解:
(這只要組合上邊的功能就可以明白了,不用再一一講解了吧!)
ge b w e
← ← ---→ --→
This is-a line, with special/separated/words (and some more).
←- ←-- -----------------→ ---→
GE B W E
? 視窗的移動(dòng)
<Ctrl><f> 視窗往下卷一頁(yè)。
<Ctrl><b> 視窗往上卷一頁(yè)。
<Ctrl><d> 視窗往下卷半頁(yè)。
<Ctrl><u> 視窗往上卷半頁(yè)。
<Ctrl><e> 視窗往下卷一行。
<Ctrl><y> 視窗往上卷一行。
? 剪切、復(fù)制、刪除
Operator + Scope = command
? Operator
d 剪切
y 復(fù)制。
p 粘帖,與 d 和 y 配和使用。可將最后d或y的資料放置於游標(biāo)所在位置之行列下。
c 修改,類似delete與insert的組和。刪除一個(gè)字組、句子等之資料,并插入新建資料。
? Scope
e 由游標(biāo)所在位置至該字串的最后一個(gè)字元。
w 由游標(biāo)所在位置至下一個(gè)字串的第一個(gè)字元。
b 由游標(biāo)所在位置至前一個(gè)字串的第一個(gè)字元。
$ 由游標(biāo)所在位置至該行的最后一個(gè)字元。
0 由游標(biāo)所在位置至該行的第一個(gè)字元。
? 整行動(dòng)作
dd 刪除整行。
D 以行為單位,刪除游標(biāo)后之所有字元。
cc 修改整行的內(nèi)容。
yy 使游標(biāo)所在該行復(fù)制到記憶體緩沖區(qū)。
? 取消前一動(dòng)作(Undo)
u 恢復(fù)最后一個(gè)指令之前的結(jié)果。
U 恢復(fù)游標(biāo)該行之所有改變。
(vim) u 可以多次撤消指令,一次撤消一個(gè)操作,直至本次操作開始為止。
(vim) Ctrl+r 可以恢復(fù)撤消前內(nèi)容,按多次可恢復(fù)多次。
? 查找與替換
/字串 往游標(biāo)之后尋找該字串。
?字串 往游標(biāo)之前尋找該字串。
n 往下繼續(xù)尋找下一個(gè)相同的字串。
N 往上繼續(xù)尋找下一個(gè)相同的字串。
% 查找“(”,“)”,“{”,“}”的配對(duì)符。
s 搜尋某行列范圍。
g 搜尋整個(gè)編輯緩沖區(qū)的資料。
:1,$s/old/new/g 將文件中所有的『old』改成『new』。
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個(gè)空白。
(vim)
/字符串 后邊輸入查詢內(nèi)容可保存至緩沖區(qū)中,可用↑↓進(jìn)行以往內(nèi)容選擇。
另外:將光標(biāo)移動(dòng)在選定單詞下方按*,則可以選中此單詞作為查詢字符,可以避免輸入一長(zhǎng)串字符的麻煩。
? (vim) 大小寫替換
首先用按v開啟選擇功能,然后用↑↓←→鍵來(lái)選定所要替換的字符,若是小寫變大寫,則按U;反之按u;
如果是選擇單詞,則可以在按v后,按w,最后按U/u,這樣就可以將字符隨意的改變大小寫了,而不用刪除后重新敲入。
? 資料的連接
J 句子的連接。將游標(biāo)所在之下一行連接至游標(biāo)該行的后面。
? 環(huán)境的設(shè)定
:set all 可設(shè)置的環(huán)境變量列表
:set 環(huán)境變量的當(dāng)前值
:set nu 設(shè)定資料的行號(hào)。
:set nonu 取消行號(hào)設(shè)定。
:set ai 自動(dòng)內(nèi)縮。
:set noai 取消自動(dòng)內(nèi)縮。
(vim)
:set ruler 會(huì)在屏幕右下角顯示當(dāng)前光標(biāo)所處位置,并隨光移動(dòng)而改變,占用屏幕空間較小,使用也比較方便,推薦使用。
:set hlsearch 在使用查找功能時(shí),會(huì)高亮顯示所有匹配的內(nèi)容。
:set nohlsearch 關(guān)閉此功能。
:set incsearch 使Vim在輸入字符串的過程中,光標(biāo)就可定位顯示匹配點(diǎn)。
:set nowrapscan 關(guān)閉查找自動(dòng)回環(huán)功能,即查找到文件結(jié)尾處,結(jié)束查找;默認(rèn)狀態(tài)是自動(dòng)回環(huán)
? ex指令
? 讀寫資料
:10,20w test 將第10行至第20行的資料寫入test文件。
:10,20w>>test 將第10行至第20行的資料加在test文件之后。
:r test 將test文件的資料讀入編輯緩沖區(qū)的最后。
:e [filename] 編輯新的文件。
:e! [filename] 放棄當(dāng)前修改的文件,編輯新的文件。
:sh 進(jìn)入shell環(huán)境,使用exit退出,回到編輯器中。
:!cmd 運(yùn)行命令cmd后,返回到編輯器中。
? 刪除、復(fù)制及搬移
:10,20d 刪除第10行至第20行的資料。
:10d 刪除第10行的資料。
:%d 刪除整個(gè)編輯緩沖區(qū)。
:10,20co30 將第10行至第20行的資料復(fù)制至第30行之后。
:10,20mo30 將第10行至第20行的資料搬移至第30行之后。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jsufcz/archive/2009/02/11/3875956.aspx
OERR: ORA-12519報(bào)錯(cuò)
1、查詢數(shù)據(jù)庫(kù)當(dāng)前的連接數(shù):
select count(*) from v$process;
2、查詢數(shù)據(jù)庫(kù)允許的最大連接數(shù):
select value from v$parameter where name = 'processes';
3、修改數(shù)據(jù)庫(kù)允許的最大連接數(shù):
alter system set processes = 300 scope = spfile;
4、重啟數(shù)據(jù)庫(kù):
shutdown immediate;
startup;
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/7_databases/oracle/oraclejs/20091103/181042.html
今天下載了個(gè)設(shè)計(jì)模式看,prototype模式就兩頁(yè)紙,看過了也沒看出來(lái)它到底做什么,比較郁悶。我就不清楚那個(gè)copy方法到底做了什么?沒有copy方法不行嗎?
定義:
用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象. //通過拷貝創(chuàng)建新的對(duì)象跟通過繼承創(chuàng)建有什么區(qū)別呢?
Prototype 模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,根本無(wú)需知道任何如何創(chuàng)建的
細(xì)節(jié),工作原理是:通過將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象
通過請(qǐng)求原型對(duì)象拷貝它們自己來(lái)實(shí)施創(chuàng)建。
如何使用?
因?yàn)镴ava 中的提供clone()方法來(lái)實(shí)現(xiàn)對(duì)象的克隆(具體了解 clone()按這里),所以
Prototype 模式實(shí)現(xiàn)一下子變得很簡(jiǎn)單.
以勺子為例:
public abstract class AbstractSpoon implements Cloneable
{
String spoonName;
public void setSpoonName(String spoonName) {this.spoonName = spoonName;}
public String getSpoonName() {return this.spoonName;}
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("AbstractSpoon is not Cloneable");
}
return object;
}
}
有兩個(gè)具體實(shí)現(xiàn)(ConcretePrototype):
public class SoupSpoon extends AbstractSpoon
{
public SoupSpoon()
{
setSpoonName("Soup Spoon");
}
}
public class SaladSpoon extends AbstractSpoon
{
public SaladSpoon()
{
setSpoonName("Salad Spoon");
}
}
調(diào)用 Prototype 模式很簡(jiǎn)單:
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon = new SaladSpoon();
本文代碼來(lái)自以下連接。
http://www.developer.com/java/other/article.php/10936_2212401_3(Introduction to the Java Robot Class in Java)
代碼簡(jiǎn)單說(shuō)明:可以在1024*768的屏幕分辨率下關(guān)掉一個(gè)最大化的IE窗口。
import java.awt.*;
import java.awt.event.*;
/**this class will close an maxmimum IE window in the 1024*768's screen resolution's machine.*/
public class Robot04{
public static void main(String[] args)
throws AWTException{
Robot robot = new Robot();
robot.mouseMove(1005,10);
robot.delay(2000);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.delay(2000);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}//end main
}//end class Robot04
這個(gè)程序的GUI版本。
Robot04GUI.java
/**
* Robot04GUI.java
* create by kin. 2004/11/07.
* Please enjoy this.
*/
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
/**Robot04's GUI version.*/
public class Robot04GUI extends JFrame {
private JButton b = new JButton("Close IE");
public Robot04GUI() {
super("Close IE");
getContentPane().add(b,BorderLayout.CENTER);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
new Robot04().main(new String[]{});
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
public static void main(String[] args) {
Robot04GUI r = new Robot04GUI();
r.setSize(200,200);
r.setVisible(true);
}
需要記住的東東:
1.代理類是在程序運(yùn)行過程中創(chuàng)建的,一旦創(chuàng)建就變成了常規(guī)類,與虛擬機(jī)種的任何其他類沒有什么區(qū)別.
2.所有的代理類都擴(kuò)展于Proxy類,一個(gè)代理類只有一個(gè)實(shí)例變量--調(diào)用處理器,它定義在Proxy的超類中,為了履行代理對(duì)象的職責(zé),所需要的任何附加數(shù)據(jù)都必須存儲(chǔ)在調(diào)用處理器中.
3.所有的代理類都覆蓋了Object中的toString,equals和hashCode,如何所有的代理方法一樣,這些方法僅僅調(diào)用了調(diào)用處理器的invoke.Object中的其他方法clone,getClass沒有被重新定義.
感覺就是把原來(lái)的方法,拿到代理類里面執(zhí)行,在執(zhí)行前后可以加入自己的代碼而已,spring的IOC就是這樣的.
例子:
import java.lang.reflect.*;
import java.util.*;
public class PorxyTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Object[] elements = new Object[1000];
for (int i = 0; i < elements.length; i ++) {
Integer value = i + 1;
Class[] interfaces = value.getClass().getInterfaces();
InvocationHandler handler = new TraceHandler(value);
Object proxy = Proxy.newProxyInstance(null, interfaces, handler);
elements[i] = proxy;
}
Integer key = new Random().nextInt(elements.length) + 1;
int result = Arrays.binarySearch(elements, key);
if (result >= 0)
System.out.println(elements[result]);
}
}
class TraceHandler implements InvocationHandler {
private Object target;
public TraceHandler(Object t) {
target = t;
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
System.out.print(target);
System.out.print("." + m.getName() + "(");
if (args != null) {
for (int i = 0; i < args.length; i ++) {
System.out.print(args[i]);
if (i < args.length - 1) {
System.out.print(",");
}
}
}
System.out.println(")");
return m.invoke(target, args);
}
}