ปัญหาในการดึงค่าจาก TreeMap ของ ‹id, beans› ใน JSP

ฉันประสบปัญหาในการพยายามดึงค่าจาก treeMap ที่มีอยู่มาระยะหนึ่งแล้ว ฉันได้ลองหลายวิธีในการเข้าถึงข้อมูล แต่วิธีที่ไกลที่สุดที่ฉันได้รับคือให้ JSP ยอมรับว่ามีแฮชหรือแผนผังต้นไม้ แต่ไม่ได้วนซ้ำและส่งคืนข้อมูลจริงๆ

ฉันพยายามค้นหาวิธีที่ดีที่สุดในการจัดเรียงผลลัพธ์ xml โดยพื้นฐานตามแอตทริบิวต์ tag ดังนั้นฉันจึงนำ xml และใส่ค่าของแต่ละรายการลงใน bean จากนั้นจึงนำถั่วไปวางในแผนผังต้นไม้โดยที่ Key=SortId เนื่องจาก treema เรียงลำดับผลลัพธ์โดยอัตโนมัติ จึงเป็นแผนผังที่เรียงลำดับของค่า XML จำนวนประชากรของ bean และ treeMap ทำงานได้ดี ปัญหาคือการดึงค่าเหล่านั้นออกมาใน JSP

บางทีการแสดงแผนที่ผลลัพธ์ของฉันให้ดีขึ้นอาจช่วยอย่างน้อยให้เข้าใจถึงสิ่งที่ฉันพยายามจะได้ เป้าหมายคือการวนซ้ำรายการที่เรียงลำดับใหม่และเติม div ของฉันด้วยสิ่งที่ต้องการ

<div>
Name: ${tileName} <br />
Description: ${tileDescrip} <br />
<img scr="${imagePath}">
</div>

แผนที่ต้นไม้ที่ได้จะมีลักษณะเช่นนี้

เรียงลำดับแฮช

{0, bean(tileName,tiledescrip,imagePath)}
{1, bean(tileName,tiledescrip,imagePath)}
{2, bean(tileName,tiledescrip,imagePath)} 

ปัญหาของฉันคือด้วยโค้ดด้านบน ฉันไม่ได้รับค่าใด ๆ ที่ส่งคืนจากการวนซ้ำระดับแรกของแผนที่ แม้ว่าการส่งออกแผนที่จะแสดงอยู่ที่นั่นที่

sortedHash = CTTeamsiteXMLHash@135b24b 

ดังนั้นกระแสหลอกของสิ่งที่ฉันทำ

Read XML
- Iterate
     -Parse XML Values to bean
  -Place bean in Treemap<SortId, XML-Bean>
-Return TreeMap
-Loop through treemap and then pull each bean value out. 

นี่คือตัวอย่าง XML

<teaser>
<sort>1</sort>
<value1></value1>
<value2></value2>
</teaser>

องค์ประกอบของฉัน

public class CTTeamsiteXMLHash {


private HashMap<String, Object> xmlHash;
private TreeMap<String, Object> sortedHash;


public TreeMap<String, Object> getSortedHash() {
 return sortedHash;
}

public void setSortedHash(TreeMap<String, Object> sortedHash) {
 this.sortedHash = sortedHash;
}

public void setXmlHash(String sortOrder, CTTeamsiteXMLBean bean) {
 getXmlHash().put(sortOrder, bean);

}

public HashMap<String, Object> getXmlHash() {
 return xmlHash;
}

นี่คือความพยายามที่ล้มเหลวของฉันในการเข้าถึงจาก JSP ถ้ามันช่วยได้ ฉันจะส่ง sortedHash ในคำขอด้วย

