在ColdFusion上使用JSoup操作表单数据服务器端

时间:2015-02-16 14:21:47

标签: coldfusion jsoup coldfusion-11

继上一个问题(How to replace all anchor tags with a different anchor using regex in ColdFusion)之后,我想在插入操作内容​​之前使用JSoup来操纵来自Argument的{​​{1}}内容进入数据库。

以下是从表单发送到服务器的示例:

Form

以下是我的CFC目前如何处理它(基本想法):

<form>
   <div id="Description" contenteditable="true">
   <p>
      Terminator Genisys is an upcoming 2015 American 
      science fiction action film directed by Alan Taylor. 

      <img id="Img0" src="http://www.moviepics.com/terminator1.jpg" />
      <img id="Img1" src="http://www.moviepics.com/terminator2.jpg" />
      <img id="Img2" src="http://www.moviepics.com/terminator2.jpg" />

      You can find out more by <a href="http://www.imdb.com">clicking here</a>
   </p>
   </div>
</form>

我知道<cfquery> INSERT INTO MyTable (Value1, Description) VALUES ( <cfif structkeyexists(ARGUMENTS.Value1)> <cfqueryparam value="#ARGUMENTS.Value1#" cf_sql_type="nvarchar" /> <cfelse> NULL </cfif> , <!--- Before the below happens, I need to replace the src attributes of the img tags of Arguments.Description ---> <cfif structkeyexists(ARGUMENTS.Description)> <cfqueryparam value="#ARGUMENTS.Description#" cf_sql_type="nvarchar" /> <cfelse> NULL </cfif> ) </cfquery> 不是表单元素,但不要担心它仍然提交给CF11,好像它是一个使用JQuery serialize()技巧的表单元素。

当CF11处理此表单时,它会获取<div>中的数据。我想要做的是解析此参数的内容,找到ARGUMENTS.Description标记,并提取<img>属性。

然后我会进行更多处理,但最终我需要将每个src标记中的src值替换为服务器端CF11创建的不同值。只有这样我才能将表单值插入数据库。

JSoup可以协助完成这类任务吗?这感觉就像一个简单的查找和替换任务,但我很失落如何去做。

1 个答案:

答案 0 :(得分:1)

首先,标记中有错误,图像标记的src属性没有关闭引号。在尝试使用此

之前,请确保已修复此问题
<cfsavecontent variable="samform">
    <form>
    <div id="Description" contenteditable="true">
    <p>Terminator Genisys is an upcoming 2015 American science fiction action film directed by Alan Taylor. 

    <img id="Img0" src="http://www.moviepics.com/terminator1.jpg" />
    <img id="Img1" src="http://www.moviepics.com/terminator2.jpg" />
    <img id="Img2" src="http://www.moviepics.com/terminator2.jpg" />

    You can find out more by <a href="http://www.imdb.com">clicking here</a></p>
    </div>
    </form>
</cfsavecontent>

<cfscript>
jsoup = CreateObject("java", "org.jsoup.Jsoup");
alterform = jsoup.parse(samform);

imgs = alterform.select("##Description img");


for (img in imgs) {
    img.attr("src", "betterthan#listlast(img.attr("src"),"/")#");
}

imgs[2].attr("src", "TheyShouldHaveStoppedAtT2.gif");

writeOutput('<textarea rows="10" cols="100">#samform#</textarea><br>');
writeOutput('<textarea rows="10" cols="100">#alterform#</textarea>');
</cfscript>

如果你熟悉css选择器或jquery选择器,那么jSoup选择几乎是第二种。

这样做会导致img中的每个#Description循环(#必须加倍,因为CF)。然后它根据当前的url将url更改为某个东西,然后只是为了演示,我用其他东西覆盖第二个img的src并在textareas中输出before / after。