Как отлаживать JSTL? - PullRequest
       38

Как отлаживать JSTL?

15 голосов
/ 04 августа 2011

Я использую SpringSource Tool Suite (с Roo) и добился определенного успеха.Что меня беспокоит, так это то, что я не знаю, как отлаживать содержимое библиотеки тегов.

Я могу добавить точки останова, но они никогда не останавливаются на этом.

Я ищудамп всех текущих переменных в контексте.

До сих пор я делал что-то вроде:

<c:forEach items="${data}" var="item">
    <c:out value="${item}"></c:out><br />
</c:forEach>

К сожалению, это трудно читать, а также не очень просто.

Что я могу сделать, чтобы улучшить это?

Ответы [ 4 ]

18 голосов
/ 02 августа 2013

это всегда было сложно, для будущих посетителей этого вопроса добавив мои 2 цента

, если вы поставили точку останова на jsp в Eclipse на линии

Eclipse debug for JSTL

6 голосов
/ 05 августа 2011

Извините, но вы не можете поместить точки отладки в файл, содержащий разметку.В этом случае определение библиотеки тегов имеет вид разметки.Таким образом, вместо отладки вы получаете только поддержку проверки для них.

Исключением будет файл Java Server Pages (JSP), который будет преобразован в сервлет (программный код) во время выполнения.

Отладка возможна только для сценариев и кода, имеющих определенную последовательность выполнения.

Лучший способ преодолеть это - внимательно изучить документацию и постепенно внедрить теги после получения знаний по XML илисвязанный язык разметки.

1 голос
/ 05 августа 2011

Вы можете написать собственный тег, который обращается к контексту пружины и выводит текущие переменные. Вы также можете написать пользовательский тег (или теги), который выводит содержимое областей Application, Session, Page и Request.

взгляните на Java EE 6 API . Найдите 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.

0 голосов
/ 24 августа 2016

Я делаю, как сказал 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>

имя файла: datetag.tld

теперь мы можем использовать в нашем jsp файле

<%@taglib prefix="bw" uri="/tags" %>

поместите выше в начало вашего jsp-файла, а в конце вашего jsp-файла вы используете

<bw:eldump></bw:eldump>

чтобы затем вывести ваши переменные.

Что я должен объявить, так это то, что в некоторых случаях нам нужно выгружать переменные в файле jsp, которые были объявлены тегом jstl cset, вы должны добавить атрибут scope = request, когда вы устанавливаете переменные или вышеописанный способ будет не сбрасывать эти переменные.

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

...