07年6月20日
今天做整合了,遇到几个技术问题,整理出来:
(1)javascript中怎么把字符转化成ascii码及怎么把ascii码转化成字符
<script>
function updatecheck(id)
{
if(id=="1")
{
var fledtion ="";
//获得fileEditionNumber的值,并且截取第1位(第1位是英文字母A-Z)
var fileedition = document.forms[0].fileEditionNumber.value.substring(0,1);
//获得fileEditionNumber的值,并且截取第1位以后的东西,可以看出来,fileEditionNumber是由英文字母
A-Z+数字组成的
var digitnumber = document.forms[0].fileEditionNumber.value.substring(1);
if(digitnumber<99){
digitnumber++;
fledtion = fileedition ;
}else{
digitnumber="00";
//将字符转化为相应的ASCII码
var fileeditionCode = document.forms[0].fileEditionNumber.value.charCodeAt(0);
fileeditionCode = fileeditionCode+1;
//将上面转化的ASCII码转换成相应的字符
fledtion = String.fromCharCode(fileeditionCode);
}
var edir = fledtion + digitnumber;
//alert(edir);
document.forms[0].fileEditionNumber.value = edir;
}
if(id=="2")
{
var fileupdatenumber = document.forms[0].fileUpdateNumber.value;
fileupdatenumber++;
document.forms[0].fileUpdateNumber.value = fileupdatenumber;
}
}
</script>
<html:form action="略" method="post">
<table width="100%" height="25" border="0" cellpadding="0" cellspacing="0" class="font_14">
<tr>
<td><div align="center">变更:</div></td>
<td><input type="radio" name="update" value="1" onclick="javascript:updatecheck(this.value);"/>版本号 </td>
<td><input type="radio" name="update" value="2" onclick="javascript:updatecheck(this.value);"/>修订号 </td>
</tr>
<tr>
<td><div align="center">版本号:</div></td>
<td ><input type="text" name="fileEditionNumber" value="<%=fileEditionNumber%>"/></td>
</tr>
<tr>
<td width="130"><div align="center">修订号:</div></td>
<td><input type="text" name="fileUpdateNumber" value="<%=fileUpdateNumber%>"/></td>
</tr>
</table>
</html:form>
这就是解决问题的办法了。
(2)关于内存地址的问题(传说中的HashCode)
在我的DAO方法里,有这样的方法:
// 文件搜索的方法
public List lunceFileList(LunceFileForm luncefile, int pageSize, int page)
throws Exception {
List luncefileList = new ArrayList();
List values = new ArrayList();
List retList = new ArrayList();
String sql = " select vlune.fileId, vlune.fileName, vlune.upLoadDate, vlune.filePrincipal from Vluncefile vlune "
+ " where 1=1 ";
if (luncefile.getFileName() != null
&& !"".equals(luncefile.getFileName())) {
sql += " and vlune.fileName like ?";
values.add("%" + luncefile.getFileName() + "%");
}
if (luncefile.getUpLoadDate() != null
&& !"".equals(luncefile.getUpLoadDate())) {
sql += " and vlune.upLoadDate like ?";
values.add("%" + luncefile.getUpLoadDate() + "%");
}
Session session = this.getHibernateTemplate().getSessionFactory()
.openSession();
Query query = session.createQuery(sql);
query.setFirstResult(pageSize * (page - 1));
query.setMaxResults(pageSize);
if (values.size() > 0) {
for (int i = 0; i < values.size(); i++) {
query.setString(i, values.get(i).toString());
}
}
retList = query.list();
if (retList.size() != 0) {
for (int i = 0; i < retList.size(); i++) {
LunceFileForm luncefile2 = new LunceFileForm();
Object[] objs = (Object[]) retList.get(i);
if (objs != null) {
FileInfoVO fileInfo = new FileInfoVO();
luncefile2.setFileId((new Integer(objs[0].toString())));// String转化为integer
luncefile2.setFileName((String) objs[1]);
luncefile2.setUpLoadDate((String) objs[2]);
luncefile2.setUserName((String) objs[3]);
luncefileList.add(luncefile2);
}
}
}
session.flush();
session.clear();
session.close();
return luncefileList;
}
这是我建的基于大概九张表的全文搜索视图,注意这段代码蓝色部分,就是我今天遇到的问题,一开始我没有写这行蓝色的代码,查出的数据就是一条,而且是完全相同的一条数据,我大汗。。。难道是辛苦建的视图出错了?回头检查了一下,没有错!Oh yes!!!
看来是程序错了。。。。单步调试,发现程序确实封装了想要的数据,但是为什么却显示相同的数据?问问吧,才知道,当我没写那行蓝色的代码时,封装的对象只new了一次的,当在循环里面,循环一次把数据加在这个内存地址里一次,这样下去,虽然循环了3次,但是却把先前循环出的数据给覆盖了,程序的单步调试是看不出来的!循环几次就覆盖几次,还都加在了List里面。。。。。最后得到的是循环N次的相同的N个数据!这段蓝色的代码必须写在循环体的里面!循环一次,就new一个对象,虽然new的对象名字相同,但是内存地址是不同的,再加在List里面就不会覆盖数据了,而且程序运行找的是内存地址,所以对象名字相同也不会有任何影响的!这就是传说中的hashcode,而且,每次只要重启java虚拟机,得到的内存地址也是不同的!
(3)顺便把java中字符和ascii码的转换
1、字符转换为ASCII值
char y=''a'';
int x = (int)y;
System.out.println(x);
2、ASCII值转换成字符
String aa=String.valueOf((char)13);
这是我们经理给我的方法,但是在这里我却用上面的javascript实现的,但是留着吧,以后一定会有用处,多学学没坏处。