1 Struts2
<%@ taglib uri="/struts-tags" prefix="s" %>
提示:
Cannot find the tag library descriptor for /struts-tags
此错误出现在jsp 页面中 <%@taglib prefix="s" uri="/struts-tags"%>
1、struts.xml 没有正确放置,将struts.xml 放到src目录下,redeploy
2、没有正确导入struts库,把struts2相关的几个lib放在你(tomcat中)工程的WEB-INF/lib下面就可以了
3、<%@taglib prefix="s" uri="/struts-tags"%> 有特殊字符 ,删掉重写(^_^)
初步看必须的5个包我都加进去了
commons-logging-1.0.4.jar
freemarker-2.3.12.jar
ognl-2.6.11.jar
struts-core-1.3.5.jar
这基本上都是从struts-2.1.2包lib目录下加进来的。
反复的检查还是没有解决问题,搞得我蛋疼的不行。
最后从一个国外的论坛偶然间看到:
Have you added the struts2-core-.jar to the libraries of the project? If you have try to clean the project.
突然灵机一动,在和以前的一个Struts2工程比较果然是struts-core jar包版本不一致,于是替换了
struts2-core-2.1.2.jar 问题解决了。
最终lib下的jar包:
struts2-core-2.1.2.jar
commons-logging-1.0.4.jar
freemarker-2.3.12.jar
ognl-2.6.11.jar
xwork-2.1.1.jar
commons-lang-2.3.jar
commons-digester-1.6.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
【总结】
调试这个非常简单的例子大约花费了2~3天的时间,非常的蛋疼。就是因为一个struts2-core 的版本造成的原因。
所以说皮裤套棉裤必定有缘故,有果必有因!
2 如果要求精确计算的答案,请避免使用float和double
这是《Effective Java》一书中第31条提到的
float和double类型对于货币计算尤为不适。
书中推荐了BigDecimal类型,但我自己测试了一下,BigDecimal也是有缺点的。
这可能也是Java的缺陷吧。
测试:
public void test(){ double m = 1.03; double n = 0.42; double r = m - n; System.out.println("r-->" + r); System.out.println(1.00 - 9 * 0.10); System.out.println("bigDecimal-->"+(new BigDecimal(m).subtract(new BigDecimal(n)))); System.out.println("bigDecimal-->"+(new BigDecimal(m).subtract(new BigDecimal(n), new MathContext(2)))); }
bigDecimal-->0.610000000000000042188474935755948536098003387451171875
修改
System.out.println("bigDecimal-->"+(new BigDecimal("1.03")).subtract(new BigDecimal("0.42")));
public void buyCandy(){ double funds = 1.00; int items = 0; for(double price = 0.10; funds >= price; price += 0.10){ funds -= price; items++; } System.out.println("items bought: " + items); System.out.println("Change: $" + funds); }
确如书中所说运行结果不对:
结果只能买3个糖果
items bought: 3
Change: $0.3999999999999999
用BigDecimal改进后:
public void buyCandy2(){ BigDecimal funds = new BigDecimal(1.00); final BigDecimal TEN_CENTS = new BigDecimal(0.10); int items =0; for(BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price.add(TEN_CENTS)){ funds.subtract(price); items++; } System.out.println("items bought: " + items); System.out.println("Change: $" + funds); }
运行奇慢,5分钟出不来结果,看来货币精确运算是Java的短肋啊。
jdk1.6环境
用BigDecimal的好处就是四舍五入方便,还有一个就是当数值范围超过18位时,必须使用BigDecimal。
4.iBatis动态语句dynamic where
举例
<dynamic prepend="where">
<isNotNull property="name" prepend="and">
name=#name#
</isNotNull>
<isNotNull property="sex" prepend="and">
sex=#sex#
</isNotNull>
</dynamic>
注意:
第一个条件处就有prepend="and"
说明:
1)dynamic的prepend只要检测到第一个为“真”的条件比较元素,则覆盖其prepend属性并组装where关键字为动态SQL的一部分。
2)isNotNull的prepend只要检测到参数值满足比较条件,则前置组装and关键字为动态SQL的一部分。
5. org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
version 51.0 表示jdk1.7;
这是eclipse IDE界面 maven clean时爆出的错误。然而mvn -v 的时候并无错误提示。
为这个错误纠缠了好半天,百思不得其解,最后醒悟了Eclipse Mars 内置的Maven版本是3.3.3,我勒个去,被害惨了,3.3.3需要jdk最低的版本是1.7,而我工程jdk编译的级别是1.6。
windows->Preferences->Maven->Installations 将maven版本指向3.0.5
Ok,解决问题!
这个经验告诉我们遇到问题要善于动脑,遇到瓶颈穷途末路的时候,一定要往源头上查找原因!!深挖本质!深挖!