0

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

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

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

这是我名为“success.jsp”的以下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”变量中的值。

4

3 回答 3

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 中使用:

    <%
    诠释 x=20;
    整数 y=30;
    pageContext.setAttribute("x", x);
    pageContext.setAttribute("y", y);
    %>

请注意,请注意与.<%! int x = 20; %><% int x=20; %>

于 2013-11-05T16:46:05.643 回答
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>);
}

所以。这就是为什么在您的 scriptlet 中不知道 x 和 y 的原因。但是,有一些方法可以将方法范围的变量保存到会话范围。检查一下:我可以将变量从 JSP scriptlet 传递给 JSTL,但不能从 JSTL 传递给 JSP scriptlet 而不会出错

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

于 2013-11-05T03:43:46.787 回答
0

像这样更改您的代码

var p = <%=x%>;
var q = <%=y%>;
于 2013-11-05T03:44:04.990 回答