﻿<?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/os586/category/19878.html</link><description>态度决定一切，思想决定出路</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:06:08 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:06:08 GMT</pubDate><ttl>60</ttl><item><title>Struts 中 html:options 的使用</title><link>http://www.blogjava.net/os586/archive/2007/02/11/99306.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Sun, 11 Feb 2007 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/02/11/99306.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/99306.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/02/11/99306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/99306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/99306.html</trackback:ping><description><![CDATA[　　html:options是Struts中比较复杂的一个tage lib，用法灵活，但是Sturts提供的源码exercise taglib中没有提出常用jsp+ActionForm这样形式的最直接的总结，现从中总结如下，分两种情况：数组和Collection。<br />　　<br />　　需求，要达到：<br />　　&lt;select name="beanCollectionSelect" multiple="multiple" size="10"&gt;<br />　　&lt;option value="value 0"&gt;Label 0&lt;/option&gt;<br />　　&lt;option value="value 1" selected="selected"&gt;Label 1&lt;/option&gt;<br />　　&lt;option value="value 2"&gt;Label 2&lt;/option&gt;<br />　　&lt;option value="value 3" selected="selected"&gt;Label 3&lt;/option&gt;<br />　　&lt;option value="value 4"&gt;Label 4&lt;/option&gt;<br />　　&lt;option value="value 5" selected="selected"&gt;Label 5&lt;/option&gt;<br />　　&lt;option value="value 6"&gt;Label 6&lt;/option&gt;<br />　　&lt;option value="value 7"&gt;Label 7&lt;/option&gt;<br />　　&lt;option value="value 8"&gt;Label 8&lt;/option&gt;<br />　　&lt;option value="value 9"&gt;Label 9&lt;/option&gt;&lt;/select&gt;<br />　　<br />　　要实现上述效果，需要两步：<br />　　第一：设置ActionForm，<br />　　也分两小步：第一小步必须在ActionForm中，有一句<br />　　private Collection beanCollection;<br />　　public Collection getBeanCollection();<br />　　<br />　　Collection beanCollection要确保是一个实现，如ArrayList，如果不是则会报No collection found的错误，Struts的最大不方便就是一旦出问题，定位很难，不知道什么地方使用错误，或忘记设置什么了。<br />　　<br />　　因为前面需求中option的value值和label值不一样，那么在beanCollection中保存的就是一个value和label组成的对象，名为LabelvalueBean，在LabelvalueBean中有两个属性value和label，<br />　　<br />　　在程序某个地方要为beanCollection赋值，如：<br />　　<br />　　Vector entries = new Vector(10);　 <br />　　entries.add(new LabelvalueBean("Label 0", "value 0"));　　　　　<br />　　entries.add(new LabelvalueBean("Label 1", "value 1"));　　　　　<br />　　entries.add(new LabelvalueBean("Label 2", "value 2"));　　　　　<br />　　entries.add(new LabelvalueBean("Label 3", "value 3"));　　　　　<br />　　entries.add(new LabelvalueBean("Label 4", "value 4"));　　　　　　<br />　　entries.add(new LabelvalueBean("Label 5", "value 5"));　　　　　 <br />　　 entries.add(new LabelvalueBean("Label 6", "value 6"));　　　　　　<br />　　entries.add(new LabelvalueBean("Label 7", "value 7"));　　　　　　<br />　　entries.add(new LabelvalueBean("Label 8", "value 8"));　　　　　　<br />　　entries.add(new LabelvalueBean("Label 9", "value 9"));<br />　　<br />　　然后执行setBeanCollection(entries);<br />　　这样ActionForm中的beanCollection算有值了。<br />　　第二小步，需要设置Selected，selected有两种，单选和多选：<br />　　在ActionForm中必须有：<br />　　<br />　　private String singleSelect = "Single 5";　 <br />　　public String getSingleSelect()<br />　　 {<br />　　　　　return (this.singleSelect);<br />　　　　}　 <br />　　public void setSingleSelect(String singleSelect)<br />　　 {<br />　　　　　this.singleSelect = singleSelect;<br />　　　　}<br />　　<br />　　或多选，多选必须是数组：<br />　　<br />　　private String[] beanCollectionSelect = { "value 1", "value 3",<br />　　　　　　　　　　　　　　　　　　　　　　　　　"value 5" };　<br />　　public String[] getBeanCollectionSelect() {<br />　　　 return (this.beanCollectionSelect);　　}<br />　　　　public void setBeanCollectionSelect(String beanCollectionSelect[])<br />　　 {<br />　　　　　　this.beanCollectionSelect = beanCollectionSelect;<br />　　　　}<br />　　<br />　　第二：在Jsp中写入tang lib语句如下：<br />　　<br />　　&lt;html:select property="beanCollectionSelect" size="10" multiple="true"&gt;<br />　　　　　　&lt;html:optionsCollection name="testbean" property="beanCollection"/&gt;　　<br />　　 &lt;/html:select&gt;<br />　　<br />　　其中testbean是ActionForm的名称。<br />　　<br />　　以上是html:options的Collection解决方案，如果option值很少，简单地可以实现为数组，两步：<br />　　第一：在ActionForm中，<br />　　<br />　　private String values[] =<br />　　　　 { "Magazine", "Journal", "News Paper","Other" };　 <br />　　private String labels[] =<br />　　　　 { "L-Magazine", "L-Journal", "L-News Paper","L-Other"};<br />　　　　private String selected = "Magazine";　　<br />　　public String getSelected()<br />　　{<br />　　　　　return selected;<br />　　　　}　　<br />　　public void setSelected(String selected)<br />　　{<br />　　　　　this.selected = selected;<br />　　　　}　 <br />　　public String[] getvalues()<br />　　{<br />　　　　　return values;<br />　　　　}　　<br />　　public void setvalues(String[] values)<br />　　{　　　this.values = values;<br />　　　　}　 <br />　　public String[] getLabels()<br />　　{<br />　　　　　return values;<br />　　　　}　　<br />　　public void setLabels(String[] labels)<br />　　{<br />　　　　　this.labels = labels;<br />　　　　}<br />　　<br />　　第二步在jsp中：<br />　　<br />　　&lt;html:select property="selected" &gt;　　　　　 <br />　　&lt;html:options name="testbean" property="values" labelProperty="label"/&gt;　　　&lt;/html:select&gt;<br />　　<br />　　Struts标签库的使用还是需要小心，不必完全使用Struts的标签库，个人感觉Struts这种替代Html语句的标签库有一种牵强附会，给使用者掌握带来难度，使用者除熟悉html外，还必须理解Struts的对应标签库用法，而且这种调试出错，问题也无法准确定位，总是抽象地告诉你，no bean 或no form<img src ="http://www.blogjava.net/os586/aggbug/99306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-02-11 22:03 <a href="http://www.blogjava.net/os586/archive/2007/02/11/99306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Struts的Token机制解决表单重复提交</title><link>http://www.blogjava.net/os586/archive/2007/02/11/99305.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Sun, 11 Feb 2007 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/02/11/99305.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/99305.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/02/11/99305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/99305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/99305.html</trackback:ping><description><![CDATA[　　Struts的Token（令牌）机制能够很好的解决表单重复提交的问题，基本原理是：服务器端在处理到达的请求之前，会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较，看是否匹配。在处理完该请求后，且在答复发送给客户端之前，将会产生一个新的令牌，该令牌除传给客户端以外，也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和服务器端的令牌不一致，从而有效地防止了重复提交的发生。<br />　　<br />　　这时其实也就是两点，第一：你需要在请求中有这个令牌值，请求中的令牌值如何保存，其实就和我们平时在页面中保存一些信息是一样的，通过隐藏字段来保存，保存的形式如： 〈input type="hidden" name="org.apache.<a href="http://www.javaresource.org/struts/struts-24.html">struts</a>.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，这个value是TokenProcessor类中的generateToken()获得的，是根据当前用户的session id和当前时间的long值来计算的。第二：在客户端提交后，我们要根据判断在请求中包含的值是否和服务器的令牌一致，因为服务器每次提交都会生成新的Token，所以，如果是重复提交，客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。<br />　　<br />　　在Action中的add方法中，我们需要将Token值明确的要求保存在页面中，只需增加一条语句：saveToken(request);，如下所示：<br />　　<br />　　public ActionForward add(ActionMapping mapping, ActionForm form,<br />　　<br />　　HttpServletRequest request, HttpServletResponse response)<br />　　<br />　　//前面的处理省略<br />　　<br />　　saveToken(request);<br />　　<br />　　return mapping.findForward("add");<br />　　<br />　　}在Action的insert方法中，我们根据表单中的Token值与服务器端的Token值比较，如下所示：<br />　　<br />　　public ActionForward insert(ActionMapping mapping, ActionForm form,<br />　　<br />　　HttpServletRequest request, HttpServletResponse response)<br />　　<br />　　if (isTokenValid(request, true)) {<br />　　<br />　　// 表单不是重复提交<br />　　<br />　　//这里是保存数据的代码<br />　　<br />　　} else {<br />　　<br />　　//表单重复提交<br />　　<br />　　saveToken(request);<br />　　<br />　　//其它的处理代码<br />　　<br />　　}<br />　　<br />　　}<br />　　<br />　　其实使用起来很简单，举个最简单、最需要使用这个的例子：<br />　　<br />　　一般控制重复提交主要是用在对数据库操作的控制上，比如插入、更新、删除等，由于更新、删除一般都是通过id来操作（例如：updateXXXById, removeXXXById），所以这类操作控制的意义不是很大（不排除个别现象），重复提交的控制也就主要是在插入时的控制了。<br />　　<br />　　先说一下，我们目前所做项目的情况：<br />　　<br />　　目前的项目是用Struts＋Spring＋Ibatis，页面用<a href="http://www.javaresource.org/jstl/jstl-69.html">jstl</a>，Struts复杂View层，Spring在Service层提供事务控制，Ibatis是用来代替<a href="http://www.javaresource.org/jdbc/jdbc-90.html">JDBC</a>，所有页面的访问都不是直接访问jsp，而是访问Structs的Action，再由Action来Forward到一个Jsp，所有针对数据库的操作，比如取数据或修改数据，都是在Action里面完成，所有的Action一般都继承BaseDispatchAction，这个是自己建立的类，目的是为所有的Action做一些统一的控制，在Struts层，对于一个功能，我们一般分为两个Action，一个Action里的功能是不需要调用Struts的验证功能的（常见的方法名称有add,edit,remove,view,list），另一个是需要调用Struts的验证功能的（常见的方法名称有insert,update）。<br />　　<br />　　就拿论坛发贴来说吧，论坛发贴首先需要跳转到一个页面，你可以填写帖子的主题和内容，填写完后，单击“提交”，贴子就发表了，所以这里经过两个步骤：<br />　　<br />　　1、转到一个新增的页面，在Action里我们一般称为add，例如：<br />　　<br />　　public ActionForward add(ActionMapping mapping, ActionForm form,<br />　　<br />　　HttpServletRequest request, HttpServletResponse response)<br />　　<br />　　throws Exception {<br />　　<br />　　//这一句是输出调试信息，表示代码执行到这一段了<br />　　<br />　　log.debug(":: action - subject add");<br />　　<br />　　//your code here<br />　　<br />　　//这里保存Token值<br />　　<br />　　saveToken(request);<br />　　<br />　　//跳转到add页面，在Structs-config.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>里面定义，例如，跳转到subjectAdd.jsp<br />　　<br />　　return mapping.findForward("add");<br />　　<br />　　}<br />　　<br />　　2、在填写标题和内容后，选择 提交 ，会提交到insert方法，在insert方法里判断，是否重复提交了。<br />　　<br />　　public ActionForward insert(ActionMapping mapping, ActionForm form,<br />　　<br />　　HttpServletRequest request, HttpServletResponse response){<br />　　<br />　　if (isTokenValid(request, true)) {<br />　　<br />　　// 表单不是重复提交<br />　　<br />　　//这里是保存数据的代码<br />　　<br />　　} else {<br />　　<br />　　//表单重复提交<br />　　<br />　　saveToken(request);<br />　　<br />　　//其它的处理代码<br />　　<br />　　}<br />　　<br />　　}<br />　　<br />　　下面更详细一点（注意，下面所有的代码使用全角括号）：<br />　　<br />　　1、你想发贴时，点击“我要发贴”链接的代码可以里这样的：<br />　　<br />　　〈html:link action="subject.do?method=add"〉我要发贴〈/html:link〉<br />　　<br />　　subject.do 和 method 这些在struct-config.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>如何定义我就不说了，点击链接后，会执行subject.do的add方法，代码如上面说的，跳转到subjectAdd.jsp页面。页面的代码大概如下：<br />　　<br />　　〈html:form action="subjectForm.do?method=insert"〉<br />　　<br />　　〈html:text property="title" /〉<br />　　<br />　　〈html:textarea property="content" /〉<br />　　<br />　　〈html:submit property="发表" /〉<br />　　<br />　　〈html:reset property="重填" /〉<br />　　<br />　　〈html:form〉<br />　　<br />　　如果你在add方法里加了“saveToken(request);”这一句，那在subjectAdd.jsp生成的页面上，会多一个隐藏字段，类似于这样〈input type="hidden" name="org.apache.<a href="http://www.javaresource.org/struts/struts-24.html">struts</a>.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，<br />　　<br />　　2、点击发表后，表单提交到subjectForm.do里的insert方法后，你在insert方法里要将表单的数据插入到数据库中，如果没有进行重复提交的控制，那么每点击一次浏览器的刷新按钮，都会在数据库中插入一条相同的记录，增加下面的代码，你就可以控制用户的重复提交了。<br />　　<br />　　if (isTokenValid(request, true)) {<br />　　<br />　　// 表单不是重复提交<br />　　<br />　　//这里是保存数据的代码<br />　　<br />　　} else {<br />　　<br />　　//表单重复提交<br />　　<br />　　saveToken(request);<br />　　<br />　　//其它的处理代码<br />　　<br />　　}<br />　　<br />　　注意，你必须在add方法里使用了saveToken(request)，你才能在insert里判断，否则，你每次保存操作都是重复提交。<br />　　<br />　　记住一点，Struts在你每次访问Action的时候，都会产生一个令牌，保存在你的Session里面，如果你在Action里的函数里面，使用了saveToken(request);，那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。<br />　　<br />　　如果你在你Action的方法里使用了isTokenValid，那么Struts会将你从你的request里面去获取这个令牌值，然后和Session里的令牌值做比较，如果两者相等，就不是重复提交，如果不相等，就是重复提交了。<br />　　<br />　　由于我们项目的所有Action都是继承自BaseDispatchAction这个类，所以我们基本上都是在这个类里面做了表单重复提交的控制，默认是控制add方法和insert方法，如果需要控制其它的方法，就自己手动写上面这些代码，否则是不需要手写的，控制的代码如下：<br />　　<br />　　public abstract class BaseDispatchAction extends BaseAction {<br />　　<br />　　protected ActionForward perform(ActionMapping mapping, ActionForm form,<br />　　<br />　　HttpServletRequest request, HttpServletResponse response)<br />　　<br />　　throws Exception {<br />　　<br />　　String parameter = mapping.getParameter();<br />　　<br />　　String name = request.getParameter(parameter);<br />　　<br />　　if (null == name) { //如果没有指定 method ，则默认为 list<br />　　<br />　　name = "list";<br />　　<br />　　}<br />　　<br />　　if ("add".equals(name)) {<br />　　<br />　　if ("add".equals(name)) {<br />　　<br />　　saveToken(request);<br />　　<br />　　}<br />　　<br />　　} else if ("insert".equals(name)) {<br />　　<br />　　if (!isTokenValid(request, true)) {<br />　　<br />　　resetToken(request);<br />　　<br />　　saveError(request, new ActionMessage("error.repeatSubmit"));<br />　　<br />　　log.error("重复提交！");<br />　　<br />　　return mapping.findForward("error");<br />　　<br />　　}<br />　　<br />　　}<br />　　<br />　　return dispatchMethod2(mapping, form, request, response, name);<br />　　<br />　　}<br />　　<br />　　} <br /><img src ="http://www.blogjava.net/os586/aggbug/99305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-02-11 22:00 <a href="http://www.blogjava.net/os586/archive/2007/02/11/99305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让dreamweaver 支持Struts标签库</title><link>http://www.blogjava.net/os586/archive/2007/02/08/98722.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 08 Feb 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/02/08/98722.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/98722.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/02/08/98722.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/98722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/98722.html</trackback:ping><description><![CDATA[我经常使用dreameweaver来编辑网页,所见即所得.<br /><br />但是该软件对struts标签不支持,因此<br /><br />可以在<a href="http://www.cnblogs.com/Files/bjzhanghao/ast-03.zip">http://www.cnblogs.com/Files/bjzhanghao/ast-03.zip</a>下载该软件的插件,用来支持Struts.<br /><br />下载后用dreamweaver的插件管理器来打开.mpx文件,即可使用了.<br /><br /><br /><br />不过我安装后没有找到这个插件的使用菜单.<br /><br />最后我在编辑菜单的标签库当中把相关的 tld文件导入后即可以使用了.<br /><br />大家有没有使用过这个插件的?<br /><br /><br /><br />这样后,标签的提示功能也不错啊.<br /><img src ="http://www.blogjava.net/os586/aggbug/98722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-02-08 13:23 <a href="http://www.blogjava.net/os586/archive/2007/02/08/98722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts常见错误及原因分析</title><link>http://www.blogjava.net/os586/archive/2007/02/08/98694.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 08 Feb 2007 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/02/08/98694.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/98694.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/02/08/98694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/98694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/98694.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">
				<strong>1异常</strong>
				<br />javax.servlet.jsp.JspException:Cannotretrievemappingforaction/Login（/Login是你的action名字）</p>
		<p style="TEXT-INDENT: 2em">可能原因:action没有再struts-config.xml中定义，或没有找到匹配的action，例如在JSP文件中使用 </p>
		<p style="TEXT-INDENT: 2em">处理:如果出现上述异常，请查看struts-config.xml中的定义部分，有时可能是打错了字符或者是某些不符合规则，可以使用strutsconsole工具来检查。</p>
		<p style="TEXT-INDENT: 2em">
				<strong>2异常</strong>
				<br />org.apache.jasper.JasperException:Cannotretrievedefinitionforformbeannull</p>
		<p style="TEXT-INDENT: 2em">可能原因:这个异常是因为Struts根据struts-config.xml中的mapping没有找到action期望的formbean。大部分的情况可能是因为在form-bean中设置的name属性和action中设置的name属性不匹配所致。换句话说，action和form都应该各自有一个name属性，并且要精确匹配，包括大小写。这个错误当没有name属性和action关联时也会发生，如果没有在action中指定name属性，那么就没有name属性和action相关联。当然当action制作某些控制时，譬如根据参数值跳转到相应的jsp页面，而不是处理表单数据，这是就不用name属性，这也是action的使用方法之一。</p>
		<p style="TEXT-INDENT: 2em">
				<strong>3异常</strong>
				<br />Noactioninstanceforpath/xxxxcouldbecreated</p>
		<p style="TEXT-INDENT: 2em">可能原因</p>
		<p style="TEXT-INDENT: 2em">特别提示：因为有很多中情况会导致这个错误的发生，所以推荐大家调高你的web服务器的日志/调试级别，这样可以从更多的信息中看到潜在的、在试图创建action类时发生的错误，这个action类你已经在struts-config.xml中设置了关联（即添加了<action></action>标签）。</p>
		<p style="TEXT-INDENT: 2em">在struts-config.xml中通过action标签的class属性指定的action类不能被找到有很多种原因，例如：</p>
		<p style="TEXT-INDENT: 2em">定位编译后的.class文件失败。Failuretoplacecompiled.classfilefortheactionintheclasspath(在web开发中，class的的位置在rWEB-INF/classes，所以你的actionclass必须要在这个目录下。例如你的action类位于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设置action的属性type时就是action.Login).</p>
		<p style="TEXT-INDENT: 2em">拼写错误，这个也时有发生，并且不易找到，特别注意第一个字母的大小写和包的名称。</p>
		<p style="TEXT-INDENT: 2em">在struts-config.xml中指定的action类没有继承自Stuts的Action类，或者你自定义的Action类没有继承自Struts提供的Action类。</p>
		<p style="TEXT-INDENT: 2em">你的action类必须继承自Struts提供的Action类。</p>
		<p style="TEXT-INDENT: 2em">你的classpath的问题。例如webserver没有发现你的资源文件，资源文件必须在WEB-INF/classes/目录下。</p>
		<p style="TEXT-INDENT: 2em">
				<strong>4异常</strong>
				<br />javax.servlet.jsp.JspException:Nogettermethodforpropertyusernameofbeanorg.apache.struts.taglib.html.BEAN</p>
		<p style="TEXT-INDENT: 2em">可能原因</p>
		<p style="TEXT-INDENT: 2em">没有位formbean中的某个变量定义getter方法</p>
		<p style="TEXT-INDENT: 2em">这个错误主要发生在表单提交的FormBean中，用struts标记</p>
		<p style="TEXT-INDENT: 2em">5Exceptionjavax.servlet.jsp.JspException:CannotfindActionMappingsorActionFormBeanscollection</p>
		<p style="TEXT-INDENT: 2em">可能原因</p>
		<p style="TEXT-INDENT: 2em">不是标识StrutsactionServlet的<servlet></servlet>标记就是映射.do扩展名的<sevlet-mapping></sevlet-mapping>标记或者两者都没有在web.xml中声明。</p>
		<p style="TEXT-INDENT: 2em">在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺少一个标记的关闭符号/&gt;。最好使用strutsconsole工具检查一下。</p>
		<p style="TEXT-INDENT: 2em">另外，load-on-startup必须在web.xml中声明，这要么是一个空标记，要么指定一个数值，这个数值用来表servlet运行的优先级，数值越大优先级越低。</p>
		<p style="TEXT-INDENT: 2em">还有一个和使用load-on-startup有关的是使用Struts预编译JSP文件时也可能导致这个异常。</p>
		<p style="TEXT-INDENT: 2em">6Exception</p>
		<p style="TEXT-INDENT: 2em">javax.servlet.jsp.JspException:Cannotfindbeanorg.apache.struts.taglib.html.BEANinanyscope</p>
		<p style="TEXT-INDENT: 2em">ProbableCauses</p>
		<p style="TEXT-INDENT: 2em">试图在Struts的form标记外使用form的子元素。这常常发生在你在</p>
		<p style="TEXT-INDENT: 2em">后面使用Struts的html标记。</p>
		<p style="TEXT-INDENT: 2em">另外要注意可能你不经意使用的无主体的标记，如，这样web服务器解析时就当作一个无主体的标记，随后使用的所有标记都被认为是在这个标记之外的，如又使用了</p>
		<p style="TEXT-INDENT: 2em">还有就是在使用taglib引入HTML标记库时，你使用的prefix的值不是html。</p>
<img src ="http://www.blogjava.net/os586/aggbug/98694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-02-08 11:14 <a href="http://www.blogjava.net/os586/archive/2007/02/08/98694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>