jsp腳本、jsp聲明、jsp輸出表達式、javascript、jsp標籤、struts2標籤、struts2 action傳值問題 .

開發過程當中經常遇到值的傳遞問題,不勝其擾,今天寫出一些認識,也可能有的認識是錯的,也請看到的大俠給指出來。文中用了很多書上和網上的例子,在此先謝過,就不一一指出了。javascript

 1. 先界定一下題目中概念。java

(1)jsp腳本:有的地方也叫java腳本,指用<%%>括起來的jsp頁面中的java腳本。全部能在java程序中執行的代碼,均可以經過jsp腳本執行。tomcat

(2)jsp聲明:用<%!聲明部分%>形式聲明的變量和方法。能夠直接用在jsp腳本中。jsp

(3)jsp輸出表達式:用<%=表達式%>輸出表達式的值,效果與jsp腳本中的out.println相同。表達式後面不能有分號。ide

(4)javascript:頁面中<script></script>之間的代碼,簡稱js。js插入的位置不一樣,執行效果也不一樣。放在<head>中的js調用時才執行,而放在<body>部分的在網頁讀到這部分時就會執行。也能夠像添加外部CSS同樣添加外部javaScript腳本文件,其後綴一般爲.js。例如:code

<head>orm

         <script src="example.js"></script>對象

</head>ip

(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"/>"