     <jsp:useBean id="sortedHash" class="CTTeamsiteXMLHash"
 scope="request"/>
     <c:forEach items="${sortedHash.sortedHash}"
 var="eachItem">
       <c:forEach items="${eachItem.value}"
 var="anItem">
          <c:out value="${anItem.tileName.value}" /> :
 <c:out
 value="${anItem.tileDescrip.value}" />
       </c:forEach>
     </c:forEach>

person QUEdini    schedule 13.12.2010    source แหล่งที่มา
comment
ข้อกำหนดด้านการทำงานไม่ชัดเจน และโค้ดไม่ได้จัดทำเป็นเอกสารด้วยตนเองจริงๆ และตัวอย่างของความพยายามที่ล้มเหลวไม่ได้ช่วยอะไรมากนักในการทำความเข้าใจข้อกำหนด ฉันขอแนะนำให้แก้ไขคำถามของคุณเพื่ออธิบายข้อกำหนดการทำงานโดยละเอียดและ/หรือเพิ่มตัวอย่างในรหัสเทียมหรือโค้ด Java ปกติว่าคุณต้องการวนซ้ำบนแผนที่อย่างไรโดยใช้ for loop เป็นต้น วิธีนี้ทำให้แปลเป็นแนวทาง JSTL ได้ง่ายขึ้น   -  person BalusC    schedule 13.12.2010
comment
ขออภัย ลืมไปว่าทุกคนไม่ได้ดูแบบเดียวกับผมในช่วง 2 วันที่ผ่านมา ฉันได้อัปเดตคำอธิบายของฉันแล้ว หวังว่าจะช่วยให้กระจ่างเกี่ยวกับสิ่งที่ฉันพยายามทำ   -  person QUEdini    schedule 13.12.2010


คำตอบ (1)


แม้จะมีการอัปเดตคำถาม แต่ฉันก็ยังไม่เข้าใจสิ่งที่คุณต้องการในด้านมุมมอง ทุกอย่างคลุมเครือเกินไป

อย่างไรก็ตาม การวนซ้ำ c:forEach ทุกครั้งบน Map จะทำให้คุณได้รับ Map.Entry ซึ่งมีวิธีการ getKey() และ getValue()

นี่คือตัวอย่างพื้นฐาน:

<c:forEach items="${map}" var="entry">
    key = ${entry.key}, value = ${entry.value}<br>
<c:forEach>

ความรู้นี้ควรช่วยให้คุณเริ่มต้นได้

ดูสิ่งนี้ด้วย:


อัปเดต: ฉันยังไม่เข้าใจว่าคุณกำลังทำอะไรกับแผนที่ สอง และทำไมคุณถึงต้องใช้ Map แทนที่จะเป็น List เนื่องจากดูเหมือนคุณจะไม่สนใจ ในกุญแจ ต่อไปนี้คือตัวอย่างที่มีแผนที่เดียวและคลาสเซิร์ฟเล็ตแบบธรรมดาซึ่งกำลังประมวลผลคำขอล่วงหน้า

ก่อนอื่นคลาส (แบบง่าย) Tile:

public class Tile {
    private String name;
    private String description;
    private string imagepath;
    // Add/generate c'tor/getters/setters/etc.
}

เซิร์ฟเล็ตการประมวลผลล่วงหน้า:

Map<Integer, Tile> map = new TreeMap<Integer, Tile>();
map.put(1, new Tile("name1", "description1", "imagepath1"));
map.put(2, new Tile("name2", "description2", "imagepath2"));
map.put(3, new Tile("name3", "description3", "imagepath3"));
// ...

request.setAttribute("map", map); // It'll be available as ${map} in JSP.
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);

เจเอสพี:

<c:forEach items="${map}" var="entry">
    <div>
        Map key: ${entry.key}<br>
        Tile name: ${entry.value.name}<br>
        Tile description: ${entry.value.description}<br>
        Tile image: <img src="${entry.value.imagepath}">
    </div>
</c:forEach>

(ยังไงก็ไม่จำเป็นต้องใช้ jsp:useBean)

