JAVA基础
1. Bigdecimal不能直接转Double的问题
Bigdecimal转Double正确方法:decimalVal.doubleValue()
BigDecimal decimalVal = BigDecimal.valueOf(1.23);
System.out.println(decimalVal.toString());// 1.23
Double doubelVal = decimalVal.doubleValue();
System.out.println(doubelVal.toString());// 1.23
平时涉及到金钱的问题都是用的Bigdecimal类型 ,但这里要提出一个很重要的注意事项:存在精度损失的转换一定要先转成字符串,再进行类型转换。
将在上面代码中BigDecimal.valueOf(1.23);
改为new BigDecimal(1.23)
,
decimalVal.toString()
打印结果为:1.229999999999999982236431605997495353221893310546875。
这是因为小数在只能认识0和1的电脑中是无法准确描述的,因此需要将其先转成字符串,所以double转Bigdecimal的正确方式是:
BigDecimal decimalVal = BigDecimal.valueOf(1.23);
翻看源码会发现,其实底层就是先转字符串再转的Bigdecimal:
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
2
一、Eclipse/Tomcat
1.eclipse3.6默认指向 WebContent 目录 修改为 webRoot
在 eclipse3.6中 , 它默认指向 的webRoot 为 WebContent目录 ,如果 , 我们的项目 webRoot 目录不是这个名 , 我们迁移项目时等情况就会出现404。如何更改?
第一种情况, 新建项目时的设置:
在新建对话框下一步, 进行到 Web Module 时将 Content Directory 的名字改为你想要的名字就可以了
第二情况, 项目已经存在时的设置 ,加载一个已有 web 项目到 eclipse 中时
1、增加 web Facets, 对着项目根节点,右键 , 选择 Properties, 在弹出的对话框中,选择 Project Facets ,在右边的选择框中,勾选 Java 和 Dynamic Web Module ,并在 Dynamic Web Module 后数字中,选择 jsp 的版本,默认为 3.0.
2、还是在 这个界面,选中,这时,选择列表下面会出现“ Further Configuration availabe ” 的链接 ,点击这个链接,设置src 和 out path, 下一步,就是 Web Module 的设置了,第一项所说,更改 Content Directory 名字为你的 webRoot 目录名字即可。
以下两步是在eclipse 没有自动为导入的项目进行过相关设置的前提下进行的 (也就是项目根目录下没有 .settings 文件夹 ) ,如果导入项目后, eclipse 自动将 java 和 Dynamic Web Module 选好了,但配置的相关路径不正确,我们又应该怎么办呢?
一种方式 : 将项目根目录下的.settings 文件夹删除,对项目进行 refresh 一下 ( 一定要刷新下 ) ,然后,再进行第二项的1 、 2 小点的步骤。这时,去增加 web Facets 时,原来的 √ 选才会被清除掉,可以进行重新设置。
另一种方式 :改配置文件,打开.setting 文件夹下的 org.eclipse.wst.common.component文件 ,用记事本打开,
<wb-module deploy-name="AMS">
<wb-resource deploy-path="/" source-path="/ WebContent "/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="context-root" value="AMS"/>
<property name="java-output-path" value="/AMS/ WebContent /WEB-INF/classes"/>
</wb-module>
找到红色标识的那句话,将蓝色标识的文件夹目录改为你的webRoot 目录名 , 即可。如果没有红色标识这一行,就自行加上去即可。
同时
将.jsdtscope 文件
<classpathentry kind="src" path=" WebContent "/>
同步改成与上面的 source-path一致
将org.eclipse.wst.common.project.facet.core.xml 文件 中
<installed facet="java" version=" 1.6 "/>
这一行指定 JDK 版本
<installed facet="jst.web" version=" 2.5 "/>
这一行指定 Web 版本 , 指 servlet 和 jsp ,另外,如果这里 改了web 的版本,注意同步把 web.xml 中的 中相关的 xmlns 指到相应的版本
2.3——
<web-app id="WebApp_ID" version="2.3" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
2.4——
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<installed facet="wst.jsdt.web" version=" 1.0 "/> 这一行指定 JavaScript 版本
2. 启动tomcat时报 org.apache.catalina.LifecycleException: Failed to start component
有几种原因:
1.Web.xml里的配置写错了
2.路径不对
我当时就是这个原因,因为我的eclipse默认项目的根目录是WebContent,而我的项目里是WebRoot。解决办法同第一个问题
3.项目中有jar冲突
3.eclipse中如何用远程git代码覆盖本地文件里的代码
- 右击你的文件>> Team >>Show in History
- 之后你会发现此文件的所有版本,右击菜单中的Compare with Workspace,可以比对所选择的版本和本地当前版本文件的不同,找到与之前远程git上的代码一致的那个版本
- 右击需要的版本,选择Reset>>Hard
MySQL
1.OR的用法注意(将或者条件字段用括号括起来)
例如需求是:查询表中年龄大于10或身高小于100cm且性别是男的所有人
当然其他实现方式可能更高效,但这里只是为了说明OR的用法。
错误示例:Select * from user where sex=’男’ and age>=11 OR height<=100;
正确示例:Select * from user where sex=’男’ and ( age>=11 OR height<=100 );
在错误示例中,因为没有加括号,OR后面的height<=100会将男和女的满足该条件的都查出来
前端
1. 前端页面中的某个问题总是随机出现时的原因分析
“随机”?计算机中在相同条件下每次运行的结果不完全一致的情况就是随机。但,程序的执行顺序可是一定的,怎么会随机呢!
在前端代码中,只有一种情况是最可能的随机,那就是执行代码的时间。代码的运行”总时间”会是不确定的,而前端使用最多就是Ajax这种请求时间不一定的“异步”请求,当多个ajax请求在成功之后都对某个共享数据进行操作时,就会由于请求时间的长短不同而导致对共享变量的操作顺序不同,最终导致结果不一致。
举个栗子
<body>
<input id="myId" /> <!-- 这里的结果会随机出现1和2-->
</body>
<script type="text/javascript">
// Ajax1
$.ajax({ url: "請求路徑", success: function(response){
$("#myId").val(1);
}});
// Ajax2
$.ajax({ url: "請求路徑", success: function(response){
$("#myId").val(2);
}});
</script>
上面代码中有两个几乎同时执行的Ajax异步请求,所以myId的结果总是显示请求时间长的那个ajax的结果。因为先执行完的ajax给myId赋值后,又会被后执行完的ajax的赋值操作给覆盖掉。