小蚂蚁绊倒大象系列

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同样输出了不精确的值:

bigDecimal-->0.610000000000000042188474935755948536098003387451171875

修改

System.out.println("bigDecimal-->"+(new BigDecimal("1.03")).subtract(new BigDecimal("0.42")));

用String来构造BigDecimal,则输出正确结果!
在商业计算中我们要用java.math.BigDecimal,而且非要用String来够造BigDecimal不可!


Effective Java中买糖果的例子:
float double版

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,解决问题!

这个经验告诉我们遇到问题要善于动脑,遇到瓶颈穷途末路的时候,一定要往源头上查找原因!!深挖本质!深挖!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值