如何调试JSTL?

我正在使用SpringSource Tool Suite(使用Roo)并取得了一些成功。 令我困扰的是,我不知道如何调试标签库的东西。

我可能会添加断点但它永远不会停留在它们上面。

我正在寻找的是在上下文中转储所有当前变量。

到目前为止,我做了类似的事情:

 

可悲的是,这很难阅读,也不是很简单。

我该怎么做才能改善这个?

抱歉,您无法将调试点放到包含标记的文件中。 在这种情况下,标记库定义采用标记的forms。 因此,您只需获得validation支持,而不是调试。

一个例外是Java Server Pages(JSP)文件,它将在运行时转换为servlet(程序代码)。

只有具有已定义执行顺序的脚本和代码才能进行调试。

解决此问题的最佳方法是在获得有关XML或相关标记语言的知识后仔细阅读文档并逐步实现标记。

这总是很棘手,因为这个问题的未来访客增加了我的2美分

如果你在Eclipse上的jsp上放一个断点就行了

针对JSTL的Eclipse调试

您可以编写一个自定义标记来访问spring上下文并转储当前变量。 您还可以编写转储Application,Session,Page和Request范围内容的自定义标记(或标记)。

看看Java EE 6 API 。 查找SimpleTag以开始实现标记。 以下是Java EE 5教程中自定义标记部分的链接。

示例(转储请求范围):

   MyTag类扩展了TagSupport
   {
     public int doEndTag()
     {
      枚举attributeNames;
      对象attributeValue;
       String currentName;
       int nameIndex;
      迭代器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(“
名称:”); pageOut.print(currentName); pageOut.print(“ 值:”); pageOut.print( “<跨度>”); pageOut.print(attributeValue.toString()); pageOut.print( “”); pageOut.print( “ ”); } } }

您可以使用pagecontext.getAttributeNamesInScope(int scope)来获取每个范围的属性。 范围(在PageContext类中定义)是APPLICATION_SCOPE,PAGE_SCOPE,REQUEST_SCOPE和SESSION_SCOPE。

我像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("

request scope

"); while(it.hasMoreElements()){ Object next=it.nextElement(); out.print("
"+next+":"+request.getAttribute(next.toString())+",value type:"+request.getAttribute(next.toString()).getClass().getName()+"
"); } out.print("
"); return super.doStartTag(); } catch (IOException e){ throw new JspException("Io exception occurred "); } } }

在上面的代码中我转储了所有请求变量,包括它的名称,值和类型。 我认为在处理数字时类型非常重要。

接下来我们需要配置我们的tld文件。

  1.0 date   eldump JSTLElDumpTag JSP  

在web.xml中配置此tld文件

   /tags /WEB-INF/datetag.tld   

tld文件名是datetag.tld

现在我们可以在我们的jsp文件中使用了

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

把上面放在你的jsp文件的头部,并在你使用的jsp文件的末尾

  

然后转储你的变量。

我应该声明的是,在某些情况下,我们需要将变量转储到jsp文件中由jstl标记cset声明,你应该在设置变量时添加属性scope = request,或者上面的方式不会转储这些变量。

我希望这会对您有所帮助,如果您在我的post中发现一些错误,您的通知将真诚地感谢。