﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-天行健-随笔分类-Struts</title><link>http://www.blogjava.net/bnlovebn/category/23963.html</link><description>《周易》曰：&lt;br&gt;
天行健，君子以自强不息(乾卦)&lt;br&gt;
地势坤，君子以厚德载物(坤卦)
</description><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2008 12:10:01 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2008 12:10:01 GMT</pubDate><ttl>60</ttl><item><title>struts2标签取值方式</title><link>http://www.blogjava.net/bnlovebn/archive/2008/03/20/187543.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Thu, 20 Mar 2008 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2008/03/20/187543.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/187543.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2008/03/20/187543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/187543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/187543.html</trackback:ping><description><![CDATA[<div class="blog_content">取值要通过&lt;s:property value="" /&gt;或在任意的&lt;s:/&gt;标签内使用%{}； <br />
<br />
当Action的valueStack中有该属性的值时，只需直接使用该属性的名字即可； <br />
<br />
当Action的valueStack中没有该属性的值时，比如在session,application范围中的属性值时，需要加#或者#attr.； <br />
<br />
例子： <br />
假设某Action中有person成员变量，在application中存在company属性 <br />
那么我们可以通过以下方法取值： <br />
&lt;s:property value="person.name" /&gt; <br />
&lt;s:property value="#person.name" /&gt; <br />
&lt;s:property value="company.name" /&gt; //无法取到，因为company不在action的valueStack中 <br />
&lt;s:property value="#company.name" /&gt; <br />
<br />
<span class="hilite1">&lt;s:textfield</span> name="person.name" value="person.name" /&gt; //错误，value会直接显示person.name字样 <br />
<span class="hilite1">&lt;s:textfield</span> name="person.name" value="%{person.name}" /&gt; <br />
<span class="hilite1">&lt;s:textfield</span> name="person.company.name" value="%{#company.name}" /&gt; <br />
<span class="hilite1">&lt;s:textfield</span> name="person.company.name" value="%{#attr.company.name}" /&gt; </div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/187543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2008-03-20 18:16 <a href="http://www.blogjava.net/bnlovebn/archive/2008/03/20/187543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error:java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource</title><link>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Wed, 12 Sep 2007 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/144500.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/144500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/144500.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10pt; color: black"><span style="font-size: 10pt; color: black"><u><span style="font-size: 10pt; color: navy">java.lang.ClassNotFoundException</span></u><span style="font-size: 10pt; color: black">: org.apache.commons.dbcp.BasicDataSource</span><br />
很显然这是一个没有找到对应的类文件的异常。<br />
<span style="font-size: 10pt; color: black">还有两个包commons-pool.jar和commons-dbcp-1.2.1.jar需要引入到工程中。</span></span></span></div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/144500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-09-12 15:16 <a href="http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在你的struts应用中施展部分AJAX魔法(翻译)[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Tue, 31 Jul 2007 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/133607.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/133607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/133607.html</trackback:ping><description><![CDATA[<span style="COLOR: #00ff00; BACKGROUND-COLOR: #666699">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文将介绍在JSP页面中包含一些JavaScript这样一个简单而有效的方法来结合AJAX和Struts。在此我们介绍如何重新使用已经存在的Struts actions，但此技术同样可用于你选择的其他Java-Web 框架。本方法同样可平移到Struts或者JSF的下一个版本。 <br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX是&#8220;异步的JavaScript和XML&#8221;的缩写。这是一项技术，而不是一个如Struts一样的框架。为什么在AJAX周围会有这么多的关注呢?这是因为AJAX使web页面看起来并不像一个平面的文档，而更像用户所期望的如桌面应用的动态GUI应用程序。AJAX技术能在很多的浏览器上使用(包括IE和Netscape/Mozilla)。它已经为Microsoft(用于Outlook的web客户端)和Google(用户Google Maps和Gmail)所使用。
<p>　　未使用AJAX之前</p>
<p>　　目前大多数的Struts应用都是标准的&#8220;如同一个平面文档的web页面&#8221;的结构。如果你想模仿一些桌面应用程序(比如那些使用<a href="http://dev.yesky.com/devjava/" target=_blank>Java</a> Swing，Visual Basic，或者Delphi建立的应用程序)，那么你有两个选择:你可以发送所有的可能作为页面的一部分被请求的信息，使用大量的JavaScript来操作其动态的显示(一个很慢并且非企业级Java的方法);或者你可以不改变形式地提交到后台服务器(一种有效的方法) 。AJAX提高给你了融合前面的最佳解决方案:动态的页面，但是大多数的应用是在你的web服务器的Java程序来处理的。</p>
<p>　　AJAX 101</p>
<p>　　AJAX和现有的动态HTML技术非常相似，并在其上增加了一个发送到&#8220;后台&#8221;服务器的请求来获取需要的新的或者更新的信息。AJAX的机制在其他地方已经有详细的说明――请查看本文后的Resources来获取更多。但是你至少需要知道:</p>
<ul>
    <li>　　1. XMLHttpRequest (如果你使用的是IE浏览器的话，则是Microsoft.XMLHTTP的ActiveX的对象)。这些对象，你可以在web页面中使用JavaScript调用。他们允许你作为后台的调用方式来请求web服务器的内容(例如，在表单提交后，屏幕并不像平时一样显示&#8220;空白&#8221;)。
    <li>　　2. XMLHttpRequest 和Microsoft.XMLHTTP 返回的内容可以作为XML或者文本来处理。JavaScript(在你页面上的)可以使用请求的新内容来更新页面。
    <li>　　3. 整个处理过程可以由普通的JavaScript事件来触发:onclick，onchange，onblur，等。</li>
</ul>
<p>　　在你的Struts应用中使用AJAX</p>
<p>　　你阅读了本文，然后你会对使用AJAX来创建动态的web页面感兴趣，并且想知道如何将它加入到你的Struts应用中。这只是选择之一。那么你会如何选择呢?</p>
<ul>
    <li>　　&#183; 等待，知道Struts的下一个版本融合了AJAX技术。如果Struts开发者准备开发一个新的应用，这或许会是一个好的选择。再后面，可能会是要求JSF也这样做――对其本身并不一件坏事，但是对于已经存在的系统这将会带来最根本的改变。
    <li>　　&#183; 你也可以直接采用新的方法，比如Direct Web Remoting (DWR) 和Ruby on Rails，这些都是专为建立AJAX应用的。如果你考虑不使用Struts来开发web的话，那么这些都是很又用的框架，并且值得一试。但是，这也同时意味着你必须要重写你的应用。
    <li>　　&#183; 在你已经存在的Struts应用中增加AJAX。既然AJAX只是一项技术而并非框架，那么它就很容易融入到Struts中。作为现有的系统，其稳定性(如，保持现有的库文件)是相当重要的。所以这个方法被推荐，并且我们将在后面详细介绍。</li>
</ul>
<p>　　我们选择在Struts应用中增加AJAX的优势是:</p>
<ul>
    <li>　　1. 它并不需要任何新的库文件或者服务器代码;只需要使用现有的Struts库文件和action。
    <li>　　2. 解决方案中所有部分――JavaScript，XML，Java和Struts――早已为广泛所知。
    <li>　　3. 此应用可以一块一块地移植到AJAX;我们可以确定哪些部分对用户有益，并首先将它们更新到动态AJAX显示。</li>
</ul>
<p>　　实现方案</p>
<p>　　我们如何真正的贯彻我们的选择呢?我们首先应该注意一个&#8220;标准的&#8221;(没有AJAX)Struts应用是如何工作的。在此应用中，一个一般的事件流程如下:</p>
<ul>
    <li>　　1. 使用点击超链接或者表单的提交按钮，用户发送请求。
    <li>　　2. web服务器运行处理请求的Struts Action来生成一个web页面。
    <li>　　3. 浏览器显示web页面。
    <li>　　4. 当用户点击保存的时候，信息由Struts框架中一个ActionForm类来转换并发送到服务器。
    <li>　　5. 然后，Struts框架调用Struts Action来出来请求(如，保存数据到数据库中)。
    <li>　　6. 页面再一次回传，处理流程继续。</li>
</ul>
<p>　　现有的Struts应用</p>
<p>　　一个演示事件流程的简单Struts应用可以在以下地址下载: <a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target=_blank>struts-non-ajax.zip</a>。此基于Struts的应用，是基于用户的输入显示或者隐藏蓝色和绿色的表格。图1显示了载入初始页面的画面。图2显示了用户输入值并点击了提交后的画面。虽然简单，但它已经足以表示一个Struts的工作流程。</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/w5xpm4gf26fg.jpg" border=0></p>
<p>　　图 1. 没有AJAX的例子:初始屏幕</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/e1992717m03d.jpg" border=0></p>
<p>　　图 2. 没有AJAX的例子:输入值并点击了提交</p>
服务器端的代码是:一个Struts Action使用struts-config.xml 中定义的值转发到(相同的)JSP。这个例子代码中一些需要注意的地方是:
<ul>
    <li>　　&#183;struts-config.xml文件将所有的请求重定向到http://localhost:8080/struts-non-ajax/(或者和你自己的服务器相同)的index.jsp。
    <li>　　&#183; index.jsp 包含了一个两个文本框的Struts form(showBlue和showGreen)。该页面同样包含了标签，但是如同两个文本框被初始化为空，标签之间的内容并不显示。
    <li>　　&#183; 用户输入值(true或者false)并点击提交按钮，处理控制(经过Struts框架，读取struts-config.xml)提交到SampleAction类中。
    <li>　　&#183;SampleAction记录下值，然后转发到index.jsp。一个成熟的Struts应用可能会处理更多的事情，不如保存或者查询数据库等。
    <li>　　&#183; index.jsp 现在重新处理请求;如果ShowBlue或者ShowGreen的值是true，这些表格就显示出来。</li>
</ul>
<p>　　该应用并没有任何&#8220;错误&#8221;。类似的Struts项目好多年都是这样做的。但是，我们如何在不添加复杂的JavaScript或者频繁的表单提交的前提下，为此应用增加动态的元素呢?</p>
<p>　　我们的第一个Struts AJAX应用</p>
<p>　　观察下下面的图3和图4。第一眼看上去，它们和前面的例子没有说明区别。它们的不同之处在于，页面载入后(图3)然后文本框中的值改变了，窗体自动提交而不显示空白的，然后在图4中显示结果。普通的提交按钮仍然在，你也可以选择使用它。</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/6s0y6u481893.jpg" border=0></p>
<p>　　图 3. 页面载入后的AJAX例子</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/xc0k049x6hf0.jpg" border=0></p>
<p>　　图 4. AJAX调用后的AJAX例子</p>
<p>　　添加AJAX是出奇的容易。服务器端的代码和前面的例子是一样的: 一个Struts的ActionForm来后去数据，一个Struts的Action来执行需要的任务(例如，存储数据库)然后转发到适当的JSP页面来显示结果。</p>
<p>　　继续</p>
<p>　　如果你希望就此停止阅读(跳过这个例子的工作说明)，但是这里的是和你需要转换你的Struts应用到一个Struts-AJAX应用同样的风格:</p>
<ul>
    <li>　　1. 在你的web页面中引入一个Ajax.js (该文件是struts-ajax.zip 例文件中的一部分)。Ajax.js 包含了所有需要发送和接收AJAX调用的JavaScript方法。
    <li>　　2. 确保你希望在AJAX调用中更新的web页面的部分包含在标签中，并且给每个标签一个id。
    <li>　　3. 当一些事件触发的时候就更新页面(例如，文本框的the onchange()方法)，调用retrieveURL()方法，通过URL传递到需要执行服务器端处理的Struts Action。
    <li>　　4. 为了页面的显示/更新，最简单的方法是Struts Action转发回同样的页面。在本例中，showGreen/showBlue 文本框中的onchange()方法来触发AJAX调用。</li>
</ul>
<p>　　JavaScript方法retrieveURL()调用服务器的Struts(通过URL)，获取JSP响应，然后更新显示页面中的 标签中的部分。就是这么简单!</p>
<p>　　AJAX解决方案的细节</p>
<p>　　我们将例子变为AJAX-Struts应用的时候，需要三个变化:</p>
<ul>
    <li>　　1. 增加一个JavaScript方法来完成到服务器的&#8220;背后的&#8221;AJAX调用。
    <li>　　2. 增加JavaScript代码来接收服务器的响应并更新页面。
    <li>　　3. 在JSP页面增加标签标签，这个标签中内容将在AJAX调用中更新。</li>
</ul>
<p>　　我们将详细的说明上面的每一步。</p>
发送AJAX请求到服务器
<p>　　有两个方法(在下面列出)用于发送请求到服务器。</p>
<p>　　&#183; retrieveURL()方法获得服务器的URL和Struts form。URL用于使用AJAX，form的值用于传递到服务器。</p>
<p>　　&#183; getFormAsString()方法用于将retrieveURL()中form命名的值组装成查询字符串，并发送到服务器。</p>
<p>　　使用方法很简单，使用onclick()/onChange()事件来触发retrieveURL()更新显示。</p>
<p>　　在这两个方法中有一些有趣的东西。</p>
<p>　　在retrieveURL()方法中，req.onreadystatechange = processStateChange (注意，没有括号)这一行来告诉浏览器在服务器响应到达的时候调用processStateChange()方法(该方法将在后面介绍)。retrieveURL()方法中(现在已经是AJAX的标准了)同样决定是使用IE浏览器(ActiveX)还是使用Netscape/Mozilla (XmlHttpRequest) 来实现跨浏览器兼容。</p>
<p>　　getFormAsString()方法将HTML form转换成字符串连接在URL后面(这样就允许我们发送HTTP GET请求)。这个字符串是经过转换的(比如，空格转换成%20等)，并且是一个Struts能将其组装成ActionForm的格式(并不需要Struts清楚的明白这个是来之AJAX的请求)。注意，在本例中我们使用HTTP GET，使用HTTP POST的方法也是类似的。</p>
<p>function retrieveURL(url,nameOfFormToPost) {</p>
<p>//将url转换成字符串<br>url=url+getFormAsString(nameOfFormToPost);</p>
<p>//调用AJAX<br>if (window.XMLHttpRequest) { </p>
<p>// 非IE浏览器<br>req = new XMLHttpRequest();<br>req.onreadystatechange = processStateChange;<br>try {<br>req.open("GET", url, true); <br>} catch (e) {<br>alert("Server Communication Problem\n"+e);<br>}<br>req.send(null);<br>} else if (window.ActiveXObject) {<br>// IE</p>
<p>req = new ActiveXObject("Microsoft.XMLHTTP");<br>if (req) {<br>req.onreadystatechange=processStateChange;<br>req.open("GET", url, true);<br>req.send();<br>}<br>}<br>}</p>
<p>getFormAsString() 是一个&#8220;私有&#8221; 方法，在retrieveURL()中使用。</p>
<p>function getFormAsString(formName){</p>
<p>//设置返回字符串<br>returnString ="";</p>
<p>//取得表单的值<br>formElements=document.forms[formName].elements;</p>
<p>//循环数组，组装url<br>//像'/strutsaction.do&amp;name=value'这样的格式</p>
<p>for(var i=formElements.length-1;i&gt;=0; --i ){<br>//转化每一个值<br>returnString+="&amp;" <br>+escape(formElements[i].name)+"=" <br>+escape(formElements[i].value);<br>}</p>
<p>//返回字符串<br>return returnString; <br>}</p>
根据AJAX的响应更新web页面
<p>　　到现在为止，我们学习过了使用JavaScript来完成AJAX调用(前面列出)，Struts Action，ActionForm以及JSP(基本没有变化，只是增加了标签)。为了完善我们对Struts-AJAX项目的了解，我们需要了解三个用于根据服务器返回的结果而更新页面的JavaScript方法。</p>
<ul>
    <li>　　&#183; processStateChange(): 该方法在AJAX调用前设定。它在服务器响应到达后由XMLHttpRequest/Microsoft.XMLHTTP 对象调用。
    <li>　　&#183;splitTextIntoSpan(): 根据响应，循环取出数组中的元素组装成NewContent。
    <li>　　&#183;replaceExistingWithNewHtml(): 根据span元素数组，循环搜索，将里面的元素调换掉页面中和它的'someName'相同的中的内容。注意，我们使用的是req.responseText 方法来获得返回的内容(它允许我们操作任何文本的响应)。与此相对于的是req.responseXml (它的作用更大，但是要求服务器返回是XHTML或者XML)。</li>
</ul>
<p>function processStateChange() {</p>
<p>if (req.readyState == 4) { // 完成<br>if (req.status == 200) { // 响应正常</p>
<p>//将响应的文本分割成Span元素<br>spanElements = <br>splitTextIntoSpan(req.responseText);</p>
<p>//使用这些Span元素更新页面<br>replaceExistingWithNewHtml(spanElements);</p>
<p>} else {<br>alert("Problem with server response:\n " <br>+ req.statusText);<br>}<br>}<br>}<br>replaceExistingWithNewHtml() 是为processStateChange()使用的&#8220;私有&#8221;方法。</p>
<p>function replaceExistingWithNewHtml <br>(newTextElements){</p>
<p>//循环newTextElements<br>for(var i=newTextElements.length-1;i&gt;=0;--i){</p>
<p>//判断是否以 if(newTextElements[i]. <br>indexOf("-1){</p>
<p>//获得span的名字- 设置在第一和第二个引号之间<br>//确认span元素是以下的格式<br>//NewContent<br>startNamePos=newTextElements[i]. <br>indexOf('"')+1;<br>endNamePos=newTextElements[i]. <br>indexOf('"',startNamePos);<br>name=newTextElements[i]. <br>substring(startNamePos,endNamePos);</p>
<p>//获得内容－在第一个&gt;标记后的所有内容<br>startContentPos=newTextElements[i]. <br>indexOf('&gt;')+1; <br>content=newTextElements[i].<br>substring(startContentPos);</p>
<p>//现在更新现有的Document中的元素， <br>// 确保文档存在该元素<br>if(document.getElementById(name)){<br>document.getElementById(name). <br>innerHTML = content;<br>}<br>}<br>}<br>splitTextIntoSpan() 是为processStateChange() 使用的&#8220;私有&#8221;方法。<br>function splitTextIntoSpan(textToSplit){</p>
<p>//分割文档<br>returnElements=textToSplit. <br>split("")</p>
<p>//处理每个元素 <br>for(var i=returnElements.length-1;i&gt;=0;--i){</p>
<p>//删除掉第一个span后面的元素<br>spanPos = returnElements[i]. <br>indexOf(" </p>
<p>//如果找到匹配的，获得span前的内容<br>if(spanPos&gt;0){<br>subString=returnElements[i].<br>substring(spanPos);<br>returnElements[i]=subString;<br>} <br>}<br>return returnElements;<br>}</p>
<p>　　新的控制流</p>
<p>　　添加以下的JavaScript代码到我们的应用中，以下的步骤将在服务器和浏览器中执行。</p>
<ul>
    <li>　　1. 如同一个普通Struts应用装载页面。
    <li>　　2. 用户改变文本框的值，触发一个onChange() 事件，调用retrieveURL() 方法。
    <li>　　3. 该JavaScript方法通过发送Struts明白的表单变量(后台)请求到服务器的Struts Action。
    <li>　　4. 该JavaScript方法同样设定了第二个JavaScript方法的名字，此方法将到服务器响应完毕后调用。本例子中，设定为processStateChange() 方法。
    <li>　　5. 如我们所预期的，服务器响应完毕，调用processStateChange() 方法。
    <li>　　6. JavaScript在(新的)服务器响应中循环取出所有元素。将页面上存在与获得元素名字相同的 中的元素替换掉。</li>
</ul>
<p>　　在你的应用中设计AJAX</p>
<p>　　以上描述的JavaScript方法能在大多数的应用中使用，包括比我们的例子复杂得多的。但是，在使用之前，你需要注意以下几点:</p>
<p>　　&#183; 避免复制代码，最好在初始化请求(如，显示完整的页面)和AJAX(更新部分页面)请求中使用相同的Struts Action和JSP。</p>
<p>　　&#183;在公共的Action(控制器)中，决定JSP页面(所有的JSP页面或者其中的一部分)中的一个区域需要传送到浏览器。通过在web服务器的session或者ActionForm中设定标记来让JSP页面知道哪些部分需要提交。</p>
<p>　　&#183; 在JSP中，使用Struts 或者JSTL标签来决定提交的HTML区域。</p>
<p>　　使用AJAX的本例子，可以在以下下载: <a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target=_blank>struts-Ajax.zip</a></p>
<p>　　结语</p>
<p>　　AJAX技术允许我们在创建和使用web应用的时候完全的改变。本文介绍了一个简单的技术，在现有的Struts应用中增加Struts的处理。它允许我们利用我们已有的东西，不仅仅是代码，还包括了开发的技能。作为一个好的产品，它同样允许我们写出更清晰，更具移植性的Java Struts应用。</p>
<p>版权声明：Techtarget获Matrix授权发布,如需转载请联系Matrix<br>作者:作者:Paul Browne;pawenwen(作者的blog:http://blog.matrix.org.cn/page/pawenwen)<br>译文:<a href="http://blog.matrix.org.cn/page/pawenwen?entry=%E5%9C%A8%E4%BD%A0%E7%9A%84struts%E5%BA%94%E7%94%A8%E4%B8%AD%E6%96%BD%E5%B1%95%E9%83%A8%E5%88%86ajax%E9%AD%94%E6%B3%95_%E7%BF%BB%E8%AF%91" target=_blank>点击</a></p>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/133607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-31 16:33 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cannot find bean under name org.apache.struts.taglib.html.BEAN[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/19/131314.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Thu, 19 Jul 2007 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/19/131314.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/131314.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/19/131314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/131314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/131314.html</trackback:ping><description><![CDATA[<font color=#666699 size=2>1。试图在Struts的form标记外使用form的子元素。在后面使用Struts的html标记等 </font>
<p><font color=#666699 size=2>2。不经意使用的无主体的标记，如web 服务器解析时当作一个无主体的标记，随后使用的标记都被认为是在这个标记之外的<br>3。还有就是在使用taglib引入HTML标记库时，你使用的prefix的值不是html</font></p>
<p><font color=#666699 size=2>4。property必须和所要提交的action对应的formbean中的某个属性相匹配（必须有一个formbean)<br>5。要使用标签，外层必须使用标签，不能使用html的</font></p>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/131314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-19 17:22 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/19/131314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts错误整理</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/09/129074.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Mon, 09 Jul 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/09/129074.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/129074.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/09/129074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/129074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/129074.html</trackback:ping><description><![CDATA[<p><font color=#993300>错误 ：javax.servlet.ServletException: </font><span><font color=#993300>DispatchMapping[/configaction] does not define a handler property</font></span></p>
<p><span>&nbsp;</span>原因： action参数配置不全 <br>解决方法：在 config文件中 添加 parameter="method"等 <br><br><font color=#800000>错误： 表单数据验证失败时发生错误，&#8220;No input attribute for mapping path&#8221;</font> </p>
<p><br>原因：action中表单验证 validate="true" ，如果validate()返回非空的ActionErrors，将会被转到input属性指定的URI，而action中未指定input时会报此错 <br>解决方法：添加 input="url" 或者 validate="false" </p>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/129074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-09 16:32 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/09/129074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>