2013-11-05 59 views
0

我是jsp的新手。我正在一個jsp頁面中編寫一個「聲明」和一個「scriptlet」。jsp頁面中的腳本元素

但我聲明,並在「小腳本」創建的變量不會在

範圍中的任何一個存儲。即頁面範圍,請求範圍,應用範圍。

這是我下面的JSP文件命名爲「的success.jsp」,

 <%! int x=20; %>//x is not created in any scope. 
    <% int y=30; %>// y is not created in any scope. 

    <script> 

    var p="${x}";//here,variable p does not get any value. 
    var q="${y}";//here,variable does not get any value. 

    </script> 

爲什麼變量「X」和「Y」不會在scope.And中的任何一個創建如何獲得存儲在「x」和「y」變量中的值。

+0

$ {x}用於EL而不是Scriptlets。 Scriptlets使用<%=x%> – developerwjk

回答

0

我認爲開始理解jsps的最好方法是將它們祕密地解釋成java類。但更具體地說:它們正在被放入一個函數中,在逐行評估每行之後逐行寫出html。因此,爲什麼你可以有<%%>標籤。現在,正因爲如此,<%%>標籤實際上是經過評估但未寫入html的行。評估結果存儲在結果java方法的範圍內。所以最後發生的事情看起來像這樣:

public void SendHtmlPage() { 
    int x=20; 
    int y=30; 

    Print("<script>"); 

    Print("var p=\"${x}\"\;"); //This gets evaluated to getSession.getAttribute("x") 
          //Since there is no x in the session, it returns null 
    Print("var q=\"${y}\"\;"); //Same here 

    Print("</script>); 
} 

所以。這就是爲什麼x和y在你的scriptlet中不知道的原因。但是,可以將方法範圍變量保存到會話範圍。看看這個:I can pass a variable from a JSP scriptlet to JSTL but not from JSTL to a JSP scriptlet without an error

祝你好運,快樂的編碼。 :)

0

改變你這樣的代碼

var p = <%=x%>; 
var q = <%=y%>; 
0

正如你提到的,由JSP-scriplet代碼<%! int x=20; %>創建的變量是不提供任何範圍,因爲它們直接編譯的JPS頁面內聲明(任何內部編譯爲servlet類的jsp頁面)。
以在JSP頁面的其餘部分使用變量X你有兩種不同的選擇:

  1. 使用jsp-scriplet表達<%= x %>,在這種情況下,你javascipt的片段中的代碼將是:

    var p =「<%= x%>」;
    var q =「<%= y%>」;

  2. 手動保存變量X,Y的pageContext範圍內,以這種方式它們變得可用從EL:

    <%
    INT X = 20;
    int y = 30;
    pageContext.setAttribute(「x」,x);
    pageContext。setAttribute(「y」,y);
    %>

作爲一個說明,要知道,<%! int x = 20; %><% int x=20; %>不同。