證人和證據的關係:一個證人對應多個證據。
該關係使用了動態枚舉的方式,在建立一個案件的證據時,可以在證人信息的編輯界面,使用複選框組的形式,顯示所有的證據信息。在編輯證人信息時,需要選擇與其相關
的證據。
在數據庫中,證人表爲t_jud_witness,其中proofs字段是與證據相關的。在選取多個證據之後,將會把證據的id存放進去,多個id之間使用“,”作爲間隔。
以此爲前提:
在證人表的list界面中,需要顯示與該證人相關的證據信息。效果:“證據1,證據2,證據3”。
在使用<Combox:combox>時出現一個問題,雖然成功顯示了證據的名字,但是在每個名字後多了一個空格。查詢數據庫發現,數據庫中存放的數據正確,並沒有空格存在。
查詢原因發現,該現象是因爲使用combox標籤時,doTag方法裏面使用的是println的方式進行輸出的。 也就是說,默認換行輸出。 在list界面中出現的這個空格,打開網頁源代碼
可以看到是換行所致。
下面的代碼可解決問題:
<c:set var="n">\n<c:set>
<c:if test="${tjudWitness.proofs != null}">
<c:set var="objectIds" value="${fn:split(tjudWitness.proofs, ',')}" />
<c:forEach items="${objectIds}" var="objectId" varStack="k">
<c:set var="proofName">
<Combox:Combox rname="proof_names" isLabl="99" hql="select t.id, t.proofName from TjudProof t where t.id='${objectId}'" rvalue="${objectId}" />
</c:set>${fn:replace(proofName, n, "")}${k.index < fn:length(objectIds)-1 ? ',' : ''}
<c:forEach>
</c:if>
這竄代碼的意思是:
1.在證據字段不爲空時,把證據的多個id拆分,並且存放近objectIds裏面。
2.對所有證據的id進行遍歷,其中每一項命名爲objectId,varStack設置爲k
3.使用combox標籤內的hql語句將所有的證據的名字列出,基本功能到此完成。
4.使用fn:replace將所有的換行字符替換爲空字符串,使用<c:set>將"\n"設置爲"n",否則使用replace時會報錯,不能正確識別。 並且使用<c:set>標籤,將查詢出來的
(證據 1 ,證據2, 證據3 )設置爲proofName方便替換。
5.k的作用是拼接逗號,保證除最後一個證據外,每個證據後邊都會有一個逗號。
整個過程就是這樣,雖然不是自己寫出來的。但是經過仔細的分析,已經搞懂了。