person BalusC    schedule 13.12.2010
comment
บางทีการแสดงแผนที่ผลลัพธ์ของฉันให้ดีขึ้นอาจช่วยอย่างน้อยให้เข้าใจถึงสิ่งที่ฉันพยายามจะได้ ผลลัพธ์แผนผังต้นไม้จะเป็นดังนี้ ‹pre›‹code›{Key, value}‹br/› {0, bean(tileName,tiledescrip,iagePath)} - {1, bean(tileName,tiledescrip,iagePath)} - {2 , bean(tileName,tiledescrip,iagePath)}‹/code›‹/pre› ‹br/› . ปัญหาของฉันคือด้วยโค้ดด้านบน ฉันไม่ได้รับค่าใด ๆ ที่ส่งคืนจากการวนซ้ำระดับแรกของแผนที่ แม้ว่าการส่งออกแผนที่จะแสดงอยู่ที่นั่นที่ sortedHash = CTTeamsiteXMLHash@135b24b - person QUEdini; 13.12.2010
comment
คุณต้องเข้าถึงคุณสมบัติ bean เช่น ${entry.value.tileName} - person BalusC; 13.12.2010
comment
ปัญหาที่ฉันยังพบอยู่คือ forEach ของฉันไม่ยอมรับแผนที่ด้วยเหตุผลบางอย่างด้วยซ้ำ ฉันไม่ควรใช้สิ่งนี้เพื่อดึงส่วนประกอบส่วนกลางมาที่เพจหรือไม่ ‹jsp:useBean id=sortedHash class=ขอบเขต CTTeamsiteXMLHash=คำขอ/› - person QUEdini; 13.12.2010
comment
ดูการอัปเดตคำตอบ หวังว่านี่จะทำให้คุณไปในทิศทางที่ถูกต้อง ฉันรู้สึกว่าคุณกำลังทำให้สิ่งต่างๆ ซับซ้อนเกินไป - person BalusC; 13.12.2010
comment
คุณอาจพูดถูกเกี่ยวกับภาวะแทรกซ้อนที่มากเกินไป วิธีนี้ดูเหมือนว่าจะได้ผล.. ขอบคุณมาก BalusC - person QUEdini; 13.12.2010
comment
ฉันได้รับสาเหตุของ ServletException javax.servlet.jsp.JspException: เกิดข้อผิดพลาดขณะประเมินค่าแอตทริบิวต์การดำเนินการที่กำหนดเองด้วยค่า ${entry.value}: ไม่สามารถค้นหาค่าสำหรับค่าในอ็อบเจ็กต์ของคลาส java.lang.String โดยใช้ตัวดำเนินการ (null) แต่เมื่อฉันทำ ‹c:out value=${map} /› ฉันได้รับ {0=com.ctstore.utils.ui.CTTeamsiteXMLBean@5fed59, 1=com.ctstore.utils.ui.CTTeamsiteXMLBean@1d7a6ab } มีค่าอยู่ เพียงแต่ไม่ได้แมปกับ ‹c:forEach items=${test} var=entry› ‹c:out value=${entry.value} /› ‹/c:forEach› - person QUEdini; 13.12.2010
comment
โอ้ และเมื่อฉันพยายามที่จะส่งออก ${entry.value} มันส่งออกเหมือนกับข้อความ จริงๆ แล้วมันไม่ได้พยายามแก้ไขค่าภายใน ‹C:forEach› - person QUEdini; 13.12.2010
comment
${test} เป็นแผนที่ใช่ไหม ข้อยกเว้นแสดงว่าไม่ใช่ ใช้ <c:forEach items="${map}" var="entry"> แทน <c:forEach items="${test}" var="entry"> - person BalusC; 13.12.2010
comment
${test} เป็นแผนที่ในการเปลี่ยนชื่อเป็นแผนที่ c:out ยังคงแสดงค่าด้านบน แต่ฉันยังคงได้รับค่าว่างสำหรับ entry.value.. ‹c:› ควรมาจาก ‹%@ taglib uri =java.sun.com/jstl/core prefix=c %› ใช่ไหม? - person QUEdini; 13.12.2010
comment
นั่นคือ JSTL 1.0 URI โบราณ คุณต้องมี http://java.sun.com/jsp/jstl/core (พร้อมส่วน /jsp) ดูเพิ่มเติมที่คำตอบนี้ - person BalusC; 13.12.2010
comment
ขอบคุณสำหรับคำตอบที่ฉันต้องการ LK_PY_ALLOW เป็นประเภท tree map ซึ่งสามารถแฮชได้ ดังนั้น ... <c:forEach items="${LK_PY_ALLOW}" var="entry"> <c:if test="${entry.key eq param.allowC}"> ${entry.value.allowAd} </c:if> </c:forEach> - person shareef; 20.07.2013