java开发经验总结1:
word页面只要在jsp头设置如下指令:
<%@page contentType="application/msword;charset=GBK" %>
excel如下:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.sql.*,java.io.*,ktj.*,java.util.*"%>
<%response.setHeader("Content-disposition","attachment; filename=result.xls" );%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">//这句话是必须要加的,如果
不加就是乱码。
..........
author=rs.getString("author")+" ";//在网页的内容里面加一个空格,因为如果没有空格,Excel会把99999999这样的字符串转化成科学 //计数法的方式进行显示,如果把网页显示的内容后面加入一个空格,那么Excel就会按照字符串来 //对待,就能显示正常了。
......
2:String对象中汉字和英文的识别
//String s1="邱礼强";//输出为6
//String s1="qiuliqiang";//输出为10
String s1="邱qiu";
byte[] b2=new byte[20];
b2=s1.getBytes();
out.println(b2.length);//输出为5,因为‘邱’为两个字节
2 :java中实现同步 synchronized
Synchronized是java实现互斥共享访问同一资源(属性、方法、对象)的一种机制,分为对方法的同步和对代码块的同步:
对方法的同步又可以分为对静态方法的访问和对非静态方法的访问,如果一个静态方法使用了Synchronized,则对任何对
该类该方法的访问都是互斥的,如果一个非静态方法使用了Synchronized,则只对同一对象实例所有Synchronized方法访问
是互斥的。
锁: 分为 对象锁 和 类锁 类锁的实现采用的是对象锁,不同的是,对象锁是针对java.lang.Object对象,而类锁是针对java.lang.Class对象。
A:无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B:每一个对象都有且只有一个锁与它相对应(对象锁)。
synchronized (object)就相当于给object对象加了锁。
如下面的代码:
class DBConnectionManager
{
.......
private static Object object=new Object();//object对象只在内存中存在一个,所以如果把
//该对象锁起来,别的程序肯定不能访问被锁住的代码。
public static DBConnectionManager getInstance()
{
if (dbc==null)//只生成一次
{
synchronized(object)//第一个先执行到这条语句的对象把object对象加了锁,其他的对象想执行下面的 //语句,如果别的对象也要执行这部分,就必须要等到限执行的把对象锁释放掉。
{
if (dbc==null)
{
try
{
//Class c = Class.forName(CLASSNAME);
dbc=new DBConnectionManager();
connectionPool = new ConnectionPool(driver, server, username, password,minConnections, maxConnections, logPath, connectionTimeout);
/*
initCtx = new InitialContext();
ctx = (Context) initCtx.lookup("java:comp/env");
obj = (Object) ctx.lookup("jdbc/xcb");
ds = (javax.sql.DataSource)obj;
*/
}
catch(Exception e)
{
System.out.println("DBConectionManager.getInstance() Error");
return null;
}
}
}
}
return dbc;
}
};
如果上面的代码变成如下:
.......
private Object object=new Object();
public DBConnectionManager getInstance(){
.......
那么假设在dbBean对象中用:DBConnectionManager dbc=new DBConnectionManager();
DBConnectionManager dbc1=new DBConnectionManager();
假设下面的两条语句同时执行,那么是可以同时执行的,因为每个对象的内部都有一个object。
dbc.getInstance();
dbc1.getInstance();
3:修改news1表中的file1字段的类型为varchar(200).
sql="ALTER TABLE news1 ALTER COLUMN file1 varchar(200)";
4:只显示1900年1月1到2006年1月10日的新闻
SELECT * FROM news1 WHERE (uptime BETWEEN '1900 - 1 - 1' AND '2006 - 1 - 10')
5:
ISO8859-1:8-位
UTF-8和Unicode所对应的汉字的编码都一样,都是遵守的GB2312编码。
可以这么描述JAVA程序中Unicode与UTF的关系,虽然不绝对:
字符串在内存中运行时,表现为Unicode代码,而当要保存到文件或其它介质中去时,用的是UTF。这个转化过程是由writeUTF和readUTF来完成的。(因为有好多字符用UTF编码表示只用1个字符就可以,可以节省空间)
如果jsp文件中没有指明所用的字符集,那么编译jsp文件的时候jdk就认为jsp文件采用的字符集是ISO8859-1,把jsp文件读入内存的时候按照
ISO8859-1---->Unicode的转换规则(8位转换为16位简单的把每个字节高八位补0)把jsp文件中的字符集转化为Unicode。正确的应该为
GB2312------->Unicode的转换规则进行转换。
6:
vector和HashTable是线程同步的,ArrayList和HashMap不是线程同步的。ArrayList以一个整数作为索引,HashMap以一个对象作为索引。
可以把ArrayList 对象放到HashMap对象中。
7:用dom4j解析xml文件。
SAXReader reader = new SAXReader();
reader.setValidation(true);//用xml文件头部定义的DTD文件来对xml进行检查。如
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "hibernate-mapping-3.0.dtd">
//如果用DTD文件对xml文件进行检查千万不要用"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
因为这样还得要jdk下载DTD文件,如果网速慢这样要等好长时间。可以采用两种方法解决:
1:不对xml进行检查。2:把DTD文件下载下来用"hibernate-mapping-3.0.dtd"本地格式。
8:对于要经常变化的字符串要用StringBuffer不要用String
java中的变量相当于一个地址指针(指向地址的指针)
如:String a="qiuliqiang";//jvm在内存中创建一个String对象,内容是“qiuliqiang”,a指向这个String对象的地址。
String a="hejingjing";//又生成了一个新的String对象,a又指向这个新的对象的地址。
String b="zhutou";
String a=a+b;//a+b后又生成了一个新的对象,内容是"hejingjingzhutou"然后a指向该对象。
如果上面改用StringBuffer就可以了。
9:引起内存溢出的原因:
静态的HashMap或HashTable,Vector,ArrayList对象对其他对象的引用使被引用的那个对象不能释放。
最好避免用过多的的局部变量。(String对象的相加会产生很多的局部变量)
用完对象后争取在最短的时间内让它为null,使得它能在最近的一次垃圾回收中被回收。
10:
在当前的弹出窗口内执行一面的语句,能改变原始的窗口的数据。(极品OA就用到了)
eval("window.opener."+obj_name+".value='" + name + "'");
11:遍历HashMap
用Entry
for (Iterator i=m.entrySet().iterator(); i.hasNext(); ) {
Map.Entry e = (Map.Entry) i.next();
System.out.println(e.getKey() + ": " + e.getValue());
}
或者用keySet
for (Iterator i=m.keySet().iterator(); i.hasNext(); ){
System.out.println(i.next()+":"i.get(i.next()));
}
12:
LinkedHashMap这个对象很适合作为缓存,它默认(accessOrder=false)情况下iterator能够按照添加的顺序进行遍历整个容器(它里面的每条记录都有一个指向下一个记录的链接),这样就可以很方便的找到最先添加到容器里面的那条记录(因为做缓存的时候要删除这条记录)
,这样就不用再为容器建立一个mapping了。
当(accessOrder=true)的时候,它能够把当前访问的记录放到iterator链的最后面,这样就可以让那些不经常访问的新闻到iterator链的最前面,然后删除的时候删除最前面的记录就可以了.
LinkedHashMap存取的速度很快(与HashMap一样),遍历的速度因为每条记录都有指向下条记录的指针,避免向HashMap一样查找,我觉得遍历速度要快于HashMap.
13:<jsp:include page="top.jsp"></jsp:include>和<%@ include file="top.jsp"%>的区别
(1):用<%@ include file="top.jsp"%>包含后可以使用top.jsp里面定义的变量。而前者就不可以.
除此之外基本相同;
两者都可以选择性的执行.(放到if else里面),不过原来好像只有<jsp:include page="top.jsp">可以。
14:tomcat5.0和jdk5组合的时候把一个项目设成reloadable="true"的时候,重新编译bean后出错,如果
用tomcat5.5和 jdk5组合就可以。不知道怎么回事,原来的tomcat 5好像可以
15:SqlServer数据分页
分页方案一:(利用Not In和SELECT TOP分页)
语句形式:SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表 ORDER BY id))
ORDER BY ID
-------------------------------------
分页方案二:(利用ID大于多少和SELECT TOP分页)语句形式:SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表 ORDER BY id) AS T))
ORDER BY ID
-------------------------------------
分页方案三:(利用SQL的游标存储过程分页)
createprocedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串@currentpage int, --第N页@pagesize int --每页行数as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句分页方案三:(利用SQL的游标存储过程分页)效率最差,但是最为通用
16:struts标签库显示list
LOGIC:ITERATE- -
<logic:iterate id="user" property="users" name="usersForm" type="net.wjp.pro.db.entity.logon.User">
<bean:write name="user" property="username"/><br/>
//代表的意思是:从USERSFORM中取的users的LIST,list里面的type是User里面的PROPERTY是USERNAME
</logic:iterate>
如:
<logic:iterate id="news" name="indexForm" property="tzgg" type="struts.pojo.SimpleObject">
<tr>
<td height="28" align="left" valign="top"><div align="center"> <img src="images/01_01.gif" width="6" height="5"></div></td>
<td align="left" valign="middle"><div align="left">
<a href="read.jsp?id=<bean:write name='news' property='id' format=''/>" target="_blank" class=hei12>
<bean:write name="news" property="title"/>
</a></div></td>
</tr>
</logic:iterate>
//indexForm是在struts-config.xml文件里定义
17:一段javascript代码
<script language=javascript>
function CheckForm()
{
for (x=0;x<200;x++){
oa=document.all("q"+x);
if(oa!=null&&oa.value=="")
{
alert("请输入药品价格!");
oa.focus();
return false;
}
}
}
</script>
<style type="text/css">
<!--
.style1 {
font-size: 24px;
font-weight: bold;
color: #FFFFFF;
}
-->
</style>
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center"><table width="600" border="0">
<tr>
<td align="center" bgcolor="#336666"><span class="style1">医药公司上传价格表</span></td>
</tr>
</table>
<table width="600" border="0" align="center" cellpadding="0" cellspacing="1">
<form name="gm" method="post" action="yyscok.asp" onSubmit="return CheckForm();">
<tr align="center" bgcolor="#999999">
<td width="131" height="13">药品名称</td>
<td width="97">药品剂型</td>
<td width="148">药品规格</td>
<td width="136">生产厂家</td>
<td width="82">价格</td>
</tr>
<tr bgcolor="#cccccc" οnmοuseοver="javascript:this.style.background= '#ECF2FC'"
οnmοuseοut="javascript:this.style.background = '#cccccc'">
<td>sdf</td>
<td>sdfsd</td>
<td>sdf</td>
<td>sdfs</td>
<td align="center">
<input id="q2" name="2" type="text" size="8" maxlength="8">
</td>
</tr>
<tr align="center">
<td colspan="5"><input type="submit" name="gm" value=" 提 交 "></td>
</tr>
</form>
</table>
</td>
</tr>
</table>
18:struts 下判断null值
如 <logic:notEmpty name="indexForm" property="tzgg">
<logic:iterate id="news" name="indexForm" property="tzgg" type="struts.pojo.SimpleObject">
<tr>
<td height="28" align="left" valign="top"><div align="center"> <img src="images/01_01.gif" width="6" height="5"></div></td>
<td align="left" valign="middle"><div align="left">
<a href="read.jsp?id=<bean:write name='news' property='id' format=''/>" target="_blank" class=hei12>
<bean:write name="news" property="title"/></a></div></td>
</tr>
</logic:iterate>
</logic:notEmpty>