У меня есть сервлет jsp, который запрашивает базу данных и возвращает строку xml, а затем устанавливает ее как атрибут сеанса, используя
session.setAttribute("directoryInfo", xmlString);
Затем я пытаюсь получить атрибут и проанализировать его с помощью jstl с помощью этого кода:
function renderResults(){
var xmlString = <%=(String) session.getAttribute("directoryInfo")%>
document.write("<ul class ='list'>");
<x:parse xml="${xmlString}" var="output"/>
<x:forEach select="$output/person">
<x:set var="uid" select="string($output/person/@uid)"/>
document.write("<li>uid: " + $uid + "</li>");
</x:forEach>
}
Когда я развертываю его на tomcat, я сразу получаю сообщение об ошибке:
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: org.xml.sax.SAXParseException; systemId: jstl :; lineNumber: 1; columnNumber: 1; Преждевременный конец файла.
Я думаю, что это имеет какое-то отношение к тому, как я передаю переменную.
Примечание: @uid - это атрибут в теге "person" в строке xml.
Ваша проблема заключается в том, что вы пытаетесь использовать переменную JavaScript в серверном коде.
Вы должны уметь
<x:parse xml="${directoryInfo}" var="output"/>
или для конкретной целевой сессии, которую вы можете сделать
<x:parse xml="${sessionScope.directoryInfo}" var="output"/>
JavaScript ничего не значит для серверных языков, они просто рассматриваются как общий текст.
var xmlString = "<%=(String) session.getAttribute("directoryInfo")%>"
как вы делали раньше (просто обратите внимание на кавычки), а затем использовать Javascript для анализаxmlString
. Опять же, вам нужно узнать разницу между серверным и клиентским кодом. Javascript может работать только в клиентском браузере, и на данный момент JSTL отсутствует. Страница была сгенерирована и отправлена клиенту. Клиент тогда имеет дело только со статическим HTML