JSP在部署tomcat时复制局部变量

时间:2011-03-15 12:13:14

标签: jsp

<% User loginUser = (User)session.getAttribute("loginUser");
int userlevel = Integer.parseInt( (request.getAttribute("userlevel")).toString());
String status = (String)request.getAttribute("formstatus");
%>

基于userlevel我必须在同一页面上包含不同的文件 例如

 <% if(userlevel > 2){ %>
                                          <%@include file="apr-part3.jsp"%>
                                    <%}else{ %>
                                        You have not permission to view this part
                                    <% } %>

apr-part3.jsp页面中,某些部分对于用户3和4是常见的 我必须再次检查apr-part3.jsp中的用户级别,如下所示 在apr-part3.jsp

<% User loginUser = (User)session.getAttribute("loginUser");
int userlevel = Integer.parseInt( (request.getAttribute("userlevel")).toString());
String status = (String)request.getAttribute("formstatus");
%>
<% if(userlevel==3){
     do something
}if(userlevel==4){
do something
}

在eclipse中运行正常,但在tomcat apache上部署时 它给出了错误

  

org.apache.jasper.JasperException:无法为JSP编译类:

     

jsp文件中的第2行:/jsp-page/apr-part3.jsp发生错误   重复的本地变量loginUser

如何避免这些错误

2 个答案:

答案 0 :(得分:3)

@include将在编译期间包含JSP。所以它基本上都在同一个Java代码块中。您有两个选择:

  • 请改用<jsp:include>
  • 摆脱apr-part3.jsp
  • 中的重新声明

更好的是,只使用JSTL / EL。

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:choose>
    <c:when test="${userlevel > 2}">
        <jsp:include page="apr-part3.jsp" />
    </c:when>
    <c:otherwise>
        You have not permission to view this part.
    </c:otherwise>
</c:choose>

同样,请求属性loginUser${loginUser}提供,status提供${formstatus}。另请参阅How to avoid Java code in JSP files?

答案 1 :(得分:1)

这是一个小问题,因为它与您的问题标题相关,但不是您的示例代码体。

使用带有scriptlet的标记时也会发生此问题。我知道,我知道,这不是最佳实践,但它发生了。至少在WebLogic 10.2.3中就是这种情况。

如果你有一个标签将一个变量添加到页面上下文以便在jsp中使用,就会出现这种情况,例如:

public int doStartTag() throws JspException {
    String myvar = ...;
    pageContext.setAttribute("myvar", myvar);

    return EVAL_BODY_INCLUDE;
}

如果然后在使用jsp中的scriptlet中声明var,并且在上下文中使用与属性名称相同的名称,那么在jsp编译中会出现重复的局部变量错误。例如:

<%
    String myvar = (String)pageContext.getAttribute("myvar");
    ...
 %>

原因是jsp编译的servlet包含注入的标记代码和样板代码,实际上已经创建了一个“String myvar”,其中包含从页面上下文中获取的属性值。因此,您的scriptlet声明实际上是多余的,因为数据已经可用。

检查预编译的servlet以检查(webapp中的WEB-INF / weblogic.xml jsp-descriptor配置)。