#
早起先把昨天修改的程序发了过去,运行检查,没啥问题。小强说他们的电脑有病毒,总是有问题,也没说啥问题,问我是否要重新装系统,最好不要吧,那样的话,
SQL Server
和
.NET Framework
都要重新装,估计他们装不好,岂不是我又要到长春一趟,我的天,命苦呀。他说找人给看看,最好还是杀毒吧。我还是那句老话,“有病治病,用不着打死,重生吧!”此时听到敲门声,说是电话局的,说什么推出新政策,可以省话费什么的,存属扯蛋,这种骗人的把戏电视上都演过多少次了,还有人使用。当我白痴呀。我没理,那人便敲邻居的门,谁也不搭理他,未果,就离开了。现在这世道,可不能随便开门,坏人太多啦!也经常接到这样的电话,说你中
50
万,先汇点手续费什么的。奶奶个熊的,就是骗呀。我妈最逗,也不废话,直接回应:“中了,我不要了,都给你了。”电话一撂,拉到。只要不贪心,永远不会上当的。
昨天去三好街了,所以正常的周二下午游泳,推迟到了今天。天气凉了,泳池人少多了。我喜欢,这样可以围着整个泳池游,比较爽。今天状态不错,
2
小节,没节
6
圈,总长
1200
米只多不少,而且还游了好几个来回的
22
米往返。估计今天的总长度会在
2000
米上下。每周两次的游泳,对身体帮助很大,而且放松紧张的身体和心灵。我比较相信水里有种能量是可以被人体吸收的,所以每次过后倍感舒爽。回来的路上看到有家福利彩票的投注站,进去瞄了几眼,打算玩玩,可是不懂规则,上网查查。打算自己做个统计的程序来投注,也就是随机数字啦。就当熟练一下随机数方法了。话不多说,现在就开始动手。
好友小楠要买块硬盘,叫我帮忙看看,我也是了解不多呀。到了电子市场,就开始狂晕了,先是太长时间不来,哪里都不认识,问了几家的价格,心也没底怕被蒙,所以还是打电话找朋友帮忙吧。那可真是笑话百出了。先是问要什么牌子的,小楠说西捷酷鱼的,要
200GB
的,我一紧张,说成了
20GB
,哥们顿时语塞,又问一遍,你要多大的?才回过神,哈
200GB
。问我要啥口的。说是串口还是并口。我汗,我就知道有
IDE
和
SCSI
之分,每听说还有啥口的。没整明白,然后问啥主板的,小楠更逗,她自己也不知道,朋友说,你干脆拿来我给你看看,连着直接买个安上就得了。我和小楠都笑了,是苦笑。因为小楠周末就要回澳大利亚,她那电脑在澳大利亚呢,咋拿来呀。又问,那
CPU
是多少呀。得支持硬盘容量呀!对哦。我咋把这个忘了。小楠继续语出惊人,还是不知道,得没辙了。你啥时候买的。
2000
年,这个倒是知道,那年代
40G
硬盘有没有我都不知道,还要买
200G
的安上,那不是扯呢吗。朋友说,实在不行买个
80G
的吧,然后刷一下
BIOS
也可以支持,她就更蒙了,连自己电脑啥配置的人都不知道,你居然要让她自己刷
BIOS
,这可能吗?最后,她说出了一句:我想买个硬盘的拖盒来用,这样不就可以匹配了。我马上问:你是要做移动硬盘呀。。。她说不是,就是把硬盘放到机箱外面用,用
USB
连接不是可以。我心想,那你电脑也得有自己的硬盘呀。她居然认为。电脑本身可以不用,用外接
USB
硬盘也可以。我的天,这都咋想的。我都解释不清了。最后达成一致,啥也买了,回澳洲再买个二手的用着吧。她原来那个就剩显示器和机箱(没有硬盘)。我看留着意义也不大,我说卖废品算了,她说
,
那里根本就没有收的。我说那就卖废铁,她说,只有汽车才算是卖废铁。我的妈呀。那就改成烧烤用的炉子算了。回家路上,我还郁闷中,我一学计算机专业的,这硬件我是太不了解了。不过还行,至少比小楠同志了解的多呀。
下午回到家中,本来想看看
Struts
中几个标签的功能。结果。电话来了。我给一家公司做的程序,他们运行说有问题,叫我给看看。上网把数据发了过来,我一看,数据录入的有够乱的。好半天屡出头绪。晚饭前搞定,明天给发过去。我一想,他们输入的乱,说明我设计的还是不够人性化,所以,又改动了一些地方。哎。毕竟是受人家钱的。工作就要负责嘛!
Hibernate
英文的直意是冬眠的意思。
Hibernate
是一个面向
Java
环境的对象
/
关系数据映射工具,注意,这是一种技术工具。
ORM
(
object relational mapping
)
这个术语表示一种技术,用来把对象模型表示的对象映射到基于
SQL
的关系模型数据结构中去。
以上的这些概念性的东西,然我感觉和
.NET Framework 2.0
中的强类型数据集的作用差不多,但听研究过的人说,要比
Microsoft
的那个好得多,
Microsoft
的强类型数据集我用过,感觉爽,既然有说
Hibernate
更好,那已经更是过瘾,我心里痒痒的呀。继续。。。
书中有这样一句“对于以数据为中心的程序来说,他们往往只在数据库中使用存储过程来实现商业逻辑,
Hibernate
可能不是最好的解决方案。”这个是一定啦,
Hibernate
是桥梁,又不是万金油,当然是在数据库中直接用存储过程处理商业逻辑是最好的啦。我做过,直接在存储过程中搞定一切东西,传一个参数过去,然后所有的运算都在
SQL Server 2000
的存储过程中完成,那叫一个爽,比把数据读到程序里,然后用
Java
处理,再把数据传回去要快得多,但是在
SQL Server 2000
里直接用存储过程来完成这样的工作,难度还是不小的,调试就是最大的难点,反正我是没整明白有啥办法可以调试的,我就用最原始、最保靠,据说是也是有效的调试方法
print
来完成。哈哈。够晕的吧!继续看。。。
现在看到了一个“持久化实体类”这个类是符合
JavaBean
的编写要求。并且要给它一个唯一的标识符,这是为了我们使用
Hibernate
提供的所有特性。大多数程序,特别是
web
程序,都需要通过标识符来区分对象。但,通常我们不会直接操作对象的标识符,所以他的
setter
方法的访问级别是
private
。
Hibernate
需要知道怎样去加载(
load
)和存储(
store
)持久化类的对象,映射文件,它就是告诉
Hibernate
,应该访问数据库里面的哪个表,已经应该使用表里面哪些字段。
Hibernate
不会从
web
加载
DTD
文件,但它会首先在应用程序的
classpath
中查找。
DTD
文件包含在
hibernate3.jar
里,同时在
Hibernate
发布包的
src/
目录下。
映射文件的长相:
Event.hbm.xml
<hibernate-mapping>
<classname="events.Event" table="Events">
<idname="id" column="eventID">
<generatorclass="native"/>
</id>
<propertyname="date" type="timestamp" column="eventDate"/>
<propertyname="title" column="eventTitle"/>
</class>
</hibernate-mapping>
说明:
class
表示持久化类;
id
表示唯一标识;
property
表示类的属性字段;
name
是持久化类名;
table
是数据表名;
column
是数据字段名;
generator
是唯一标识的生成方式;
type
是映射的数据类型。
Hibernate
配置文件的长相:
hibernate.cfg.xml
<!-- by MyEclipse Hibernate tool integration. -->
<hibernate-configuration>
<session-factory>
<!-- properties -->
<propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<propertyname="connection.url">jdbc:oracle:thin:@localhost:1521:test</property>
<propertyname="connection.username">system</property>
<propertyname="connection.password">manager</property>
<propertyname="dialect">net.sf.hibernate.dialect.OracleDialect</property>
<!-- mapping files -->
<mappingresource="events/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
说明:
Session-factory
:特定数据库全局工厂
connection.driver_class
:驱动类
connection.url
:连接路径
connection.username
:用户名
connection.password
:用户密码
mapping resource
:持久化类加入映射文件
用
ant
创建
build.xml
我理解他就是管理文件位置的,就是拷贝,为编译运行做准备。
SessionFactory
是一个线程安全的全局对象,只需要被实例化一次,一个
Session
代表一个单线程的单元操作。
这时又来了一个辅助类
HibernateUtil
,负责启动
Hibernate
和更好的操作
SessionFactory
。
最后配置一个日志系统,
Log4j
或
JDK 1.4
都可以选择。
看到了一种编程模型:线程绑定(
thread-bound
)
Session
在第一次被使用,或第一次调用
getCurrentSession()
的时候,其生命周期就开始了,然后它被
Hibernate
绑定到当前线程。当事务运行结束的时候,不管是提交、回滚,
Hibernate
都会把
Session
从当前线程剥离,并且关闭它。
提交页面:
<
html:link
href
=
"/StrutsTagDemo/parameter_2.jsp?coolID=1127"
>
不使用表单提交数据
</
html:link
>
接收页面:
<
bean:parameter
id
=
"coolID"
name
=
"coolID"
/>
我接受到的
coolID
:
<
bean:write
name
=
"coolID"
/>
<
bean:header
id
=
"host"
name
=
"Host"
/>
主机地址
/
端口
:
<
bean:write
name
=
"host"
/>
<
br
>
<
bean:header
id
=
"language"
name
=
"Accept-Language"
/>
支持语言
:
<
bean:write
name
=
"language"
/>
<
br
>
<
bean:header
id
=
"agent"
name
=
"User-Agent"
/>
用户的浏览器类型
:
<
bean:write
name
=
"agent"
/>
<
br
>
<
bean:header
id
=
"accept"
name
=
"Accept"
/>
支持打开类型
:
<
bean:write
name
=
"accept"
/>
<
br
>
<
bean:header
id
=
"encoding"
name
=
"Accept-Encoding"
/>
支持编码格式
:
<
bean:write
name
=
"encoding"
/>
<
br
>
//
在
Session
中存放计数器,体现刷新效果。
int
count = 0;
Object obj = request.getSession().getAttribute(
"count"
);
if
(obj ==
null
) {
count = 1;
}
try
{
count = 1 + Integer.parseInt(obj.toString());
}
catch
(Exception e) {}
request.getSession().setAttribute(
"count"
, count);
//
设置自动刷新,一秒钟一次。
//response.setHeader("Refresh", "1");
//
设置自动跳转,一秒钟一次。我写的
url
是自己,所以和刷新一样。
response.setHeader(
"Refresh"
,
"1,URL=refresh.do"
);
读取
Cookie
集合,遍历集合找到所需的
Cookie
,如果找到保存进
Session
,否则跳转到登录页面;
所需资源:
ReadCookieAction.java-
读取
Cookie
集合,如果找到对应
Cookie
,写入
Session
;
Login.jsp-
登录用页面;
LoginSubmit.java-
记录登录信息,并写入
Session
;
LoginOk.jsp-
读取
Session
,并显示。
读
Cookie
的方法
:
Cookie[] cookies = request.getCookies();
if
(cookies !=
null
) {
for
(
int
i=0; i<cookies.
length
; i++) {
Cookie cookie = cookies[i];
if
(cookie.getName().equals(
"userInfo"
)) {
String value = cookie.getValue();
String[] info = value.split(
"_"
);
UserForm userForm =
new
UserForm();
userForm.setUserName(info[0]);
userForm.setUserPassword(info[1]);
request.getSession().setAttribute(
"userForm"
, userForm);
return
mapping.findForward(
"ok"
);
}
}
}
写
Cookie
的方法:
Cookie c =
new
Cookie(
"userInfo"
,userForm.getUserName()+
"_"
+userForm.getUserPassword());
c.setComment(
"A test cookie"
);
c.setMaxAge(120);
response.addCookie(c);
多选方框,选定值后提交,然后接收到一个数组,这是小菜,看书都知道。
可是,我想给这些多选方框动态显示的时候给个选中或未选中的状态值,我是看了好几个文字材料,写得都够晕的,看是那么回事,实际操作,根本就不灵。还好我够灵光,凭直觉,终于解决。
Action
中:
//
定义一组备选爱好
[
也可以从数据库中读取
]
ArrayList hobbyList =
new
ArrayList();
hobbyList.add(
"
游泳
"
);
hobbyList.add(
"
潜水
"
);
hobbyList.add(
"
登山
"
);
hobbyList.add(
"
跳伞
"
);
hobbyList.add(
"
徒步旅行
"
);
//
定义一组选定的爱好
[
也可以从数据库中读取
]
ArrayList hobbySelectList =
new
ArrayList();
hobbySelectList.add(
"
游泳
"
);
hobbySelectList.add(
"
登山
"
);
hobbySelectList.add(
"
徒步旅行
"
);
//
定义字符串数组,如果你的那个类的属性是数组类型。
String[] hobby =
new
String[hobbySelectList.size()];
//
把
ArrayList
转换为
String[]
hobbySelectList.toArray(hobby);
//
定义你的那个
ActionForm
PersonForm personForm =
new
PersonForm();
//
设置那个数组类型的属性
personForm.setHobby(hobby);
//
注意,你给
JSP
传递的东西哦!
//
一个是:备选数组
ArrayList
//
另一个是:
JSP
可承载的
ActionForm
,注意这个
ActionForm
要有被选定的数组属性值哦!
request.setAttribute(
"hobbyList"
, hobbyList);
request.setAttribute(
"personForm"
, personForm);
return
mapping.findForward(
"ready"
);
JSP
中:
<
logic:iterate
id
=
"hobbyName"
name
=
"hobbyList"
>
<
html:multibox
property
=
"hobby"
>
<
bean:write
name
=
"hobbyName"
/>
</
html:multibox
>
<
bean:write
name
=
"hobbyName"
/>
</
logic:iterate
>
解释一下
jsp
中的参数。
hobbyList
就是那个一组备选爱好数组;
hobbyName
就是随意定义的一个变量名,来接收
hobbyList
中的项;
hobby
就是
ActionForm
的那个数组属性名称;
看了这些,我自己都晕。。。这东西看来要自己领悟了!!!
我估计那个
html:radio
也是这么用,下次再研究。
有些存储在数据库或者某些文件的信息,可能会包含一些
html
标记的限定。例如把某句话加粗等。但是简单的使用
<bean:write name=”” />
会把那些
html
标记给安全的转换,但这不是我想要的。怎么解决,发现了
filter
这个属性。应用如下:
在
Action
中我写入这样对象:
String html_1 = "<b>Hello</b>";
String html_2 = "<b>Hello</b>";
在
Jsp
中我这样使用:
<bean:write name="html_1" filter="true"/>
<bean:write name="html_2" filter="false"/>
运行的效果:
<b>Hello</b>
Hello
作了一个PPT,还有代码的讲解。给我们的同学讲过啦。在这里提供一下下载吧!
下载请点击这里哦!