Как отладить 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 на строке

Eclipse debug for JSTL

Ответ 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 при установке переменных или вышеописанный способ не сбрасывать эти переменные.

Надеюсь, это поможет вам, и если вы найдете некоторые ошибки в моем посте, ваше уведомление будет искренне оценено.