開發過程中常常遇到值的傳遞問題,不勝其擾,今天寫出一些認識,也可能有的認識是錯的,也請看到的大俠給指出來。文中用了不少書上和網上的例子,在此先謝過,就不一一指出了。
1. 先界定一下題目中概念。
(1)jsp指令碼:有的地方也叫java指令碼,指用<%%>括起來的jsp頁面中的java指令碼。所有能在java程式中執行的代碼,都可以通過jsp指令碼執行。
(2)jsp聲明:用<%!聲明部分%>形式聲明的變數和方法。可以直接用在jsp指令碼中。
(3)jsp輸出運算式:用<%=運算式%>輸出運算式的值,效果與jsp指令碼中的out.println相同。運算式後面不能有分號。
(4)javascript:頁面中<script></script>之間的代碼,簡稱js。js插入的位置不同,執行效果也不同。放在<head>中的js調用時才執行,而放在<body>部分的在網頁讀到這部分時就會執行。也可以像添加外部CSS一樣添加外部javaScript指令檔,其尾碼通常為.js。例如:
<head>
<script src="example.js"></script>
</head>
(5) 剩下的幾個好像就沒有必要解釋了,在此略過。
2. jsp指令碼、jsp聲明、jsp輸出運算式之間
jsp聲明中聲明的變數和方法對應於Servlet中的成員變數和方法(可以從tomcat的work\Catalina\localhost目錄下找到轉換成的類)。可以在jsp指令碼和jsp輸出運算式中直接使用。
jsp指令碼中定義的變數也可以在jsp輸出運算式中使用。例如:
<!-- 下面是JSP聲明部分 -->
<%!
public int count;
public String info()
{ return "hello";}
%>
<%
Integer i=10;
out.println(count++);
%>
<%
out.println(info());
%>
<%=count++%>
<%=info()%>
<%=i%>
3. jsp標籤、struts2標籤和javascript之間
用var orgIP=document.getElementById("address").value之類在javascript中擷取標籤的值。不同的標籤方法讀取值可能會不同。例如,struts2的autocompleter就需要用下面的方式獲得。
var completer=dojo.widget.byId("name");
var organizationName=completer.comboBoxSelectionValue.value;
而getElementByName使用者擷取一組同名的標籤。
也可以在javascript中設定標籤的值。例如:
document.getElementById("code").value="test";
4. jsp指令碼、struts2 action之間
jsp指令碼要訪問struts2 action傳過來的變數,要用到ValueStack。例如:
<%
ValueStack vs = (ValueStack) request.getAttribute("struts.valueStack");
User user=(User)vs.findValue("user");
String name=vs.findValue("name");
%>
其中,user和name是action中定義的成員變數,並有對應的getter和setter方法。
5. jsp標籤、struts2標籤、struts2 action之間
struts2 action要訪問jsp標籤、struts2標籤的值,需要有和標籤同名的變數,並有對應的getter和setter方法,這是struts2的傳值機制。當然,struts2 action傳值給result中轉向的jsp頁面中的jsp標籤、struts2標籤時,也使用同名機制。注意,值的傳遞是單次的,也就是說,如果jsp1->action1->jsp2,jsp1隻能傳值給action1。
jsp標籤、struts2標籤通過頁面中的form或s:form將值傳遞給action,action通過setter方法或直接給與標籤同名的action成員變數賦值的方法將值傳遞給jsp頁面。
1)對jsp標籤來講,需要使用<s:property>訪問action傳來的值。例如:
<input name="name" type="text" class="form_field_default" size="50" id="name" value="<s:property value="user.name"/>" >
<input name="name" type="text" class="form_field_default" size="50" id="name" value="<s:property value="name"/>" >
前者傳過來的user是對象,有name屬性;後者傳過來的name是簡單類型資料,如string。
2)對struts2標籤來講,需要%{變數}的方式訪問傳來的值。例如:
<s:textfield name="name" id="name" size="40" value="%{user.name}"> </s:textfield>
<s:textfield name="name" id="name" size="40" value="%{name}"> </s:textfield>
6. jsp輸出運算式、struts2 action之間
jsp輸出運算式也可以直接輸出struts2 action傳來的值。例如:
<%=pageNum * pageSize%>
其中,pageNum和pageSize是struts2 action傳來的值。
7. javascript訪問struts2 action傳來的資料
使用s:property讀取即可。下例中,smsUnit是從action傳過來的變數。
document.getElementById("smsUnit").value="<s:property value="smsUnit"/>"
暫時想到這些,遺漏的以後再補充吧。