Как отладить JSTL?
Я использую SpringSource Tool Suite (с Roo) и добился определенного успеха.
Что меня беспокоит, так это то, что я не знаю, как отлаживать библиотеку тегов.
Я могу добавить точки останова, но он никогда не останавливается на них.
То, что я ищу, - это дамп всех текущих переменных в контексте.
До сих пор я делал что-то вроде:
<c:forEach items="${data}" var="item">
<c:out value="${item}"></c:out><br />
</c:forEach>
К сожалению, это трудно читать, а также не очень просто.
Что я могу сделать, чтобы улучшить это?
Ответы
Ответ 1
Извините, но вы не можете поместить точки отладки в файл, содержащий разметку. В этом случае определение библиотеки тегов выполняется в виде разметки. Таким образом, вместо отладки вы получаете поддержку только для проверки.
Исключением будет файл Java Server Pages (JSP), который будет преобразован в сервлет (программный код) во время выполнения.
Отладка возможна только для сценариев и кода, которые имеют определенную последовательность выполнения.
Лучший способ преодолеть это - тщательно изучить документацию и постепенно внедрять теги после получения знаний о XML или соответствующем языке разметки.
Ответ 2
Это всегда было сложно, потому что будущие посетители этого вопроса добавили мои 2 цента
если вы поместите точку прерывания на jsp в Eclipse на строке
Ответ 3
Вы можете написать собственный тег, который обращается к контексту spring и выгружает текущие переменные. Вы также можете написать собственный тег (или теги), которые выгружают содержимое областей приложения, сеанса, страницы и запроса.
взгляните на API Java EE 6. Посмотрите SimpleTag, чтобы начать реализацию тега. Вот ссылка на раздел пользовательского тега в учебнике Java EE 5.
Пример (область запроса сбрасывания):
class MyTag extends TagSupport
{
public int doEndTag()
{
Enumeration attributeNames;
Object attributeValue;
String currentName;
int nameIndex;
Iterator nameIterator;
JspWriter pageOut = pageContext.getOut();
ServletRequest request = pageContext.getRequest();
attributeNames = request.getAttributeNames();
nameIterator = parameterNames.iterator();
while (nameIterator.hasNext())
{
currentName = nameIterator.next();
attributeValue = request.getAttributeValue(currentName);
pageOut.print("<div><span>Name: <span>");
pageOut.print(currentName);
pageOut.print("</span></span><span>Values: ");
pageOut.print("<span>");
pageOut.print(attributeValue.toString());
pageOut.print("</span>");
pageOut.print("</span></div>");
}
}
}
Вы можете использовать pagecontext.getAttributeNamesInScope(int scope), чтобы получить атрибуты для каждой области. Области (определенные в классе PageContext): APPLICATION_SCOPE, PAGE_SCOPE, REQUEST_SCOPE и SESSION_SCOPE.
Ответ 4
Я делаю, как сказал DwB, и теперь я могу дать более подробную информацию о том, как сбрасывать переменные в jstl.
сначала создайте пользовательский тег, вот код.
public class JSTLElDumpTag extends TagSupport {
@Override
public int doStartTag() throws JspException {
JspWriter out=pageContext.getOut();
try{
//out request attribute
ServletRequest request=pageContext.getRequest();
Enumeration it=request.getAttributeNames();
out.print("<div><h2>request scope</h2>");
while(it.hasMoreElements()){
Object next=it.nextElement();
out.print("<div>"+next+":"+request.getAttribute(next.toString())+",value type:"+request.getAttribute(next.toString()).getClass().getName()+"</div>");
}
out.print("</div>");
return super.doStartTag();
} catch (IOException e){
throw new JspException("Io exception occurred ");
}
}
}
в приведенном выше коде я сбросил все переменные запроса, включил его имя, значение и тип. Я думаю, что тип очень важен, когда мы имеем дело с числами.
Далее нам нужно настроить наш tld файл.
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>date</short-name>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<name>eldump</name>
<tag-class>JSTLElDumpTag</tag-class>
<body-content>JSP</body-content>
</tag>
настройте этот файл tld в файле web.xml
<jsp-config>
<taglib>
<taglib-uri>/tags</taglib-uri>
<taglib-location>/WEB-INF/datetag.tld</taglib-location>
</taglib>
</jsp-config>
имя файла tld: datetag.tld
теперь мы можем использовать в нашем файле jsp
<%@taglib prefix="bw" uri="/tags" %>
поставьте выше в заголовке вашего jsp файла, а в конце вашего jsp файла вы используете
<bw:eldump></bw:eldump>
чтобы сбрасывать ваши переменные.
Что я должен объявить, так это то, что в некоторых случаях нам нужно выгрузить переменные в файле jsp, которые были объявлены с помощью jset-тега cset, вы должны добавить атрибут scope = request при установке переменных или вышеописанный способ не сбрасывать эти переменные.
Надеюсь, это поможет вам, и если вы найдете некоторые ошибки в моем посте, ваше уведомление будет искренне оценено.