2011-03-15 24 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描述符配置。