以前經常寫的代碼,過一了段時間再寫發現了一些問題,說明了自己對代碼的理解不夠。總結如下:
一:
編輯某一條記錄,點擊“編輯”按鈕,當打開的是一個新的頁面(如模態框)時,想到記錄的ID傳到打開的頁面去。因為打開的頁面與原來操作的頁面不是同一個window,所以當執行點擊“編輯”按鈕操作時,沒辦法把值賦給打開的頁面的元素(如隱藏元素)。如:
$("PHONE_LIST_ID").value = phone_list_id//這種作法是不行的,取不到$("PHONE_LIST_ID"),因為操作的頁面與$("PHONE_LIST_ID")所在的頁面不是同一個頁面。
這時,可以用URL參數傳遞的方法,如下:
Js代碼
url = "/epub_web/jsp/phone_list_mgr/get_classify_phone.do?PHONE_LIST_ID="+serial_num;
window.showModalDialog(url,'',"dialogWidth=600px;dialogHeight=400px");
在打開的JSP頁面裡用:value="<%=request.getParameter("PHONE_LIST_ID")%>",如下:
Html代碼
<input type="hidden" name="PHONE_LIST_ID" id="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"></input>
所以,通過url參數傳遞的方式,可以實現跨頁面的參數傳遞,而不用用隱藏域來傳遞。這在跨頁面的參數傳遞中,特別是類似於對記錄的編輯操作等,可以很好地適用.
二:
上面第一點的:
<input type="hidden" name="PHONE_LIST_ID" id="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"></input>
這行代碼我原來是用<html:hidden>,如下:
<html:hidden property="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"/>
因為我本機是在jboss的環境,但是當拿到webspheer的環境下卻有提示錯誤,以前好像就有發現這個情況,也不知道是為什麼,先記錄下來。
三:
由於粗心,在xml配置時,<action path="" type="" name="" scope="" parameter=""></action>中把name=""這個屬性漏掉了,所以程序跑起來時,在servlet端的ActionForm老是提示為null,這發了一些時間。以後有時間的時候好好弄清楚struts的配置的屬性的作用。
四:
在servlet端,用struts的ActionForm自帶的get和set方法時,發現前台沒有set成功。後來查了很久才知道,前台沒有用struts自帶的html標簽,如<hmtl:text>我就直接用<input type="text"/>,所以struts認不到,在action端用set方法當然前台沒有反應了。以前也遇到過這些問題,時間一久就忘了,所以還是需要做些記錄。
五:
數據庫裡字段用char與varchar2不同,有些人喜歡用char,比如用char(2),如果值是'1'的話,那麼在數據庫裡後面還有個空格。所以,當在action端用set方法時並沒有得到我們想要的結果,出現這種
情況時,有如下幾種解決方法
1.一是設計數據庫的人只有在確定值是確定位數時才用char,否則都用varchar2。
2.二是在寫sql語句時用trim()方法來截掉空格。
3.三是在取到有空格數據時用substr來處理。
六:
關於checkbox,一般我們都是用一個name來構成一個checkbox數組,這樣因為是一個數組,每次就只能選中一個值。一般用循環來處理每個checkbox元素,如下:
Js代碼
function getRadioValue(objRadio){
var resultValue;
var j = objRadio.length;
for(var i=0;i<j; i++){
if(objRadio[i].checked) resultValue = objRadio[i].value;
}
return resultValue;
}
function isChecked(radioObj){
resultChecked = false;
for(var i=0;i<radioObj.length;i++){
if(radioObj[i].checked){
resultChecked = true;
break;//這裡是break退出循環並繼續往下執行,而不是return。
}
}
return resultChecked;
}
七:
很經常,我們需要多個引號來構造,這些引號可能嵌套,這種寫法很容易很錯。注意以下幾點:
1.可以適當地把一些拿出來構成一個函數來引用,引用可以減少引號的使用。
2.單引號裡面可以用多引號,同樣,多引號裡面也可以用單引號,而不需要轉義。
3.轉義符可以一直嵌套下去,比如\\"\\"需要嵌套的時候可以\\\"...\\\"。
4.可以用"來代替引號。
例子如:
Js代碼
document.write("<span style=\"width:100;background-color:yellow\" onclick=alert("test") onmouseover='status=\"abcd\\\"defg\\\"hijk\"'>test</span><br>");
八:
jsp端與action端交互,常常用如下方法:
(1).前台發送一個ajax請求,後台處理請求後返回一個jsp頁面,前台用得到的jsp頁面的html代碼賦值給需要顯示的元素,如div等。如:
Js代碼
pars = "ENGAGE_INFO_ID="+$F("ENGAGE_INFO")+"&ENGAGE_DTS_IDLIST="+projCommJs.getCheckboxValue();
new Ajax.Request(this.modulePath+"addtoInfo.do",{
parameters:pars,
onCreate:function(){
},
onComplete:function(returnStr){
$("Engagediv").innerHTML = returnStr.responseText;
$("btnRefresh").fireEvent("onclick");
}
}
);
(2).前台發送一個ajax請求,後台處理請求後並不是返回一個jsp頁面,而是構造一個html代碼,再把這個html代碼發送到前台。
Java代碼
public static void responseText(HttpServletResponse res, String s){
//指定內容類型
res.setContentType("text/html;charset=GBK");
//禁止緩存
res.setHeader("Pragma","No-cache");
res.setHeader("Cache-Control","no-cache");
res.setDateHeader("Expires", 0);
try {
PrintWriter out = res.getWriter();
out.print(s);
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
3).前台發送請求,後台把需要在前台顯示的值放在request或session中,前台可以用標准的jsp標簽或自定義標簽來分析request或session中的值來進行顯示。這部分的內容可以看看書jsp與servlet的書,如:oreilly.JSP設計第二版等書。
九:
在前台發送ajax請求時,參數如果是一個表單,表單裡有很多的元素,這時候不需要一個個去寫,可以用Form.serialize(),如下:
Js代碼
var pars = encodeURI(Form.serialize(document.forms[0]));
用這種方式傳遞到action端後,因為參數是經過編碼的,所以,在action端需要解碼,而不能只是能過request.getParameter()來取值。(如果前台是如form.submit()或是沒有編碼的參數傳遞過來就不需要),要不然漢字會是亂碼。如下:
Java代碼
private String urlDecode(String str) throws Exception{
try{
str = java.net.URLDecoder.decode(str, "UTF-8");
}catch (Exception ex){
System.out.println(ex.getMessage());
ex.printStackTrace();
}
return str;
}