【问题标题】:Railo instanceof not working with JsoupRailo instanceof 不使用 Jsoup
【发布时间】:2013-02-23 01:33:30
【问题描述】:

我正在运行一个带有 tomcat 和 Railo 的 linux 服务器。如果我尝试这个简单的代码:

check = "";
jSoupClass = createObject( "java", "org.jsoup.Jsoup" );

if(IsInstanceOf(jSoupClass,"org.jsoup.Jsoup")){
 check = "ok";      
}

writeDump(check );

如果我运行这个简单的代码,var check 总是空的。我用许多 java 类运行这个简单的测试,并且一切正常。

在我的应用程序中,我使用 jsoup 没有问题,但似乎无法运行这个简单的检查。我用它来检查文档的文档类型:

jSoupClass = createObject( "java", "org.jsoup.Jsoup" );
dom = jSoupClass.connect( "http://www.mutuiinpdap.net" ).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6").timeout(10000).execute();

doc = dom.parse();
nods = doc.childNodes();
doctype = {};
for (key in nods) {
  if(IsInstanceOf(key,"org.jsoup.nodes.DocumentType")){
doctype.string = key.toString();
switch(key) {
 case "<!DOCTYPE html>":
      doctype.declarations = "Html 5";
  break;
     case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">':
  doctype.declarations = "XHTML transitional";
  break;
    }
   }
  }

writeDump(doctype);

有没有办法解决这个问题?我可以使用不同的代码来检查哪个 doctype 是文档吗?

这段代码在我的本地 Windows 机器上完美运行。但是在我安装了 Ubuntu 的生产服务器上会中断...

[编辑]

我也用这段代码测试过:

public function getDoctype(){



 myClass = {};


jSoupClass = createObject( "java", "org.jsoup.Jsoup" );
whois = createObject("java", "org.apache.commons.net.whois.WhoisClient");



myClass.jj = "ko";
myClass.ww = "ko";



writeDump(jSoupClass);  
writeDump(whois);   

if(IsInstanceOf(jSoupClass,"org.jsoup.Jsoup")){
    myClass.jj = "ok";      
}


if(IsInstanceOf(whois,"org.apache.commons.net.whois.WhoisClient")){
    myClass.ww = "ok";      
}


return myClass;

}

我会得到一个 myClass.jj = "ko";和 myClass.ww = "ok";

【问题讨论】:

  • 我不明白为什么 isInstanceOf 不起作用 - 特别是如果它适用于一个安装而不是另一个安装 - 你能raise a bug 提供相关详细信息吗?
  • 我想提出一个包含相关细节的错误,但没有更多要添加的。我在我的代码中添加了一个 try/catch 以查看有什么问题,但没有出错。我已经用进一步的例子更新了我的问题......我不能确定这是一个 railo 错误还是 Jsoup 错误。我对两组都提出了一些问题,但似乎没有人感兴趣......
  • 参考链接:Railo DiscussionJsoup Discussion
  • 相关细节是 (1) 对行为不端的清晰描述(即 isInstanceOf 在可能不应该返回 false 时)(2) Railo、Jsoup 和您的 JVM 的版本,以及 (3 ) 一个可重现的测试用例 - 即问题中的代码 sn-ps 和 jsoup jar。如果您 raise it on Jira Micha/Igal 会看到并进一步调查 - 它可能会因为不是 Railo 问题而关闭,但这可能是 Micha 的问题,isInstanceOf 是否应该适用于静态/非初始化对象。
  • isInstanceOf 是否适用于静态/非初始化对象。 IMO 应该。这可能不是问题,但我在使用 javaLoader 时遇到了与 ACF8/9 类似的问题。 isInstanceOf 返回 false,因为我的对象是由不同的类加载器创建的,即 javaLoader,而不是 CF 使用的主要类加载器。由于 Railo 支持动态类加载,它可能是相关的(?)。

标签: jsoup railo cfml


【解决方案1】:

要使 DOCTYPE 有效,它必须是文档中的第一件事,因此无需遍历节点检查实例。

您所要做的就是检查第一个标记 - 即第一个 &gt; 字符之前的 HTML 字符串的内容(或者,对于某些 XHTML,在第一个和第二个 &gt;s 之间)

您也不需要(或想要)一长串完整的 doctype 声明。除了 HTML 5,它们都遵循相同的模式(即具有 DTD),因此您可以简单地从 doctype 中提取名称。

我已将该逻辑封装到下面发布的函数中 - 可能需要一些调整或额外的工作来执行您需要的操作,但它已经过简单的测试并且可以正常工作。希望这一切都是不言自明的,但如果有任何部分不是,请告诉我。

jSoupClass = createObject( "java" , "org.jsoup.Jsoup" , "./jsoup-1.7.1.jar" );

doc = jSoupClass
    .connect( "http://www.mutuiinpdap.net" )
    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
    .timeout(10000)
    .execute()
    ;

doctype = determineDoctype( doc.body() );

writeDump(doctype);



function determineDoctype( Html )
{

    var FirstTag = trim(ListFirst(Arguments.Html,'>'));

    if ( LCase(trim(FirstTag)) EQ '<!doctype html' )
        return 'Html 5';

    if ( Left(FirstTag,5) EQ '<?xml' )
        FirstTag = trim(ListGetAt(Arguments.Html,2,'>'));

    if ( Left(LCase(FirstTag),14) NEQ '<!doctype html' )
        return 'Non-HTML doctype [#FirstTag#]' ;

    var dtd = rematch('-//W3C//DTD [^/]+',FirstTag);

    if ( ArrayLen(dtd) )
        return ListRest(dtd[1],' ');

    return 'Unknown Doctype [#FirstTag#]';
}

【讨论】:

    【解决方案2】:

    您可以测试object.getClass().getName() EQ 'org.jsoup.Jsoup' 以查看该课程是否符合您的预期。

    即使这可以解决您的代码问题,我仍然会推荐我发布的用于确定文档类型的其他答案。

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2020-07-17
      • 2012-04-18
      • 2022-11-15
      相关资源
      最近更新 更多