JSP页面中的作用域

JSP页面中的作用域,jsp,el,scriptlet,scopes,Jsp,El,Scriptlet,Scopes,我不熟悉JSP。我正在编写一个名为success.JSP的JSP页面 在我的success.jsp中,我正在创建一个字符串[]数组 <% String[] s={"A","B","C"}; request.setAttribute("a",s); %> <br> <c:forEach var="x" items="${a}"> <c:out value="${pageScope.x}"/><br>

我不熟悉JSP。我正在编写一个名为
success.JSP
的JSP页面

在我的
success.jsp
中,我正在创建一个
字符串[]
数组

  <%  String[] s={"A","B","C"};
      request.setAttribute("a",s);
   %>
  <br>
 <c:forEach var="x" items="${a}"> 
    <c:out value="${pageScope.x}"/><br>
</c:forEach>



在上面的JSP页面中,我的疑问是

  • 默认情况下,为什么“scriptlet”中的
    String[]
    数组没有在任何JSP作用域(即页面、请求、应用程序)中创建?因此,我在请求范围中显式地设置了该数组

  • 默认情况下,为什么在“页面范围”中创建变量
    x

    是什么使情景1与情景2不同

  • 是的,scriplet中的数组仅在jsp页面的编译版本中创建,在任何jsp范围中都不可用。因此,您需要在所需的范围内获取阵列,然后可以在EL中使用它,就像您所做的那样

  • 循环变量x是由JSTL for循环创建的,因此它已经在pageScope中捕获。这两种情况之间的区别在于,在一种情况下,变量是由jsp scriplet创建的,在另一种情况下,它是由JSTL标记创建的

  • 您的循环正在工作,但我认为您实际上不需要指定循环变量x的作用域,因此可以通过以下方式简化:

    <c:forEach var="x" items="${a}">
        <c:out value="${x}"><br/>
    <c:forEach>
    
    
    
    或者,更好的是:

    <c:forEach var="x" items="${a}">
        ${x}<br/>
    <c:forEach>
    
    
    ${x}
    好的,我是“那个家伙”。这就是:不要在JSP中编写java“scriptlet”。别这样。这是个可怕的主意。这是一个非常糟糕的想法,在一些web框架中有插件来强制执行,而您不这样做。