2015-01-09 51 views
0

我正在開發一個傳統Tomcat服務器,該服務器不再由提供它的軟件開發人員支持。 web.xml不告訴我正在使用的JSP版本,但所有的.class文件都是Java 1.5。對JSP scriptlet中的選擇框項進行排序

我有一位顧客很沮喪,因爲系統有一些由Java自動填充的html框,它直接填充XML數據庫查詢的(無序)結果。我試圖將一些代碼潛入Selector的JSP中,以便在填充字段之前對字段列表進行排序,但它不起作用,我不明白爲什麼。

的(有刪節)相關代碼:

<%@ page import="src.explorer.ObjectStateFactory"%> 
<%@ page language="java" %> 
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> 


<jsp:useBean id="ExplorerViewContext" scope="session" type="src.explorer.ExplorerViewContext"/> 

... 

<c:forEach var="nc" items="${ExplorerViewContext.networkControllers}"> 
    <c:choose> 
     <c:when test="${nc.name == ExplorerViewContext.networkControllerSelection.name}"> 
      <option value="<c:out value="${selectAction}${nc.objectKey}"/>" selected><c:out value="${nc.name}"/></option> 
     </c:when> 
     <c:otherwise> 
      <option value="<c:out value="${selectAction}${nc.objectKey}"/>"><c:out value="${nc.name}"/></option> 
     </c:otherwise> 
    </c:choose> 
</c:forEach>  
     </select> 

相關的代碼我補充:

<%@ page import="src.explorer.ObjectStateFactory"%> 
    <%@ page import="java.util.*"%> 
    <%@ page language="java" %> 
    <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> 


    <jsp:useBean id="ExplorerViewContext" scope="session" type="src.explorer.ExplorerViewContext"/> 

    ... 

    <% 
    final Comparator<src.explorer.XmldbObjectState> NC_ORDER = new Comparator<src.explorer.XmldbObjectState>(){ 
     public int compare(src.explorer.XmldbObjectState nc1, src.explorer.XmldbObjectState nc2){ 
      return nc1.getName().compareTo(nc2.getName()); 
     } 
    }; 

    List myList = ExplorerViewContext.getNetworkControllers(); 
    java.util.Collections.sort(myList,NC_ORDER); 
    %> 
    <c:forEach var="nc" items="${myList}"> 
     <c:choose> 
      <c:when test="${nc.name == ExplorerViewContext.networkControllerSelection.name}"> 
       <option value="<c:out value="${selectAction}${nc.objectKey}"/>" selected><c:out value="${nc.name}"/></option> 
      </c:when> 
      <c:otherwise> 
       <option value="<c:out value="${selectAction}${nc.objectKey}"/>"><c:out value="${nc.name}"/></option> 
      </c:otherwise> 
     </c:choose> 
    </c:forEach>  
      </select> 

基本上,我試圖抓住名單和排序之前,它被髮送到HTML。問題是,myList總是空着,我不明白爲什麼。我猜測原始代碼中的ExplorerViewContext.networkControllers正在調用ExplorerViewContext實例的getNetwrokControllers()方法,是嗎?爲什麼我不能在scriptlet中做同樣的事情,並在提供之前重新格式化輸出?

回答

1

您不應將scriptlet代碼添加到僅使用JSTL的代碼中。要做的更好的事情是編輯bean類src.explorer.ExplorerViewContext以自動爲您排序內部。

在任何情況下,原因${myList}在JSTL中什麼都不做的是,在腳本中創建的變量(即在<%%>之間)對於JSTL不存在。爲了讓變量存在於JSTL中,你必須在JSTL中創建它,或者將它設置在頁面上下文中,或者它必須在會話或請求中。一般你把它放在會話或請求中的一個servlet中。

在這種情況下,您的列表位於bean中,所以最好編輯bean類來對列表進行排序。但是,你可以在這裏設置變量到頁面上下文,以便JSTL可以使用它:

<% 
... 
List myList = ExplorerViewContext.getNetworkControllers(); 
java.util.Collections.sort(myList,NC_ORDER); 
pageContext.setAttribute("myList", myList); //set in pageContext so JSTL can see it 
%> 
<c:forEach var="nc" items="${myList}"> 

至於代碼爲「遺產」,並稱小腳本,以將使其更加傳統。事實是,這段代碼比你想添加的修改更現代。但只是稍微如此,因爲使用<jsp:useBean>是使用bean的過時方式。

+0

非常感謝您的回答。毫無疑問,編輯bean將是理想的。但是,我只有beans的.class文件,我不知道反編譯是否是最好的方法。對不起,我應該澄清一點。 – Frank 2015-01-09 20:12:55

+0

@Frank,好吧,如果你沒有代碼,你必須做你必須做的事情。事實是,我不像大多數人在這裏那樣對腳本不利。我可以看到一個案例,如果它完成而不是雜亂的使用它們。 – developerwjk 2015-01-09 21:20:11

相關問題