2011-03-15 63 views
0
<% User loginUser = (User)session.getAttribute("loginUser"); 
int userlevel = Integer.parseInt((request.getAttribute("userlevel")).toString()); 
String status = (String)request.getAttribute("formstatus"); 
%> 

我必须包括 在同一页上例如JSP重复局部变量而基于用户级部署tomcate

<% 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 
} 

Ë再次 如下verything运行在日食不错,但在Tomcat阿帕奇 部署时,它提供了错误

org.apache.jasper.JasperException:无法编译类JSP:2:在行发生

错误JSP文件:/jsp-page/apr-part3.jsp 重复的局部变量loginUser

我怎样才能避免这些错误

+0

当您发布您的问题时,请在{}中放置编程代码 – 2011-03-15 12:16:38

回答

3

@include将包含在产品在编译期间使用JSP。所以它基本上是在同一块Java代码中结束的。您有2个选项:

  • 改为使用<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

这是一个小问题,因为它涉及到您的问题标题,但不是您的示例代码体。

与scriptlet一起使用标签时也会发生此问题。我知道,我知道,这不是最好的做法,但它发生了。至少在WebLogic 10.2.3中就是这种情况。

的情况出现,如果你有一个标签,增加了一个变量页上下文消费的JSP中,如:

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

    return EVAL_BODY_INCLUDE; 
} 

如果再使用JSP与中声明scriptlet中一个变种与上下文中的属性名称相同的名称,则会在jsp编译中获得重复的本地变量错误。例如:

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

原因是,JSP的编译Servlet包含注入标签代码和样板代码其实已经创建了一个“字符串MYVAR”从页面上下文所采取的属性值。所以,你的scriptlet声明实际上是多余的,因为数据已经可用。

检查预编译的servlet以检查Web应用程序中的WEB-INF/weblogic.xml jsp描述符配置。