昨天干啥了?呵呵,昨天没过来写,哈哈现在是周五了,噢对,哈哈,昨天有活干了,让我做一个上传图片,把图片报存在数据库中,然后再读出来显示,要能查 询、添加、删除。好了动手吧,以前做过一个上传图片,但是不是把图片报存在数据库中,大同小异了。把关键代码贴在这里,供以后参考。
-----------------------------上传页面---------------------------------------------------------------
<%@page contentType="text/html; charset=gb2312" %>
<%@ taglib uri="/WEB-INF/struts-html" prefix="html"%>
<html>
<head>
<title>上传图片</title>
</head>
<body>
<h2>选择图片(JPEG格式, 大小小于1M)</h2>
<br>
<html:form action="/upload.do" enctype="multipart/form-data">
<html:errors/>
<table>
<tr>
<TD><html:file property="file" size="50"></html:file></TD>
</tr>
<TR height="20" valign="top" topmargin="0">
<TD>备注:</TD>
</tr>
<tr>
<TD><html:textarea rows="3" cols="40" property="memo"></html:textarea></TD>
</TR>
<tr>
<tr height="20">
</tr>
<tr>
<TD height="22" align="center">
<html:submit> 上 传 </html: submit> <input type="button" value=" 取 消 " onclick="window.close()"/></TD>
</tr>
</table>
</html:form>
</body>
</html>
--------------------------------------action--UploadAction-----------------------------------------------------
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setCharacterEncoding("gb2312"); //如果不设置,弹出的提示框是乱码
UploadForm uploadForm = (UploadForm) form;
FormFile file = uploadForm.getFile();
String memo = uploadForm.getMemo();
String fileName = file.getFileName();
int length = file.getFileSize();
InputStream imgStream = null;
ActionMessages msgs = new ActionMessages();
//向数据库插入记录
try {
imgStream = file.getInputStream();
UserImg newUserImg = new UserImg();
newUserImg.setImg(imgStream);
newUserImg.setImgName(fileName);
newUserImg.setMemo(memo);
newUserImg.setFileSize(length);
if(UploadImageDao.getInstance().insertImg(newUserImg))
{
response.getWriter().write(
CSScript.alertAndCloseScript(MessageKey.IMAGE_UPLOAD_SUCCESS));
return null;
}
else
{
msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
MessageKey.IMAGE_UPLOAD_FAILED));
saveErrors(request, msgs);
}
} catch (IOException e) {
msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
MessageKey.IMAGE_UPLOAD_FAILED));
saveErrors(request, msgs);
} finally {
try {
if (imgStream != null)
imgStream.close();
} catch (Exception e) {
//do nothing here
}
}
return mapping.getInputForward();
}
--------------------------------------弹出提示框的类----------------------------------------------------------
public final class CSScript {
private static final String S_OPEN = "<script>";
private static final String S_CLOSE = "</script>";
public static String alertAndCloseScript(String alert)
{
StringBuffer sb = new StringBuffer(S_OPEN);
sb.append("alert('").append(alert).append("!');");
sb.append("window.close();");
sb.append("window.opener.document.location.reload();");
sb.append(S_CLOSE);
return sb.toString();
}
public static String errorScript(String err)
{
StringBuffer sb = new StringBuffer(S_OPEN);
sb.append("alert('").append(err).append("!');");
sb.append(S_CLOSE);
return sb.toString();
}
public static String alertScript(String alert)
{
StringBuffer sb = new StringBuffer(S_OPEN);
sb.append("alert('").append(alert).append("!');");
sb.append(S_CLOSE);
return sb.toString();
}
}
---------------------------------------插入数据库的方法-----------------------------------------------------
public boolean insertImg(UserImg userImg)
{
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
try
{
Connection conn = session.connection();
PreparedStatement psta = conn.prepareStatement("insert into userImg values(?,?,?)");
psta.setString(1,userImg.getImgName());
psta.setBinaryStream(2, userImg.getImg(),userImg.getFileSize());
psta.setString(3, userImg.getMemo());
psta.execute();
tran.commit();
}
catch(Exception e)
{
e.printStackTrace();
tran.rollback();
return false;
}
finally
{
HibernateSessionFactory.closeSession();
}
return true;
}
注意,这里可以看到涌到了hibernate的session,但还是用的jdbc插入数据库,是因为hibernate对image类型的字段支持不好。
-----------------------------------------读取图片的action-getImg.do-----------------------------------------------------------
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
int id = Integer.parseInt(request.getParameter("id"));
InputStream inStream = UploadImageDao.getInstance().getImg(id);
response.setContentType("image/pjpeg");
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inStream.read(buffer, 0, 1024)) != -1) {
baos.write(buffer, 0, bytesRead);
}
OutputStream outs = response.getOutputStream();
outs.write(baos.toByteArray());
outs.flush();
inStream.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
页面中显示图片,这么写
<img width="100" height="100" src="getImg.do?id=<bean:write name="list" property="id"/>" />
以夸耀公司为荣、以唾骂公司为耻,
以拉拢客户为荣、以投靠客户为耻,
以崇尚技术为荣、以黑人电脑为耻,
以多写代码为荣、以拷贝粘贴为耻,
以团队协作为荣、以偷干私活为耻,
以无私奉献为荣、以跳槽走人为耻,
以办事听话为荣、以迟到早退为耻,
以收发伊妹为荣、以提笔耗纸为耻
工作日志
2007年4月11日 星期三
上班的第二个星期,昨天,临下班的时候终于能上网了呵呵,上一个星期里,真的是煎熬啊,还不如交给我一些事做,让我忙活忙活 ,什么事都没有,没人理,电脑没有网络,刚重装的系统,什么软件没有,哦天哪,想起以前石家庄的那个公司,虽然规模不大,但是很温馨,给刚去的员工配一名 导师来帮助 新员工融入新集体,还带着到各部分 认识同事,呵呵,这倒好,整个没人理,哦天,这就是大公司?唉 ,也不算什么大公司,与石家庄的我的那家公司比吧,真的是比较失望,什么都不给讲,莫名其妙的,什么时候上班什么时候下班都不给讲,可能还没正式开始? 唉,算了不说了,乱七八糟的。
说说今天吧,还是说昨天,呵呵,昨下午来了个人(据说是我们部门的老总)把我们邮箱要去了,然后能上网了就受到了封邮件,说是要培训,先自己学习一下,今 天到了就打开电脑,开始看,真的很郁闷,和我同去的几个人,都有人安排事做,就没人理我,真的是纳闷有郁闷,狗日的,到底是为啥?看我能力不行?
下午吃完中午饭回来,趴了会儿,刚清醒过来,来了个人,让我们去听课培训,让去就去吧,结果是讲销售方法的,我晕,听吧,还是能听到一些有意义的东西的, 我发现我们部门也没多少人啊,狗日的,连我们部门头儿是谁,都不知道,呵呵,是不是我有问题?我应该主动去问?是这样么?
听课下来听的我头疼,下班了 回家 呵呵。一天就这么过去了。真快。
创建时间:2007年4月4日, 10:58:38
年前买的Effective java到今天就看了三条,今天带到公司看。写这书的人有多丰富的经验阿,太
有才啦,哈哈,各种情况面面俱到,太厉害了,边看边佩服人家,哈哈。书上的每一句话,都要得
仔细的琢磨,仔细的回味,真的回味无穷,受益匪浅,相信像我这样的水平还没有体会出更深层次
的内涵,先写下自己的一点体会。
创建和销毁对象
--避免创建重复对象
这里的说法都不是绝对的,对于比较庞大的对象创建成本是昂贵的,而这个对象是不变的,
所以我们可以重用它,以减少内存增加。
避免创建重复对象的方法,有几种,这要看在什么场合,可以使用静态工厂方法,可以使
用static代码块,可以使用延时加载(也就是只有在需要这个对象的时候才在第一次初始
化)
--消除过期的对象引用
这里面有个名词,就是过期引用,过期引用就是那些已经没有实际用处的引用,这些对象
引用不会被垃圾回收机制发现,所以必须由程序员手动告诉垃圾回收机制这个对象引用没
用了,可以回收了,如何告诉它呢,把引用=null就可以了。
--避免使用终结函数
finalizer函数不能保证会被调用,这一点增加了不确定性,简单的说finalizer这家伙是
不可信任的,交给它的事可能办,也可能不办,这是不确定的,所以我们不能放心的交给
它重要的任务。
如果想清理某个对象,可以考虑在try...catch...finally{中执行},它能保证即使产生异
常,也能保证清理会被执行。
上周五第一天上班,到今天,每天都在这死死的坐着,一个除了系统文件没有其他任何东西的机器,
没有网络,没有人理,真是无聊的人,怎么也得给介绍一下公司的情况,讲讲作息时间,各项制度、
规定之类的,几点上班几点下班都没说过,大家都在忙什么?有事找谁都不知道,我晕。
一个上午又过去了,无聊,发发牢骚,呵呵。
java Studio Creator
java.lang.IllegalArgumentException:Cannot invoke ***Form.set*** - argument type mismatch
Form中是Date类型,把Date换成String;在Action中进行转换;当然转换要借助于SimpleDateFormate方法
上传文件时在form中增加enctype="multipart/form-data"
org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.cs.data.project.ProjectImage.setShenbao1
查询结果中包含null的项 对于一些数字项包含null,定义该项时必须使用wrapper类型,而不能是primitive类型,例如使用Integer等,而不能是int否则会抛出exception!
1.250定律
拉德认为:每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢得了250个人的好感;反之,如果你得罪了一名顾客,也 就意味着得罪了250 名顾客。 在你的网站访客中,一个访客可能可以带来一群访客,任何网站都有起步和发展的过程,这个过程中此定律尤其重要。
2.达维多定律
达维多认为,一个企业要想在市场上总是占据主导地位,那么就要做到第一个开发出新产品,又第一个淘汰自己的老产品。 国内网站跟风太严重,比如前 段时间的格子网,乞讨网,博客网,一个成功了,大家一拥而上。但实际效果是,第一个出名的往往最成功,所以在网站的定位上,要动自己的脑筋,不是去捡人家 剩下的客户。同理,买人家出售的数据来建站效果是很糟糕的。
3.木桶定律
水桶定律是指,一只水桶能装多少水,完全取决于它最短的那块木板。这就是说任何一个组织都可能面临的一个共同问题,即构成组织的各个部分往往决定了整 个组织的水平。 注意审视自己的网站,是速度最糟糕?美工最糟糕?宣传最糟糕?你首先要做的,不是改进你最强的,而应该是你最薄弱的。
4.马太效应
《新约》中有这样一个故事,一个国王远行前,交给三个仆人每人一锭银子,吩咐他们:“你们去做生意,等我回来时,再来见我。”国王回来时,第一个仆人 说: “主人,你交给我们的一锭银子,我已赚了10锭。”于是国王奖励他10座城邑。第二个仆人报告说:“主人,你给我的一锭银子,我已赚了5锭。” 于 是国王例奖励了他5座城邑。第三个仆人报告说:“主人,你给我的一锭银子,我一直包在手巾里存着,我怕丢失,一直没有拿出来。”于是国王命令将第三个仆人 的一锭银子也赏给第一个仆人,并且说:“凡是少的,就连他所有的也要夺过来。凡是多的,还要给他,叫他多多益善。”这就是马太效应。 在同类网站中, 马太效应是很明显的。一个出名的社区,比一个新建的社区,更容易吸引到新客户。启示是,如果你无法把网站做大,那么你要做专。作专之后再做大就更容易。
5.手表定理
手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。
一个网站,你只需要关注你特定的用户群需求。不要在意不相干人的看法。
6.不值得定律
不值得定律:不值得做的事情,就不值得做好 不要过度seo,如果你不是想只做垃圾站。不要把时间浪费在美化再美化页面,优化再优化程序,在你网站能盈利后,这些事情可以交给技术人员完成。
7.彼得原理
劳伦斯.彼得认为:在各种组织中,由于习惯于对在某个等级上称职的人员进行晋升提拔,因而雇员总是趋向于晋升到其不称职的地位。
不要轻易改变自己网站的定位。如博客网想变门户,盛大想做娱乐,大家拭目以待吧。
8.零和游戏原理
当你看到两位对弈者时,你就可以说他们正在玩“零和游戏”。因为在大多数情况下, 总会有一个赢,一个输,如果我们把获胜计算为得1分,而输棋为-1 分,那么,这两人得分之和就是:1+(-1)=0 不要把目光一直盯在你的竞争网站上,不要花太多时间抢它的访客。我们把这些时间用来寻找互补的合作 网站,挖掘新访客。
9.华盛顿合作规律
华盛顿合作规律说的是: 一个人敷衍了事,两个人互相推诿, 三个人则永无成事之日。 如果你看准一个方向,你自己干,缺人手就招。不要轻易找同伴一起搞网站,否则你会发现,日子似乎越过越快了,事情越做越慢了。
10.邦尼人力定律
一个人一分钟可以挖一个洞,六十个人一秒种却挖不了一个洞。合作是一个问题,如何合作也是一个问题。
你需要有计划。
11.牛蛙效应
把一只牛蛙放在开水锅里,牛蛙会很快跳出来;但当你把它放在冷水里,它不会跳出来,然后慢慢加热,起初牛蛙出于懒惰,不会有什么动作,当水温高到它无 法忍受的时候,想出来,但已经没有了力气。 如果你是soho,注意关注你的财务。不要等到没钱了再想怎么挣,你会发现那时候挣钱更难。
12.蘑菇管理
蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。
做网站毕竟要遭遇这样的阶段,搜索引擎不理你,友情链接找不到,访客不上门。这是磨练。
13.奥卡姆剃刀定律
如无必要,勿增实体。
把网站做得简单,再简单,简单到非常实用,而不是花俏。google的首页为什么比雅虎好?
14.巴莱多定律(Paredo 也叫二八定律)
你所完成的工作里80%的成果,来自于你20%的付出;而80%的付出,只换来20%的成果。
随时衡量你所做的工作,哪些是最有效果的。
1.马蝇效应
林肯少年时和他的兄弟在肯塔基老家的一个农场里犁玉米地,林肯吆马,他兄弟扶犁,而那匹马很懒,慢慢腾腾,走走停停。可是有一段时间马走得飞快。 林 肯感到奇怪,到了地头,他发现有一只很大的马蝇叮在马身上,他就把马蝇打落了。看到马蝇被打落了,他兄弟就抱怨说:”哎呀,你为什么要打掉它,正是那家伙 使马跑起来的嘛!” 在你心满意足的时候,去寻找你的马蝇。没有firefox,不会有ie7,firefox就是微软的马蝇之一。马蝇不可怕,怕的 是会一口吃掉你的东西,像 ie当初对网景干的那样。
2.最高气温效应
每天最热总是下午2 时左右,我们总认为这个时候太阳最厉害,其实这时的太阳早已偏西,不再是供给最大热量的时候了。此时气温之所以最高,不过是源于此前的热量积累。
你今天的网站流量,是你一个星期或更长时间前所做的事带来的。
3.超限效应(溢出效应)
刺激过多、过强和作用时间过久而引起心理极不耐烦或反抗的心理现象,称之为“超限效应”。 别到别人论坛里发太多广告。别在自己网站上放太多广告。别在自己的论坛里太多地太明显地诱导话题。
4.懒蚂蚁效应
生物学家研究发现,成群的蚂蚁中,大部分蚂蚁很勤劳,寻找、搬运食物争先恐后,少数蚂蚁却东张西望不干活。当食物来源断绝或蚁窝被破坏时,那些勤快的 蚂蚁一筹莫展。“懒蚂蚁”则“挺身而出”,带领众伙伴向它早已侦察到的新的食物源转移。 不要把注意力仅仅放在一个网站上,即使这个网站现在为你带来 一切。你要给自己一些时间寻找新的可行的方向,以备万一。
5.长尾理论
ChrisAnderson认为,只要存储和流通的渠道足够大,需求不旺或销量不佳的产品共同占据的市场份额就可以和那些数量不多的热卖品所占据的市 场份额相匹敌甚至更大。 对于搜索引擎,未必你需要一个热门词排在第一位,如果有一千个冷门词排在第一位,效果不但一样,还会更稳定更长远。
6.破窗理论
栋建筑上的一块玻璃,又没有及时修好,别人就可能受到某些暗示性的纵容,去打碎更多的玻璃。 管理论坛时,如果你发现第一个垃圾贴,赶紧删掉他吧。想想:落伍现在为什么那么多××贴?现在控制比最初控制难多了。
7.“羊群效应”,又称复制原则(Copy Strategy)
一个羊群(集体)是一个很散乱的组织,平时大家在一起盲目地左冲右撞。如果一头羊发现了一片肥沃的绿草地,并在那里吃到了新鲜的青草,后来的羊群就会一哄而上,争抢那里的青草,全然不顾旁边虎视眈眈的狼,或者看不到其它地方还有更好的青草。
不要轻易跟风,保持自己思考的能力。
8.墨菲定律
如果坏事情有可能发生,不管这种可能性多么小,它总会发生,并引起最大可能的损失。
除非垃圾站,否则不要作弊,对搜索引擎不要,对广告也不要。
9.光环效应
人们对人的某种品质或特点有清晰的知觉,印象比较深刻、突出, 这种强烈的知觉, 就像月晕形式的光环一样,向周围弥漫、扩散,掩盖了对这个人的其他品质或特点的认识。
不要轻易崇拜一个人或者公司、一个概念、一种做法。
10.蝴蝶效应
一只亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,两周后,可能在美国德克萨斯州引起一场龙卷风。
不管你做什么,网站或者其他,你都应该关注新闻。机遇或者灾难可能就在那。
11.阿尔巴德定理
一个企业经营成功与否,全靠对顾客的要求了解到什么程度。 我赞同别人的点评:看到了别人的需要,你就成功了一半;满足了别人的需求,你就成功了全部。
尤其是做网站。
12.史密斯原则
如果你不能战胜他们,你就加入到他们之中去。
不要试图做孤胆英雄。如果潮流挡不住,至少,你要去思考为什么。
org.hibernate.exception.JDBCConnectionException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:72)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:307)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
at org.hibernate.loader.Loader.doQuery(Loader.java:661)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:223)
at org.hibernate.loader.Loader.doList(Loader.java:2147)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2026)
at org.hibernate.loader.Loader.list(Loader.java:2021)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:369)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:298)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:137)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1014)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
Caused by: java.sql.SQLException: Network error IOException: Connection refused: connect
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:372)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:178)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:304)
... 40 more
这是我刚刚重做的系统,配了java的环境,在tomcat下启动一个项目的错误提示,找了半天sql连接字符串中的密码 sa之类的错误,无果,后来想到是不是sqlserver没装sp3的问题,立马从网上下了sp3装,再试,成了,哈哈,这种拒绝连接的错误,想来也不是密码不对,记得以前见过密码不对的情况,会提示sa密码不正确,令我纳闷的是我的另一个机子是2000系统好像也没有装过sp3,也能用啊。
复习一下java虚拟机配环境变量,设两个,一个path=java目录的bin文件夹,另一个classPath=java目录的lib文件夹,这次在装eclipse的时候打开报找不到虚拟机的错,配了环境变量就好了。
哈哈,装了一晚上的机,学了复习了不少东西。明天干活,哈哈,睡觉。
好久 没上来写了 ,课上完了 ,忙着找工作
这些日子 从年前到现在 一直在 忙那个邮票系统,学了不少东西,现在终于看到曙光了,呵呵,发现自己 整理业务逻辑思路的能力不够,不会抓住重点,看来这还是讲求一套方法的,那个有经验的家伙很容易的就抓住了问题的重点,提的问题都是在点子上了,果然是高手,呵呵 。
写代码是很有意思的,很有技巧的,有的设计是很妙不可言的 ,哈哈 好像用词不当,期间又很多知识 感觉写下来的,可能是过于急于进度。
希望快点找个工作挣钱,呵呵快顶不住了
什么是J2EE、J2SE、J2ME
随着Internet网络的迅速发展,基于互联网的企业应用要求软 件平台具有开放性、分布性和平台无关性。于是就相继出现了RPC/COM/CORBA等技术,但这些技术在实际应用中存在着许多不足和局限。它们的特定协 议难以通过防火墙,因而不适于Web上的应用开发。为了进一步开发基于Web的应用,出现了Sun公司的Sun ONE(Open Net Environment 开发网络环境)和Microsoft公司的.net等Web 服务技术体系。
Sun ONE体系结构以Java语言为核心,包括J2SE/J2EE/J2ME和一系列的标准、技术及协议。它包括Sun独有的iPlanet软件系列,其中有 在市场上受欢迎的LDAP目录服务器软件,以及Forte for Java――便于在任何环境下书写Java 语言的软件工具。我们很容易就能从网上免费获得和使用包括Java 集成开发环境、Java数据库和中间件(Application Server)服务器等产品,以及它们的源代码。Sun ONE更接近或能满足互联网在智能化Web服务方面对分布性、开发性和平台无关性的要求。
随 着Java技术的不断发展,它根据市场进一步细分为:针对企业网应用的J2EE(Java 2 EntERPrise Edition)、针对普通PC应用的J2SE(Java 2 Standard Edition)和针对嵌入式设备及消费类电器的J2ME(Java 2 Micro Edition)三个版本。本文就Sun ONE的Java核心应用――J2SE/J2EE/J2ME作一些介绍。
J2EE技术应用
J2EE是Sun公司推出的一种全新概念的模型,比传统的互联网应用程序模型更有优势。
J2EE模型
J2EE的应用编程模型(J2EE Blueprints)提供了一种用于实施基于J2EE多层应用的文档和实例套件的体系模型,简化了这项复杂的工作。它被开发人员用作设计和优化组件,以便开发人员从策略上对开发工作进行分工。
J2EE应用编程模型要求开发者将自己的工作分成两类:商业逻辑和表示逻辑,其余则由系统资源自动处理,不必为中间层管道进行编码。这样,开发人员就能将更多的时间花在商业逻辑和表示逻辑上。对重视缩短项目周期的公司来说,这种转变深受欢迎。
J2EE平台
J2EE 平台是运行J2EE应用的标准环境,由J2EE部署规范(一套所有J2EE平台产品都必须支持的标准)、IETF标准集和CORBA标准组成。最新的 J2EE平台还添加了JavaBean组件模型。开发人员可以利用JavaBean组件模型来自定义Java类实例,并可通过已定义的事件访问Java 类。
J2EE支持EJB,因此开发人员可以执行多用户交易功能。当在J2EE服务器上运行时,Enterprise JavaBeans将应用逻辑分成可再利用和可扩展的代码段。Enterprise JavaBeans并不是新特征,但是通过定义标准客户端和服务API,J2EE增强了它的能力和可移植性。
EJB在服务器的一个容器内运行,提供所有典型的中间层服务,如事务管理、安全、远程客户连接、生存周期管理和数据库连接缓冲。为了让事务系统在存在EJB容器的情况下运行,开发人员只需在部署描述文件中定义Beans的事务属性即可。
J2EE通过定义一组标准的结构来实现它的优势,例如:
1.J2EE Application Programming Model,是一种用于开发多层次、瘦型客户用户程序的标准设计模型;
2. J2EE Platform,是一个标准的平台,用来整合J2EE的应用程序,并指定一系列的接口和方法;
3. J2EE Compatibility Test Suite,是一套兼容测试组件,用来检测产品是否同J2EE平台兼容;
4.J2EE Reference Implementation,用来示范J2EE的能力。
J2EE服务器
Sun 的J2EE服务器通过Java 命名和目录接口(JNDI)、认证、HTTP及与Enterprise JavaBeans兼容的能力,提供命名和目录服务。JNDI是Java平台的一种标准扩展版,向企业内的命名和目录服务提供具有Java功能的,带有统 一接口的应用,包括LDAP。
J2EE服务器还利用了Java Servlet技术。Java Servlet可以看作是运行在服务器上的一个小程序,它向开发人员提供以组件为基础创建基于Web应用的、独立于平台的方法。它不像利用CGI那样具有 性能局限。Java Servlet是一种扩展Web服务器功能的简单技巧。由于它是用Java编写的,因而能够访问整个Java API库,也包括用于访问企业数据库的JDBC API。
JSP是Java Servlet的一种扩展。Java Servlet提供开发和显示来自服务器的交互式Web页。如今JSP又有了进一步的改进,它使得创建和支持静态模板和动态内容相结合的HTML和XML页面更加容易。
安全性
J2EE 平台定义了一种标准的公开存取控制规则,当程序在企业平台上开发时就已被程序师定义和解释了。J2EE也需要提供一个标准的注册机制,以便应用程序不会将 这些注册机制和逻辑相混合,从而使相同的工作执行于大量的不同环境中时并不需要改变源代码。例如:J2EE应用程序开发人员可以指定几个安全级别,当用户 访问数据时,他们可写出代码来检查当前用户权限的级别。在开发阶段,开发人员赋予多组用户适当的安全级,使应用程序在执行限制操作之前能够容易的判断限制 级。
J2EE 平台是Java技术企业级应用的最佳平台,它可以让程序员迅速、快捷地开发和分布企业级应应用程序。以下便是它的相关技术:
1.Enterprise JavaBeans Architecture,企业级JavaBeans 定义了一个应用程序接口。它可以使程序员迅速开发、发布和管理跨平台的、基于组件的企业级应用程序。
2.JavaServer Pages,JSP 技术提供了一种简单、快速的方法来创建动态网页。通过它,可以快速地开发基于Web的应用程序,并且这些应用程序都是与平台无关的。因为JSP与ASP很相似,所以熟悉ASP的人学习它就很容易了。
3.Java Servlet,提供了应用程序接口。通过它可以简单快速地开发并扩展服务器功能。就发展趋势来看,它将来有可能取代CGI。
4.J2EE Connector,提供了一种标准结构来联接不同的企业信息平台。
5.Java Naming and Directory Interface(JNDI),在Java 平台与商业信息之间,JNDI提供了统一、无缝的标准化连接。通过使用JNDI,程序员可以在企业多命名与目录服务之间传送Java 应用程序。
6.Java Interface Definition Language(JIDL),通过使用CORBA,可以提供协同工作的能力。JIDL包括一个IDL-to-Java 编译器和支持IIOP(Internet Inter-Orb Protocol)的ORB。
7.JDBC,几乎是为所有的数据库提供了统一的接口,同时可以创建高级工具和接口。
8.Java Message Service(JMS),它几乎规范了所有企业级消息服务,如可靠查询、发布消息、订阅杂志等各种各样的PUSS/PULL技术的应用,并且为它们提供了一个标准接口。
9.Java Transaction API(JTA),为分布式系统中可处理的应用程序规定了一个高级的管理规范。
10.JavaMail,JavaMail应用程序接口提供了一整套模拟邮件系统的抽象类。通过JavaMail,可以创建邮件或消息应用程序。
11.RMI-IIOP,使用它就可以只用Java 技术和Java RMI接口开发客户机与服务器的远程接口。
J2EE 使用固定的文件格式捆绑某个模块:用.ear文件捆绑J2EE应用程序;用.jar捆绑Enterprise Bean。例如,一个.ear文件包含一个.xml文件作为其分布描述,还包含一个或多个.jar和.war文件;一个.jar文件除了包含它的分布描述 外,还包含了作为Enterprise bean的.class文件。
J2EE应用程序的开发阶段分为四步:1.Enterprise Bean创建;2.Web Component创建;3.J2EE应用程序装配;4.J2EE应用程序分布。以下是J2EE兼容产品部分列表:
BEA WebLogic Server 6.0、Borland App Server、HP Bluestone Total-e-Server、IBM WebSphere Application Server、IONA iPortal Application Server、iPlanet Application Server、Macromedia JRun Server、Oracle 9i Application Server、SilverStrean Application Server、Sybase EAServer、TogetherSoft ControlCenter、Java 2 SDK Enterprise Edition。
J2ME技术的应用
J2ME (Java 2 Platform Micro Edition)是为无线电子市场所设计的,包括JVM规范和API规范。其API规范是基于J2SE(Java 2 Standard Editon)的。J2ME 定义了一套合适的类库和虚拟机技术。这些技术可以使用户、服务提供商和设备制造商通过物理(有线)连接或无线连接,按照需要随时使用丰富的应用程序。
J2ME 又被称为Java 2 微型版,被使用在各种各样的消费电子产品上,例如智能卡、手机、PDA、电视机顶盒等方面。当然了,J2ME也提供了Java语言一贯的特性,那就是跨平 台和安全网络传输。它使用了一系列更小的包,而且Javax.microedition.io 为J2SE包的子集。J2ME可以升级到J2SE和J2EE。
在J2ME出现之前,我们更多接触到的是Java卡(Java Card)、嵌入式Java(Embedded Java)和实时Java(Real Time Java)等。其中Java卡是针对SIM卡、智能卡等设备而定制的最小Java子集,比J2ME还要小,移植性也不强。嵌入式Java则针对特殊用户自 行配置Java类库和VM(Virtual Machine,虚拟机)。它对资源需求极小,可运行在无图形用户接口和网络的设备上,可以添加用户专用的API,但是它就无法移植。实时Java是由 IBM领导的实时定制Java专家组负责实施的,现在还在不断完善中。不过,从严格意义上来说,它们都不是真正的J2ME。
像其它版本一样,J2ME具有很多Java技术特性,主要有:
1.可以在各种支持Java的设备上运行;
2.代码短小;
3.充分利用Java语言的优势;
4.安全性好;
5.用J2ME实现的应用可以方便地升级到J2SE、J2EE。
J2ME的配置和框架
为了支持用户和嵌入式市场提出的灵活性和可定制性要求,J2ME被设计得更加模块化和可缩放化。J2ME在设备原有的操作系统上建造了3层软件来实现这种要求:
1.JVM层,这层基于宿主操作系统,按照某一种J2ME的配置,实现了JVM。
2.配置层,这层对于用户可见度要低一些,但对框架层非常重要。它针对“水平”市场的需求,定义了Java虚拟机的最小功能集和Java类库的最小集合。在某种意义上,配置层定义了开发者在所有设备上都可以使用Java特性和类库的“最小公分母”。
3. 框架层,这层对于用户和应用程序提供者来说是最常见的。它针对“垂直”市场的需求,定义了Java虚拟机的最小功能集和Java类库的最小集合。其框架是 基于特定的配置层实现的。只要设备支持相同的框架层,针对特定框架层开发的应用程序就可以移植到其它设备上。一个设备可以支持多个框架层。
在J2ME 设备中,JVM与配置层紧密相连,它们体现了每一类设备的基本功能。框架层针对不同的设备,在配置层的基础上规定了附加的API。为了满足不断更新的应用 程序,框架层可以扩充新的Java库类。在不远的将来,随着新设备的不断出现,J2ME技术将提供范围广泛的框架层、配置层和VM。JCP(Java Community Process)可以为客户和开发商提供规范。根据JCP的定义,J2ME目前的一种配置层是“面向连接的设备配置”层(Connected Device Configuration),它采用典型的Java虚拟机技术。这种全功能的VM包含了基于台式机系统上的虚拟机的所有功能,适用于拥有至少几兆字节内 存的设备。对于无线设备和其它内存不足的设备,J2ME采用“面向连接的受限设备配置”(CLDC)技术。
KVM是J2ME的核心特 征。它是一个可移植性非常高的JVM,专用于内存小、资源有限、能上网的设备,例如蜂窝电话、寻呼机和个人组织器等。这些器件一般都含有16或32位的处 理器,最低128KB内存。KVM能够被灵活应用到各种行业、各种类型的设备上,并能够适应这些设备的多样化所带来的问题,比如处理器的耗电量、内存的大 小、设备和应用程序的特殊功能等问题。
CLDC技术
CLDC定义了目标Java平台,该平台基于小型的、资源较少的、内存仅有160~512K的设备。CLDC是由KVM和用在蜂窝电话、数字产品、双向寻呼机、个人组织器和家用电器等核心库类及接口组成。使用CLDC技术有很多优点:
1.跨平台,这点保留了Java一贯的特点,应用程序不会随着平台差异而产生变化。
2.动态性,这点也是很吸引人的,可以根据需要下载自己喜欢的应用程序和服务,并且可以和其它的CLDC设备通信。
3.安全性,Java 本身的特点造就了这一特性。
与 J2SE相比,CLDC缺少下列所说的特征:
1.AWT(抽象窗口开发包),Swing或其它图形库;
2.用户定义类装载器;
3.类实例的最终化;
4.弱的引用;
5.RMI;
6.Reflection(映射)。
CLDC 有四个包:java.lang、java.util、java.io和javax.microedition。除了javax.microedition 包以外,其它的几个包都是J2SE包的核心子集。CLDC采用这些J2SE类库,但是把其中一些在微型设备中用不到类、属性和方法去掉了。
J2ME定义两个配置:Connected Device Configuration(连接设备配置,CDC)和限制性更强的Connected Limited Device Configuration(有限连接设备配置,CLDC)。
J2SE技术的应用
Java 2标准版是一种开发和部署平台,提供了编写桌面、工作站应用程序所有必需的功能。J2SE软件是快速开发、部署关键任务和企业应用程序的首选解决方案。 J2SE 1.4版本是基于Java跨平台技术和强有力的安全模块而开发的,其最新的特征和功能极大地提高了Java语言的伸缩性、灵活性、适用性,以及可靠性。
J2SE 1.4 特点:
1.良好的计算性能和缩放能力。
J2SE 1.4版是一个快速开发和配置跨平台的企业级应用与服务的综合性平台。它提升了Java计算的性能与缩放能力,代表了Java技术的大跨步进展。有了 J2SE 1.4版,企业就可以通过更简易的步骤、花费更少的时间,采用Java技术开发与配置要求更高的应用了。J2SE 1.4版在Java客户机应用方面得到了重大性能提升。基于Swing的Java小程序和应用程序在图形用户界面(GUI)的响应速度上也大有提高。
2.跨平台。
J2SE 1.4版是一个具有综合性能的平台,能使一个完整的、可缩放的高性能应用配置在任何种类的平台上。
3.支持Web服务。
J2SE 1.4版与以前各J2SE版全面兼容。J2SE 1.4版对SSL、LDAP和CORBA等业界标准技术也给予支持,因此保证了在不同平台、系统和环境间的互操作能力。J2SE 1.4版支持XML技术和一整套安全服务,因此为基于各类标准的可互操作应用与服务的创建奠定了重要基础。有了J2SE 1.4版与Java Web Services Developer Pack的结合,开发商就能创建、测试和配置Web服务了。
4.完整性。J2SE 1.4版还是一个完整的开发环境。开发商可基于这一环境创建功能丰富的交互式应用。这些应用可以配置在任何平台上。J2SE 1.4具有新的GUI控制功能、快速的Java 2DT图形功能、支持国际化与本地化扩展和新的配置选项,并对Windows XP提供扩展支持。
总之,J2SE 1.4版是多种不同风格软件的开发基础,包括客户端Java小程序和应用程序,以及独立的服务器应用程序等。J2SE 1.4版还是J2ME的基础,是J2EE执行程序的推动力。
Java 之所以能够发展得很快,是因为互联网的发展非常快。Java可以和浏览器结合在一起,因而很自然地在桌面系统得到广泛应用。从计算的结构来看,Java主 要分三大类:第一是服务器端,这里就有了J2EE企业版;第二是桌面PC,这一类用的是J2SE标准版;第三就是掌上电脑、移动设备,用的都是J2ME。 但是,大部分非企业级软件还是在J2SE上开发的比较多。首先,这是因为很多的应用软件都是在J2SE上开发的;其次,J2SE是和J2EE兼容的,企业 版是在标准版上的扩充,在J2SE的版本上开发的软件,拿到企业的平台上是一样可以运行的;再次,一般开发还是在J2SE的环境上,只是说J2ME提供微 型版的一个环境。在J2SE上虚拟出一个环境,开发出来的应用软件是可以拿到微型版上运行的。
public class Test
{
public void changeApple(Apple a)
{
Apple a2 = new Apple();
a2.color = "red";
a = a2;
}
public void changeApple2(Apple a)
{
a.color = "red";
}
public static void main(String[] args)
{
Apple a = new Apple();
a.color="blue";
new Test().changeApple(a);
System.out.println(a.color);
new Test().changeApple2(a);
System.out.println(a.color);
}
}
class Apple
{
public String color;
}
//输出结果:blue
red
我这只猪要在猪年也是第一次要独自一人过春节了,不知道为什么,没有别人那么深的恋家情结,有人问我,你不想家么,你不想你妈么?我不知道说什么,呵呵!
刚刚看了高中时就喜欢得一个电台主持人--清音的博客上的类似年终总结的文字,我想,我也应该总结一下吧,索性打开猪窝,呵呵,发现没有人看,浏览人数还是那些,哈哈。
今年三十儿,除夕,中国人来说最重要的节日,刚才去超市,那个人叫多阿,原以为三十儿了,应该大多数人年货都该买个差不多了吧,只等在家守岁了,没想到还是那么火爆,看来城市人还是和我们乡下不一样啊。
06年,我大学毕业了。毕业了,不再是学生了,不用再抄作业了,坐火车不再打折了,离开了那些同居四年的兄弟们,自此各自各处漂泊~~
06年,凭我自己的能力找了自己第一份工作。欣喜,激动,开始踏实工作,感谢部门经理对我的关照,让我从另一个起跑线起跑。
06年,我也挣钱了,哈哈,花自己挣的钱的感觉,舒服~~,老爸说为什么你总在花你爸的钱总像隔一层,呵呵,长大了,想自食其力了。
06年,害得她死去活来,痛。
06年,刻下伤疤的一年,挣扎。
06年,掉进河里,想逆流而上,并开始行动。
07年,应该会有一次暴风骤雨,一定要战胜。
找回自己
大年二十五了,呵呵,刚才和一朋友在QQ上聊,过年没什么感觉了,和平时没什么两样,倒是给自己找了个邋遢的冠冕堂皇的理由。
2006过去了,过去一段时间了,黑色的2006,再见。
几个月的培训日子基本上结束了,这些天一直在住的地方猫着,呵呵,就是,一天不下楼不出屋,用某人的话说我没什么爱好,除了正事什么也不做,呵呵,这话我爱听,我做的又有哪些是正事呢。培训了几个月,感觉,没什么感觉,呵呵,对找工作还是有心虚,哈哈,也不能因为这样培一辈子训不是,哈哈,还得向前。还差得远。这几个月写了这么多的日志,算是一个不小的收获吧,
2007会是什么样子,网上说2007夏天的温度将破纪录,呵呵,看来得有心理准备了。
中间还有一个过年,还有几天,感觉像是一个门槛,得怎样迈过去阿/。
网络真是好东西,遇到什么问题,都可以问它哈哈,这不,刚刚解决了几个小问题,使我的程序顺利通过了,哈哈
我想这么写
<html:hidden property="bookId" value="<bean:write name="bookForm" property="id">"></html:hidden>
这么写就不行,报equal symbol expected的错误,用Google翻译过来是“预期符号相同”
在网上查
可以这么写
<html:hidden property="bookId" value="${bookForm.id}"></html:hidden>
但必须jsp2.0以上,servlet2.4以上
在web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="2.4">
还有个小问题就是在web.xml中如果配置<taglib></taglib>标签,就会有个红叉,说什么
cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib'. One of '{"http://java.sun.com/xml/ns/j2ee":description, "http://java.sun.com/xml/ns/j2ee":display-name, "http://java.sun.com/xml/ns/j2ee":icon, "http://java.sun.com/xml/ns/j2ee":distributable, "http://java.sun.com/xml/ns/j2ee":context-param, "http://java.sun.com/xml/ns/j2ee":filter, "http://java.sun.com/xml/ns/j2ee":filter-mapping, "http://java.sun.com/xml/ns/j2ee":listener, "http://java.sun.com/xml/ns/j2ee":servlet, "http://java.sun.com/xml/ns/j2ee":servlet-mapping, "http://java.sun.com/xml/ns/j2ee":session-config, "http://java.sun.com/xml/ns/j2ee":mime-mapping, "http://java.sun.com/xml/ns/j2ee":welcome-file-list, "http://java.sun.com/xml/ns/j2ee":error-page, "http://java.sun.com/xml/ns/j2ee":jsp-config, "http://java.sun.com/xml/ns/j2ee":security-constraint, "http://java.sun.com/xml/ns/j2ee":login-config, "http://java.sun.com/xml/ns/j2ee":security-role, "http://java.sun.com/xml/ns/j2ee":env-entry, "http://java.sun.com/xml/ns/j2ee":ejb-ref, "http://java.sun.com/xml/ns/j2ee":ejb-local-ref, "http://java.sun.com/xml/ns/j2ee":service-ref, "http://java.sun.com/xml/ns/j2ee":resource-ref, "http://java.sun.com/xml/ns/j2ee":resource-env-ref, "http://java.sun.com/xml/ns/j2ee":message-destination-ref, "http://java.sun.com/xml/ns/j2ee":message-destination, "http://java.sun.com/xml/ns/j2ee":locale-encoding-mapping-list}' is expected.
虽然对程序运行没什么障碍,但对我这个完美主义总是心里不舒服,在网上查
http://blog.csdn.net/heroying/archive/2007/02/03/1501873.aspx
给出了解释
把<taglib></taglib>放在<jsp-config></jsp-config>里面就行了,哈哈,不错不错。
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,mysql, MS SQL Server, sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo (高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。
seqhilo(使用序列的高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned(程序设置)
让应用程序在save()之前为对象分配一个标示符。
foreign(外部引用)
使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。
有一个星期没有写日志了,这些日子过得有些狼狈,哈哈,差点睡大街去。因为临时的变故不得不去上课去找房子租,光电话费就花了近百,在网上搜索信息,尽是些代理,说心里话,感觉他们的运作模式还是比中介有优越的,但还是对他们天花乱坠的说法不放心,在网上查了些代理公司的资料,也有很多网友骂他们说话不算数的。最后决定不着代理,哈哈,通过连夜搬家,终于一月的最后一晚,有地方睡了,昨晚收拾到一点多。
同时,这几天也没写代码,光东奔西看房了,因为鞋有点不合脚,左脚肿了,今天来上课,迟到了一个小时,也没做什么,我做的那个BookShop跟老师做的那个思路不能衔接,不能跟着他往下走,按安排,明天最后一天了,狗日的,要放一个月假,不负责任的做法嘛。
住的危机暂时解决了,该恢复正常学习了。