jsp页面中的脚本元素

时间:2013-11-05 03:33:48

标签: jsp el scopes

我是jsp的新手。我在jsp页面中写了一个“声明”和一个“scriptlet”。

但我在声明和“scriptlet”中创建的变量不会存储在任何一个

范围。即页面范围,请求范围,应用范围。为什么。

以下是我的以下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”不会在任何一个范围内创建。如何获取存储在“x”和“y”变量中的值。

3 个答案:

答案 0 :(得分:0)

我认为开始理解jsps的最好方法是将它们秘密地解释为java类。但更具体地说:在评估每一行之后,它们被放入一个逐行写出html的函数中。因此,为什么你可以拥有&lt; %%&gt;标签。现在,正因为如此,&lt; %%&gt;标签实际上是已评估但未写入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>);
}

因此。这就是为什么在你的scriptlet中不知道x和y的原因。但是,有一些方法可以将方法作用域变量保存到会话范围。看看这个:I can pass a variable from a JSP scriptlet to JSTL but not from JSTL to a JSP scriptlet without an error

祝你好运,编码愉快。 :)

答案 1 :(得分:0)

像这样更改您的代码

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

答案 2 :(得分:0)

正如您所指出的,jsp-scriplet代码 <%! int x=20; %>创建的变量在任何范围内都不可用,因为它们直接在编译的jps页面内部声明(任何内部编译为servlet类的jsp页面)。
要在jsp页面的其余部分中使用变量 x ,您有两个不同的选项:

  1. 使用jsp-scriplet表达式<%= x %>,在这种情况下,javascipt片段中的代码将是:

    var p =“&lt;%= x%&gt;”;
    var q =“&lt;%= y%&gt;”;

  2. pageContext 范围内手动保存变量 x,y ,这样它们就可以从EL中获取:

    &LT;%
    int x = 20;
    int y = 30;
    pageContext.setAttribute(“x”,x);
    pageContext.setAttribute(“y”,y);
    %GT;

  3. 请注意,<%! int x = 20; %><% int x=20; %>不同。