??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 普通用户可以通过pȝ览商品Q按cdQ?/span>
2. 普通用户可以通过pȝ搜烦商品Q按cd、h(hun)位、日期等Q?/span>
3. 普通用户可以通过pȝ下订单(享受市场P
4. 普通用户可以注册成为系l会(x)员(免费注册Q?/span>
5. ?x)员可以览和检索商?/span>
6. ?x)员可以下订单(享受会(x)员P
7. ?x)员可以览自己下过的订?/span>
8. ?x)员可以理自己的信息(自服务系l)
a) 修改密码
b) 修改送货地址
c) 修改联系方式
9. ?x)员可以分?/span>
1) 不同U别享受不同{的优?/span>
2) 通过购物的金额确定?/span>
10. 理员通过后台q行?x)员?/span>
1Q会(x)员浏?/span>
2Q会(x)员历史订单浏?/span>
3Q会(x)员删?/span>
4Q指定会(x)员?/span>
11. 理员通过后台q行产品分类的管?/span>
1Q浏览、添加、删除、修?/span>
12. 理员通过后台q行产品理
1Q新增?/span>
2Q品上?/span>
3Q品下?/span>
4) 产品销量浏?/span>
5Q品搜?/span>
6Q品删?/span>
7Q品修?/span>
13. 理员通过后台q行订单的管?/span>
1Q订单查?/span>
2Q修改订单状?/span>
3Q订单搜?/span>
4Q订单跟t?/span>
5Q订单提?/span>
Ricer|上商城?span style="font-family: 宋体">架构分析与设?/span>
逻辑架构
JSP + JavaBeans + Database
JSP负责表现
JavaBeans负责业务逻辑
Database负责持久保持数据
物理架构
Web服务器一?/span>
配置
Database服务器一?/span>
配置
技术解x?/span>
Web Server—Tomcat5.5
Database—MySQL5.0
Ricer|上商城?span style="font-family: 宋体">业务逻辑分析
1. ?x)员c?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 包装pȝ?x)?/span>
2Q?span style="font: 7pt 'Times New Roman'"> 与订单类有一对多的关p?/span>
2. 理员类
1Q?span style="font: 7pt 'Times New Roman'"> 包装pȝ理?/span>
3. 产品c?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 包装产品的信?/span>
2Q?span style="font: 7pt 'Times New Roman'"> 与订单是多对多的关系
4. cdc?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 包装产品的类?/span>
2Q?span style="font: 7pt 'Times New Roman'"> ?wi)状l构
3Q?span style="font: 7pt 'Times New Roman'"> 与品是一对多的关p?/span>
5. 订单c?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 包装订单的信?/span>
2Q?span style="font: 7pt 'Times New Roman'"> 与品是多对多的关系
3Q?span style="font: 7pt 'Times New Roman'"> 与会(x)员是多对已的关系
6. 购物车类
1Q?span style="font: 7pt 'Times New Roman'"> 包装购物车的信息
2Q?span style="font: 7pt 'Times New Roman'"> 与品是多对多的关系
RiKeR|上商城?span style="font-family: 宋体">业务逻辑设计
1. User
a) properties
i. id
ii. username
iii. password
iv. phone
v. addr
vi. rdate
b) methods
i. getOrders()
ii. save()
iii. change()
iv. delete
v. static search()
2. Administrator
a) properties
i. usernae
ii. password
b) methods
i. login()
3. Product
a) properties
i. id
ii. name
iii. descr
iv. normalPrice
v. memberPrice
vi. pdate
vii. category
2) methods
i. getCategory()
ii. getSalesCount()
iii. save()?/span>change()?/span>search(){?/span>
4. Category
a) properties
i. id
ii. name
iii. descr
iv. pid(parent:Category)
b) methods
i. getProductCounts()
ii. save()?/span>change(){?/span>
5. SalesOrder&SaleItem
a) properties
i. id
ii. userid
iii. addr
iv. SalesItem[]
v. odate
b) methods
i. getTotalPrice()
ii. save()?/span>change(){?/span>
iii. getSalesItems()
6. SalesOrder&SaleItem
a) properties
i. id
ii. productID
iii. unitPrice
iv. pCount
b) methods
i. getTotalPrice()
ii. save()?/span>change(){?/span>
7. ShoppingCart&CartItem
a) properties
i. userid
ii. CartItem[]
b) methods
i. getTotalPrice()
ii. save()?/span>change(){?/span>
iii. getCartItems()
8. ShoppingCart&CartItem
a) properties
i. productID
ii. unitPrice
iii. pCount
b) methods
i. getTotalPrice()
RiKeR|上商城?span style="font-family: 宋体">数据库设?/span>
RiKeR|上商城?span style="font-family: 宋体">界面设计
前台
1. 首页index.jsp
a) 昄某类商品
b) Ҏ(gu)id昄囄
c) 搜烦
d) 注册
e) d
f) 自服?/span>
2. 搜烦界面 search.jsp
3. 搜烦l构 searchresult.jsp
4. 注册
a) 注册面 register.jsp
b) 注册成功 registerok.jsp
c) 注册p| registererr.jsp
5. d
a) login.jsp
b) loginok.jsp
c) loginerr.jsp
6. 自服?/span> selfservice.jsp
a) changepassword.jsp
b) changepasswordok.jsp
c) changepassworderr.jsp
d) changeinfo.jsp
e) changeinfook.jsp
f) changeinfoerr.jsp
7. 购物
a) 购物车浏?/span> cart.jsp
b) l帐 buy.jsp
后台Q?/span>admin目录下)
1. d面 login.jsp
2. 首页 index.jsp
a) 用户理
b) 产品理
c) cd理
d) 订单理
3. 用户理
a) 昄用户 userlist.jsp
b) 删除用户 userdelete.jsp
c) 搜烦用户 usersearch.jsp
4. 产品理
a) productlist.jsp
b) productadd.jsp
c) productchange.jsp
d) productdelete.jsp
e) productSearch.jsp
5. cd理
a) categorylist.jsp
b) categoryadd.jsp
c) categorydelete.jsp
d) categorychange.jsp
6. 订单理
a) 订单览 salesorderlist.jsp
b) 订单处理 salesorderdeal.jsp
RiKeR|上商城?span style="font-family: 宋体">开发环境搭?/span>
开发工?/span>
Eclipse3.2
Web Server
Tomcat5.5
Database
MySQL
SCM
CVS
RiKeR|上商城?span style="font-family: 宋体">开?/span>
先写用户
再写分类
然后写?/span>
接下来购?/span>
最后订单处?/span>
其他功能
RiKeR|上商城?span style="font-family: 宋体">开发安?/span>
V0.1
用户—JavaBeans前台/后台
V0.2
分类—JavaBeans前台/后台
……
RiKeR|上商城?span style="font-family: 宋体">文档~纂
需求描q文?/span>
pȝ分析与设?/span>
数据库设?/span>
开发接?/span>API docs&源代码注?/span>
用户帮助Q前収ͼ
理员手册(后台Q?/span>
试文档
<input type=text size=4 name="pageNo" value=<%=pageNo%> /> q?>
<select name="pageNo" onchange="document.form1.submit()">
<%
for(int i=1; i<=totalPages; i++) {
%>
<option value=<%=i %> <%=(pageNo == i) ? "selected" : ""
%>>W?lt;%=i %>?br />
<%
}
%>
</select>
?lt;/select>
一、编E规?不管是用什么语a一定要有一个规范的写法。?
密码:<input type="password" name="password"><br>
如果你要加入 JavaScript 的验?你一定要加一?id 属?
密码:<input type="password" name="password" id="password"><br>
name 属性是在页面传递值的时候用 Qid 则是?本页面用
W二?在找面中的某个元素的时?我不你这样写
password1=document.form1.password1.value;
你写成这?
var password
password = document.getElementById('password');
得到 password 以后
if(password.value==null||password==""){
... ...
return false;
}
最?
OnSubmit="check()"
OnSubmit = ... 需要的是一?true 或?false
所以你p check() 的返回?再返回给 onsubmit
onsubmit="return check()"
==================>
1.?wi)状l构的存储与展现-递归方式
2.JavaScript css html jspl合q用
3.分页
4.前台、后?br />
5.Session初步
6.功能完成与健壮之间的区别
首先我们l出一个看似无兛_非常重要的概念:(x)属性集的闭?/span>?br />
?#945;Z属性集。我们称在函C赖集F下由α函数定的所有属性的集合为F?#945;的闭包,Cؓ(f)α+ ?br />
下面l出一个计?#945;+的算法,该算法的输入是函C赖集F和属性集αQ输出存储在变量result中?br />
法一Q?br />
result:=α;
while(result发生变化)do
for each 函数依赖β→γ in F do
begin
if β∈result then result:=result∪γ;
end
属性集闭包的计有以下两个常用用途:(x)
·判断α是否码,通过计算α+Q?#945;在F下的闭包Q,?#945;+ 是否包含了R中的所有属性。若是,?#945;为R的超码?br />
·通过验是?#946;∈α+Q来验证函数依赖是否成立。也是_(d)用属性闭包计?#945;+Q看它是否包?#946;?/p>
Q请原谅我用∈W号来表CZ个集合之间的包含关系Q那个表C包含的W号我找不到Q大家知道是什么意思就行了。)
看一个例子吧Q?005q?1月系分上?7题:(x)
?l定关系R(A1QA2QA3QA4)上的函数依赖集F={A1→A2QA3→A2QA2→A3QA2→A4}QR的候选关键字为________?br /> Q?7QA. A1 B. A1A3 C. A1A3A4 D. A1A2A3
首先我们按照上面的算法计A1+ ?br />
result=A1Q?br />
׃A1→A2QA1∈resultQ所以result=result∪A2=A1A2
׃A2→A3QA2∈resultQ所以result=result∪A3=A1A2A3
׃A2→A4QA2∈resultQ所以result=result∪A3=A1A2A3A4
׃A3→A2QA3∈resultQ所以result=result∪A2=A1A2A3A4
通过计算我们看到QA1+ =result={A1A2A3A4}Q所以A1是R的超码,理所当然是R的候选关键字。此题选A ?/p>
●设关系模式R<U, F>Q其中U=?jng)A, B, C, D, E},FQ{A→BCQC→DQBC→EQE→A},则分?#961;={R1QABCEQ,R2QCDQ}满 Q?3Q??br />
Q?3Q?AQ具有无损连接性、保持函C?br />
BQ不h无损q接性、保持函C?br />
CQ具有无损连接性、不保持函数依赖
DQ不h无损q接性、不保持函数依赖
再做保持依赖的判断?br /> A→BCQBC→EQ?E→A都在R1上成立(也就是说每一个函C赖左右两边的属性都在R1中)QC→D在R2上成立,因此l分解是保持依赖的?/p>
选A?/p>
再看一个复杂点的例题?007q?月数?0-41题?/p>
●给定关pL式R<U, F>QU=?jng)A, B, C, D, E},FQ{B→AQD→AQA→EQAC→B},其候选关键字?
Q?0Q?nbsp; Q则分解ρ={R1QABCEQ,R2QCDQ}满 Q?1Q??br />
Q?0Q?AQABD
BQABE
CQACD
DQCD
Q?1Q?AQ具有无损连接性、保持函C?br />
BQ不h无损q接性、保持函C?br />
CQ具有无损连接性、不保持函数依赖
DQ不h无损q接性、不保持函数依赖
看见了吧Q和前面一题多么的相像Q?br />
对于W一问,分别计算ABCD四个选项的闭包,
QABDQ? = { ABDE }
QABEQ? = { ABE }
QACDQ? = { ABCDE }
QCDQ? = { ABCDE }
选D?/p>
再做保持依赖的判断?br /> B→AQA→EQAC→B在R1上成立,D→A在R1和R2上都不成立,因此需做进一步判断?br /> ׃B→AQA→EQAC→B都是被保持的Q因为它们的元素都在R1中)Q因此我们要判断的是D→A是不是也被保持?/p>
对于D→A应用法二:(x)
result=D
对R1Qresult∩R1=фQ空集,找不到空集的W号Q就用这个表C吧Q,t=фQresult=D
再对R2Qresult∩R2=DQD+ =ADE Qt=D+ ∩R2=DQresult=D
一个@环后result未发生变化,因此最后result=DQƈ未包含AQ所以D→A未被保持Q该分解不是保持依赖的?/p>
(1) A. P(S1) BQ?/span>P(S2) CQ?/span>P(Sn) DQ?/span>P(Sn)?/span>P(S1)
(2) AQ?/span>P(Sn)?/span>V(S2) BQ?/span>P(Sn)?/span>V(S1) CQ?/span>P(S2)?/span>V(S1) D.V(S1)?/span>P(S2)
(3) AQ?/span>P(S1)?/span>V(S2) BQ?/span>P(Sn)?/span>V(S1) CQ?/span>P(S2)?/span>V(S1) DQ?/span> V(S1)?/span> P(S2)
{案Q(1Q?/span>C Q?/span>2Q?/span>D Q?/span>3Q?/span>A
解析Q这是一道考查PV操作的题Q所以首先得弄清楚那些地斚w要互斥、那些地斚w要同步。题目中l出了两c进E:(x)֮q程与收银元q程Q由于超市是֮q程之间的公有资源,而且市里限制最多允许有n个顾客购物,所以要讄一个公有信号量SnQ初值是nQ顾客进E在q入市时要执行P(Sn)Q离开市时要执行V(Sn)操作。顾客购物后要到攉员处付款Q因此顾客进E与攉员进E之间是同步的关p,一ơ只允许一个顾客进E付?gu)ƾ,整个市只有一个收银员q程收费Q所以需要ؓ(f)֮q程讄一个私有信号量S2Qؓ(f)攉员进E设|一个私有信号量S1Q由于开始时没有֮M?gu)ƾ,攉员也没有收费Q所?/span>S1?/span>S2的初gؓ(f)0。当有顾客买完东西去付款时执?/span>V(S1)Q通知攉员进E有֮付款Q此时收银员q程执行P(S1)操作后就可进入收费,收费完成后收银元q程执行V(S2)Q以通知֮收费完毕Q此旉客执?/span>P(S2)可d攉収ͼ在离开市旉执行V(Sn)Q释放资源?/span>
复习(fn)提示Q?/span>PV操作在操作系l中处于很重要得CQ要惛_适的q用PV操作Q必d好的理解q程之间的互斥与同步Q即那些q程之间是互斥的Q那些进E之间是同步的?/span>
2005q上半年E序员试?br /> ●某pȝ中有一个缓冲区Q进EP1不断地生产品送入~冲区,q程P2不断C~冲区取产品消费。假设该~冲区只能容U一个品。进EP1与P2的同步模型如下图所C:(x)
(q个囑ְ是教E中常见的那个图)
P1 P2
__| __|
| 生一个?nbsp; | P(S2)
| P(S1) | 从缓冲区取一个?br />
| 产品送缓冲区 | V(S1)
| V(S2) | 消费
|__| |__|
为此Q应设信号量S1的初gؓ(f)__(18)__Q信号量S2的初gؓ(f)__(19)__?br />
(18) AQ?2 BQ?1 CQ? DQ?
(19) AQ?2 BQ?1 CQ? DQ?
{案Q?18)D (19)C
分析Q?/font>
资源S是这个资源初始状态拥有的数目Q也是没有M操作Q刚开始的时候资源的可用数?br /> 单的例子Q一个盘子可以放8个苹果,一ơ只能一个h拿一个苹果或者放一个苹果,则设|两个资源S1、S2分别表示盘子中苹果的数量和取放苹果的许可Q则S1初始gؓ(f)8QS2??/font>
以下一定要CQ?br />
P操作
S = S-1
S<0 d
V操作
S= S+1
S ?0 唤醒
S1、S2分别是P1、P2对缓冲区操作的开养IS1=1表示初始状态P1q程可以对缓冲区q行操作Q而对于S2=0正好L了P2q程对缓冲区的操作!在刚开始的时候缓冲区为空Q其允许P1在其中放入品,但不能让P2取出产品Q所以才产生q样的结?/font>
P一ơ什么什么就减一个。如果你P的玩意是0.那P下面的东西就不开工了?br />
V 一ơ什么就加一?br />
q个同步有s1 s2.
s1肯定是ؓ(f)1的。缓冲区可以攑և个东西就应该是几.
你P了p1 一ơ以后?代表向缓冲区里放了东ѝs1 = 0了。表C缓冲区不能放东西了。进E时q行了。假设这句执行完了后跛_W二个程序中厅R是p(s2) 刚肯定不行。所以s2一定要为初始要?. 要等待第一个放q缓冲区的事做完后V(s2)把s2标志位搞?/font>
●某仓库有两名发货员Q一名审核员。当֮提货Ӟ只要发货员空?允许֮q入仓库提货Q顾客离开Ӟ审核员检验顾客提货是否正。其工作程如下图所C。ؓ(f)了利用PV操作正确地协调他们之间的工作Q设|了两个信号量S1和S2Q且S1的初gؓ(f)2QS2的初gؓ(f)1。图中的a应填写____(25)___Q图中的b、c和d应分别填写____(26)____?br />
500){this.resized=true;this.style.width=500;}">
供选择的答案:(x)
(25)A.P(S1) B.P(S2) C.V(S1) D.V(S2)
(26)A.P(S2)、VQS2Q和VQS1Q? B.PQS1Q、VQS1Q和VQS2Q?br />
C.VQS1Q、P(S2)和V(S2) D.VQS2Q、PQS1Q和VQS1Q?/font>
分析Q?/font>
֮来了,要看看是否有发货?卛_货员资源是否存在.
所以用P(S1) 若S1>0表示,存在(无论多少)
若S1<=0表示,不存?q程d.
提完?q说?肯定用发货员?肯定q有人等着提货.q时,应该释放发货?
所以用V(S1)
然后,要审?
可能有h正在审呢,所以用P(S2)意思和上面相同.
审完?要释?可能有h正等着审呢.所以用V(S2)释放审货?
完毕.
PV原语实现q程间互斥与同步
PV原语的含?/strong>
P操作和V操作是不可中断的E序D,UCؓ(f)原语。PV原语?qing)信号量的概念都是由荷兰U学家E.W.Dijkstra提出的。信号量sem是一整数Qsem大于{于零时代表可供q发q程使用的资源实体数Q但sem于零时则表C正在等待用(f)界区的进E数?br />
P原语操作的动作是Q?br />
Q?Qsem?Q?br />
Q?Q若sem?后仍大于或等于零Q则q程l箋执行Q?br />
Q?Q若sem?后小于零Q则该进E被d后进入与该信L(fng)对应的队列中Q然后{q程调度?br />
V原语操作的动作是Q?br />
Q?Qsem?Q?br />
Q?Q若相加l果大于Ӟ则进El执行;
Q?Q若相加l果于或等于零Q则从该信号的等待队列中唤醒一{待q程Q然后再q回原进El执行或转进E调度?br />
PV操作对于每一个进E来_(d)都只能进行一ơ,而且必须成对使用。在PV原语执行期间不允许有中断的发生?br />
用PV原语实现q程的互?/strong>
׃用于互斥的信号量sem与所有的q发q程有关Q所以称之ؓ(f)公有信号量。公有信号量的值反映了公有资源的数量。只要把临界区置于P(sem)和V(sem)之间Q即可实现进E间的互斥。就象火车中的每节R厢只有一个卫生间Q该车厢的所有旅客共享这个公有资源:(x)卫生_(d)所以旅客间必须互斥q入卫生_(d)只要把卫生间攑֜P(sem)和V(sem)之间Q就可以到达互斥的效果。以下例子说明进E的互斥实现?br />
?
生围棋的工Z心把相{数量的黑子和白子装蝲一个箱子里Q现要用自动分拣pȝ把黑子和白子分开Q该pȝ׃个ƈ发执行的q程l成Q功能如下:(x)
Q?Q进EA专门拣黑子,q程B专门拣白子;
Q?Q每个进E每ơ只拣一个子Q当一个进E在拣子时不允许另一个进E去拣子Q?br />
分析Q?/strong>
W一步:(x)定q程间的关系。由功能Q?Q可知进E之间是互斥的关pR?br />
W二步:(x)定信号量及(qing)其倹{由于进EA和进EB要互斥进入箱子去拣棋子,子是两个进E的公有资源Q所以设|一个信号量sQ其值取决于公有资源的数目,׃子只有一个,s的初值就设ؓ(f)1?br />
实现Q?/strong>
begin
s:semaphore;
s:=1;
cobegin
process A
begin
L1: P(s);
拣黑子;
V(s);
goto L1;
end;
process B
begin
L2:P(s);
拣白子;
V(s);
goto L2;
end;
coend;
end;
判断q程间是否互斥,关键是看q程间是否共享某一公有资源Q一个公有资源与一个信号量相对应。确定信号量的值是一个关键点Q它代表了可用资源实体数。如下实例:(x)
?
某R站售厅QQ何时L多可容纳20名购者进入,当售厅中少?0名购者时Q厅外的购票者可立即q入Q否则需要在外面{待。每个购者可看成一个进E?br />
分析Q第一步:(x)定q程间的关系。售厅是各q程׃n的公有资源,当售厅中多?0名购者时Q厅外的购票者需要在外面{待。所以进E间是互斥的关系。第二步Q确定信号量?qing)其倹{只有一个公有资源:(x)售票厅,所以设|一个信号量s。售厅最多容U?0个进E,卛_用资源实体数?0Qs的初值就设ؓ(f)20?br />
实现Q?br />
begin
s:semaphore;
s:=20;
cobegin
process PI(I=1,2,……)
begin P(s);
q入售票厅;
购票Q?br />
退出;
V(s);
end;
coend
当购者进入售厅前要执行P(s)操作Q执行后若s大于或等于零Q说明售厅的h数还未满可进入。执行后若s于Ӟ则说明售厅的h数已满不能进入。这个实C同时最多允?0个进E进入售厅购票Q其余进E只能等待?br />
用PV原语实现q程的同?/strong>
与进E互斥不同,q程同步时的信号量只与制U进E及(qing)被制U进E有兌不是与整组q发q程有关Q所以称该信号量为私有信号量。利用PV原语实现q程同步的方法是Q首先判断进E间的关pMؓ(f)同步的,且ؓ(f)各ƈ发进E设|私有信号量Q然后ؓ(f)U有信号量赋初|最后利用PV原语和私有信号量规定各进E的执行序。下面我们将?增添一个条Ӟ使其成ؓ(f)q程间是同步的?br />
?
在例1的基之上再添加一个功能:(x)
Q?Q当一个进E拣了一个棋子(黑子或白子)以后Q必让另一个进E拣一个棋子(黑子或白子)?br />
分析Q?br />
W一步:(x)定q程间的关系。由功能Q?Q(2Q(3Q可知,q程间的关系为同步关pR第二步Q确定信号量?qing)其倹{进EA和B׃n子q个公有资源Q但规定两个q程必须轮流d不同色的子Q因而相互间要互通消息。对于进EA可设|一个私有信号量s1Q该U有信号量用于判断进EA是否能去拣黑子,初gؓ(f)1。对于进EB同样讄一个私有信号量s2Q该U有信号量用于判断进EB是否能去拣白子,初gؓ(f)0。当然你也可以设|s1初gؓ(f)0Qs2初gؓ(f)1?br />
实现:
begin
s1,s2:semaphore;
s1:=1;s2:=0;
cobegin
process A
begin
L1: P(s1);
拣黑子;
V(s2);
goto L1;
end;
process B
begin
L2:P(s2);
拣白子;
V(s1);
goto L2;
end;
coend;
end;
另外一个问题就是P原语是不是一定在V原语的前面?回答是否定的。下面看一个例子?br />
?
讑֜公共汽R上,司机和售员的活动分别是Q司机:(x)启动车辆Q正常行车,到站停R。售员Q上乘客Q关车门Q售,开车门Q下乘客。用PV操作对其控制?br />
分析Q?/strong>
W一步:(x)定q程间的关系。司机到站停车后Q售员方可工作。同P售票员关车门后,司机才能工作。所以司Z售票员之间是一U同步关pR?br />
W二步:(x)定信号量及(qing)其倹{由于司Z售票员之间要互通消息,司机q程讄一个私有信号量runQ用于判断司否进行工作,初gؓ(f)0。售员q程讄一个私有信号量stopQ用于判断是否停车,售票员是否能够开车门Q初gؓ(f)0?br />
实现Q?br />
begin stop ,run:semaphore
stop:=0;run:=0;
cobegin
driver: begin
L1: P(run);
启动车辆Q?br />
正常行RQ?br />
到站停RQ?br />
V(stop);
goto L1;
end;
conductor:begin
L2:上乘客;
兌R门;
V(run);
售票Q?br />
P(stop);
开车门Q?br />
下乘客;
goto L2;
end;
coend;
end;
用PV操作q可以实现进E同步与互斥的合问题,典型的如Q多个生产者和多个消费者共享容量ؓ(f)n的缓存区。这个例子在很多书中都有介绍Q在q里׃说了?/p>
]]>
通过实践来增强对理论的理?/span>
打破同学以往在程序设计学?fn)中存在的误?/span>
误区二:(x)不善于做W记Q不善于ȝ?/span>
解决Ҏ(gu)QhL有忘性的Q今天记得很牢的东西Q过一星期也许完全忘CQ用W记下来Q好记性不如烂W头Q不要太怿自己的记?/span>
误区三:(x)不善于思考,遇到问题首先惛_问别?/span>
解决Ҏ(gu)Q勤于思考,在学?fn)的道\上会(x)遇到大量问题Q这些遇到的问题是你的宝贵胦富。遇到问题时首先想ؓ(f)什么会(x)出现该错误,其在程序中Q应该学?x)看错误提示Q根据提C去L错误的根源,实在不行再去问同学,问老师
因ؓ(f)自己L错误的过E是最好的学习(fn)q程Q这个错误一旦被自己解决掉,首先得到的是极大的满xQ另外会(x)留下深刻的印象,q是看书所得不到的Q有q这U经历的同学才会(x)有这U体?x)。即使没有解决也?x)从q个q程中学到很多东西,q种感觉是:(x)只可意会(x)Q不可言传?/span>
误区四:(x)Ҏ(gu)骄傲Q以׃(x)Ҏ(gu)术就得意h
解决Ҏ(gu)Q做谦虚Q学?fn)程序设计更要谦虚。要知道山外有山Qh外有人,只有谦虚才会(x)督促自己不断的去学习(fn)Q编E水q的提高才会(x)一点点上去?/span>
误区五:(x)没有耐心Q怕麻烦,思考时间不够长
解决Ҏ(gu)Q没有耐心是写不好E序的,写程序是不仅是知识的体现Q更是耐心与毅力的体现QQ何程序开始都?x)有错误的,耐心L错误体现一个h的编E素充R要多思考,多去惻I脑子用灵
误区六:(x)x慢学好技术,一步一个脚华ͼt踏实实Q严重错?/span>
解决Ҏ(gu)Q技术的发展日新月异Q尤其在软g斚w。学?fn)一门新的技术,开始时不必面面俱到Q先?/span>hello world写出来再_(d)?#8220;热打铁”Q会(x)的东西,仔细看;不会(x)的东西,着头皮ȝQ实在不行就跌?/span>
误区七:(x)不看英文Q只看中?/span>
解决Ҏ(gu)Q很多帮助文Ӟ比如最重要?/span>JDK帮助文g都是英文的,只有?fn)惯看英文才能进步快Q中文的译很多都是文不寚wQ看了还不如不看Q看英文虽然慢,可是q了不久Q你׃(x)发现英文也没那么难懂
实践Q实践,q是实践
即书上有代码,也要把它敲出来,敲代码也是有感觉?/span>
看明?/span> Q?/span>= q行出来Q是两个概念
希望大家在每ơ学?fn)后都能有质的提高,而不仅仅学会(x)了一些新技术,更要学会(x)E序设计的一般方法,一般思想。也怽工作后未必从?/span>J2EE或?/span>.NET相关的工作,但是掌握了学?fn)的?gu)Q学?fn)Q何其他的技术都不是什么难?/span>
WebWork是由OpenSymphonyl织开发的Q致力于lg化和代码重用的拉出式MVC模式J2EE Web框架?span lang=EN-US>WebWork目前最新版本是2.2Q现在的WebWork2.x前n?span lang=EN-US>Rickard Oberg开发的WebWorkQ但现在WebWork已经被拆分成?span lang=EN-US>Xwork1?span lang=EN-US>WebWork2两个目?span lang=EN-US>Xworkz、灵zd能强大,它是一个标准的Command模式实现Qƈ且完全从web层脱d来?span lang=EN-US>Xwork提供了很多核心功能:(x)前端拦截机(interceptorQ,q行时表单属性验证,cd转换Q强大的表达式语aQ?span lang=EN-US>OGNL – the Object Graph Notation LanguageQ,IoCQ?span lang=EN-US>Inversion of Control倒置控制Q容器等?span lang=EN-US>
WebWork2建立?span lang=EN-US>Xwork之上Q处?span lang=EN-US>HTTP的响应和h?span lang=EN-US>WebWork2使用ServletDispatcher?span lang=EN-US>HTTPh的变?span lang=EN-US>Action(业务?span lang=EN-US>Actionc?span lang=EN-US>), sessionQ会(x)话)applicationQ应用程序)范围的映,requesth参数映射?span lang=EN-US>WebWork2支持多视图表C,视图部分可以使用JSP, Velocity, FreeMarker, JasperReportsQ?span lang=EN-US>XML{?/font>
1
2
除了上述Ҏ(gu)外, WebWorkqؓ(f)其它功能?span lang=EN-US>
1
2
3
4
5
6
提供了强有力的支?span lang=EN-US>.
WebWork 2 : 什么是WebWork
WebWork是一个强大的ZWeb?strong>MVC框架, 它构建在一个命令模式框?span lang=EN-US>XWork之上. WebWork的特性包?span lang=EN-US>
WebWork真正的优势在于它z和协作能力的根本理?span lang=EN-US>. 使用WebWork有助于
一 Q特?span lang=EN-US>
1 Q灵zȝ校验(validation)框架, 允许使用XML文g定义校验q过截取?span lang=EN-US>(Interceptor)在运行时自动应用到活动类(Action class), 从而达到校验与zdcM间的完全解藕(decoupled). 新版本还支持客户端校?span lang=EN-US>.
2 Q类型{?span lang=EN-US>(Type conversion)可以很容易的对象从一个类转换成另一个类型?span lang=EN-US>
3 Q强大的表达式语a(Expression Language, EL)建立?span lang=EN-US>OGNL基础之上, 允许:
1
2
3
4
4 Q用反转控?span lang=EN-US>(Inversion of Control, IoC)理lg(component)生命周期?u>依赖关系, 不需要编写注册类创徏lg, lg客户也不需要主动获取组件实?span lang=EN-US>(instance).
5 Q?span lang=EN-US>Velocity模版, 使得开发h员可以很Ҏ(gu)的定?span lang=EN-US>Web面的外?span lang=EN-US>(look & feel).
6 Q截取器(Interceptors)可以动态截取活?span lang=EN-US>(Action)执行前后的处理过E?span lang=EN-US>, q?span lang=EN-US>
1
2
7 Q支持国际化(I18n).
8 Q可以方便的与其他第三方软g集成, 包括Hibernate, Spring, Pico, Sitemesh.
9 Q支持多U视图技术如:
1
2
3
4
5
10 Q?u>使用?/u>(Packages)?u>名空?/u>(Namespaces)理C百计的活?span lang=EN-US>.
?Q背景与目的
WebWork是一个开放源代码目, 目标是ؓ(f)在短旉内构建复杂网站提供易于理解和l护的工具及(qing)开发框?span lang=EN-US>. Java是一个^C?qing)基于该q_的语a, 管他支?span lang=EN-US>although it supports many others as the language in which systems are built, such as JavaScript and XML.
WebWork在构架上Z最?jng)_践和那些已被证实有h(hun)值的设计模式. 它还Z一个强烈的动机: 可能的?span lang=EN-US>, q具有维护上的灵zL?span lang=EN-US>(q实际上是一个困隄q).
它也鼓励用户使用恰当?span lang=EN-US>, W合需要的方式工作. [It also encourages you, as a user, to do things the way you seem fit for your needs.] WebWork能以多种方式配置和?/span>, 哪种方式更适合于你依赖于用环?span lang=EN-US>. 下面是一个例?span lang=EN-US>, WebWork支持多种不同?span lang=EN-US>HTML生成技术如:
1
2
3
它们之间在理念上和技术上都存在很大的差别, 但都能ؓ(f)WebWork所?span lang=EN-US>, 同时, 不同的用L(fng)实需要这些不同的方式. "你不能那么做"是我们尽可能避免的一句话, ?span lang=EN-US>"我们不能"往往是因为有另一个更?span lang=EN-US>, 更适合的工?span lang=EN-US>.
?span lang=EN-US> Q?span lang=EN-US>WebWork?span lang=EN-US>MVC Model-1?span lang=EN-US>Model-2的支?span lang=EN-US>
Web应用开发框架的最重要的一个Q务是支持
1
2
3
相分ȝ理念. 如果没有做到q一?span lang=EN-US>, 通常?x)导致维护上的问?span lang=EN-US>, 如果开发团队结构复?span lang=EN-US>(因ؓ(f)每一个团队成员通常只负责应用的某一斚w(aspect)), q会(x)使应用的开发变得更加困?span lang=EN-US>. 辑ֈ分离目的的一般方法是采用MVC(Model-View-Controller)设计模式. 该模式鼓׃用分ȝ代码来处理:(x)
1
2
3
q样分离之后, 下一个问题是:
有两U常用的设计模型可以做到q一?span lang=EN-US>, 它们分别被称?span lang=EN-US>Model-1?span lang=EN-US>Model-2. q两U模型将在下文描q?span lang=EN-US>.
Model-1 Q?span lang=EN-US>
Model-1方式的基本想法是在表C层(presentation layer)?span lang=EN-US>JSP或模版中调用控制器代?span lang=EN-US>. 如果你正在?span lang=EN-US>JSP, q意味着你可以通过两种方式执行你的WebWorkzdQ?span lang=EN-US>
1
2
Model-2 Q?span lang=EN-US>
?span lang=EN-US>Model-2方式?span lang=EN-US>
1
2
q三方军_, 通常是一?span lang=EN-US>servlet分发?span lang=EN-US>. 分发器解?strong>HTTPh中的URL, 然后军_执行哪些代码. 一个包含控制器代码?span lang=EN-US>Java对象被获取ƈ执行, 从而完成对某个应用逻辑和业务逻辑的处?span lang=EN-US>. 当执行结束后, 分发器将h转交(forward)l一个视囑֤理器(如一?span lang=EN-US>JSP), 它用前一个处理的数据l制l果视图.
?span lang=EN-US> Q如何选择使用?
׃
1
2
完全解藕, 使得Ҏ(gu)执行情况来显CZ同结果页面成为可?span lang=EN-US>. 例如, 如果处理出现错误可以显CZ个错误页面而不昄正常的结果页?span lang=EN-US>.
Model-1方式的优点如?span lang=EN-US>.
那么q些代码调用和表现部分的代码(?span lang=EN-US>JSP标签库和HTML)不必分离到新的活动和JSP面中处理过E?span lang=EN-US>. q样可以提高性能和可L?span lang=EN-US>.
Model-2方式的优点如?span lang=EN-US>.
选择使用的首要原则是:
OGNL?span lang=EN-US>WebWork,XWork中的底层支持lg.非常强大的函数库.
package org.riker.news.control;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.riker.news.data.NewsDataBean;
import org.riker.news.logic.NewsLogicBean;
public class DetailServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public DetailServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String newsid = request.getParameter("newsid");
NewsDataBean bean = new NewsLogicBean().detail(newsid);
if(bean!=null) {
request.setAttribute("bean",bean);
request.getRequestDispatcher("main/detail.jsp").forward(request, response);
} else {
request.getRequestDispatcher("main/error.jsp").forward(request, response);
}
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
}
2?/span>NewsLogicBean.javaQ写公共的,修改relevantQ写deleteNews()Ҏ(gu)
package org.riker.news.logic;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.riker.news.comm.DataSource;
import org.riker.news.data.NewsDataBean;
public class NewsLogicBean {
private int allRows;
private int curPage = 1;
private int rowPerPage = 5;
private int allPages;
public List findAll() {
List list = new ArrayList();
Statement st = null;
ResultSet rs = null;
try {
st = DataSource.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery("select newsid, newstitle, newscontent, newscount, newsdate from news order by newsdate desc");
rs.last();
this.allRows = rs.getRow();
if(this.allRows%this.rowPerPage==0) {
this.allPages = this.allRows/this.rowPerPage;
} else {
this.allPages = this.allRows/this.rowPerPage + 1;
}
if(this.curPage == 1) {
rs.beforeFirst();
} else {
rs.absolute((this.curPage - 1) * this.rowPerPage);
}
int i = 0;
while(rs.next() && i < this.rowPerPage) {
NewsDataBean bean = new NewsDataBean();
bean.setNewsid(rs.getString(1));
bean.setNewstitle(rs.getString(2));
bean.setNewscontent(rs.getString(3));
bean.setNewscount(rs.getString(4));
bean.setNewsdate(rs.getString(5));
list.add(bean);
i++;
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public int insertNews(String newsTitle, String newsContent) {
return modify("insert into news(newstitle, newscontent, newscount, newsdate) values ('"+newsTitle+"', '"+newsContent+"', 0, now()");
}
public int modify(String sql) {
int result = 0;
Statement st = null;
try {
st = DataSource.getConnection().createStatement();
result = st
.executeUpdate(sql);
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public int deleteId(String newsid) {
return modify("delete from news where newsid="+newsid);
}
public int updateNews(String newsid, String newsTitle, String newsContent) {
return modify("update news set newstitle='"+newsTitle+"', newscontent='"+newsContent+"' where newsid="+newsid);
}
public NewsDataBean findById(String newsid) {
NewsDataBean bean = new NewsDataBean();
Statement st = null;
ResultSet rs = null;
try {
st = DataSource.getConnection().createStatement();
rs = st.executeQuery("select newsid, newstitle, newscontent, newscount, newsdate from news where newsid=" + newsid);
rs.last();
if(rs.next() ) {
bean.setNewsid(rs.getString(1));
bean.setNewstitle(rs.getString(2));
bean.setNewscontent(rs.getString(3));
bean.setNewscount(rs.getString(4));
bean.setNewsdate(rs.getString(5));
}
} catch (SQLException e) {
e.printStackTrace();
}
return bean;
}
public NewsDataBean detail(String newsid) {
NewsDataBean bean = new NewsDataBean();
Statement st = null;
ResultSet rs = null;
try {
st = DataSource.getConnection().createStatement();
st.executeUpdate("update news set newscount=newscount+1 where newsid="+newsid);
rs = st.executeQuery("select newsid, newstitle, newscontent, newscount, newsdate from news where newsid=" + newsid);
rs.last();
if(rs.next() ) {
bean.setNewsid(rs.getString(1));
bean.setNewstitle(rs.getString(2));
bean.setNewscontent(rs.getString(3));
bean.setNewscount(rs.getString(4));
bean.setNewsdate(rs.getString(5));
}
} catch (SQLException e) {
e.printStackTrace();
}
return bean;
}
public static void main(String[] args) {
List list = new NewsLogicBean().findAll();
System.out.println(list.size());
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getAllPages() {
return allPages;
}
public int getAllRows() {
return allRows;
}
public int getRowPerPage() {
return rowPerPage;
}
}
3?/span>DeleteServlet.javaQ去COPYq来跌{的语
句?/span>==>查看新闻详细Q中_(d)新徏DetailServlet.javaQ注意此时ؓ(f)doGetQ?/span>
地址栏的提交Q?/span>==>NewsLogicBean.java?/span>COPY上面Insert?/span>public
NewsDataBean detail(String newsid) {}==>DetailServlet.java?/span>COPYq来
FindByIdServlet.java?/span>NewsDataBean bean = new NewsLogicBean
().findById(newsid)Q?/span>modified it==>
package org.riker.news.control;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.riker.news.data.NewsDataBean;
import org.riker.news.logic.NewsLogicBean;
public class DetailServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public DetailServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String newsid = request.getParameter("newsid");
NewsDataBean bean = new NewsLogicBean().detail(newsid);
if(bean!=null) {
request.setAttribute("bean",bean);
request.getRequestDispatcher("main/detail.jsp").forward(request, response);
} else {
request.getRequestDispatcher("main/error.jsp").forward(request, response);
}
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
}
4、用insert.jsp复制新徏detail.jspQ引
?/span>NewsDataBean PackageQ写标签 <jsp:useBean id="news"
class="org.riker.news.logic.NewsLogicBean"/>Q这么做没必要!Q?/span>WHYQ?/span>
因ؓ(f)DetailServlet.java?/span>request.setAttribute("bean",bean);已经攑օ
bean了,所以直?/span>NewsDataBean bean = (NewsDataBean)
request.getAttribute("bean");注意request.getAttribute("bean")Q然后格
式化Q更观些,?/span>JavaScriptq回Q?/span><a href="javascript:history.back
()">q回</a>?/span>
<%@ page contentType="text/html;charset=GBK" import="org.riker.news.data.*"%>
<html>
<head>
<title></title>
</head>
<body>
<%
NewsDataBean bean = (NewsDataBean)request.getAttribute("bean");
%>
<h2 align="center">
<%=bean.getNewstitle()%> 发布旉Q?/span><%=bean.getNewsdate()%>
</h2>
<%=bean.getNewscontent()%>点击的次敎ͼ(x)<%=bean.getNewscount()%>
<hr>
<a href="javascript:history.back()">q回</a>
</div>
</body>
</html>
java中没昄的和c++中的指针,但是他有地址的概늚.而且所有我们申明的"对象"其实是地址(或叫句柄),l他赋值就是把他指向一个内存单?span lang=EN-US>.当然也可以改变他的指?span lang=EN-US>.其实我们"对象"的赋值操作全是地址在变?span lang=EN-US>,对象q是没有变的.那也许有Z(x)说那L(fng)话不是会(x)产生很多没有"对象"(句柄)的内存区?span lang=EN-US>.是的是会(x)产生,但是java的垃圾收集机制会(x)l我们回收这L(fng)内存"泄漏".所以我们只兛_我们操作的对象就?span lang=EN-US>,其他的我们不用的对象的后事垃圾收集会(x)l我们干.?/span>
明白了在java中的"对象"而非我们c++中理解的对象.而实际上是指?span lang=EN-US>(句柄)那多态当然可以实?span lang=EN-US>.
下面举个"对象"赋?span lang=EN-US>(引用)的例子说?span lang=EN-US>,全是地址在变,而非真的内存单元.
public class Number {
private int number;
public Number( int number ) {
this.number = number;
}
public int getNumber() {
return this.number;
}
public void setNumber( int number ) {
this.number = number;
}
public static void main( String[] args ) {
Number one = new Number( 1 );
Number two = new Number( 2 );
System.out.println( "Beginning: " );
System.out.println( "One = " + one.getNumber() );
System.out.println( "Two = " + two.getNumber() );
// Assign two to one
two = one;//在这?/span>twoq个句柄的?/span>(x个对象的地址)Ҏ(gu)oneq个句柄的g.从?/span>two?/span>one指同?/span>//?/span>one以前指向的那个内存单?/span>(对象).?/span>two 以前指向的那个对象现在ؓ(f)没有句柄q接的对象了.可能要被垃圾攉
System.out.println( "\nAfter assigning two to one: " );
System.out.println( "One = " + one.getNumber() );
System.out.println( "Two = " + two.getNumber() );
// Change the value of two
two.setNumber( 3 );//two?/span>one指向同一个单?/span>,所以他Ҏ(gu)单元的改?/span>,one能感?/span>.
System.out.println( "\nAfter modifying two: " );
System.out.println( "One = " + one.getNumber() );
System.out.println( "Two = " + two.getNumber() );
}
}
q行l果:
Beginning:
One = 1
Two = 2
After assigning two to one:
One = 1
Two = 1
After modifying two:
One = 3
Two = 3
下面q行概括ȝ..
1Q指?span lang=EN-US>
JAVA语言让编E者无法找到指针来直接讉K内存无指针,q且增添了自动的内存理功能Q从而有效地防止?span lang=EN-US>cQ?span lang=EN-US>c++语言中指针操作失误,如野指针所造成的系l崩溃。但也不是说JAVA没有指针Q虚拟机内部q是使用了指针,只是外h不得使用而已。这有利?span lang=EN-US>JavaE序的安全?span lang=EN-US>
2Q多重?span lang=EN-US>
c++支持多重l承Q这?span lang=EN-US>c++的一个特征,它允许多父类z一个类。尽多重承功能很强,但用复杂,而且?x)引赯多麻烦,~译E序实现它也很不Ҏ(gu)?span lang=EN-US>Java不支持多重承,但允怸个类l承多个接口(extends+implement)Q实Cc++多重l承的功能,又避免了c++中的多重l承实现方式带来的诸多不ѝ?span lang=EN-US>
3Q数据类型及(qing)c?span lang=EN-US>
Java是完全面向对象的语言Q所有函数和变量部必Lcȝ一部分。除了基本数据类型之外,其余的都作ؓ(f)cd象,包括数组。对象将数据和方法结合v来,把它们封装在cMQ这h个对象都可实现自q特点和行为。?span lang=EN-US>c++允许函数和变量定义为全局的。此外,Java中取消了cQ?span lang=EN-US>c++中的l构和联合,消除了不必要的麻烦?span lang=EN-US>
4Q自动内存管?span lang=EN-US>
JavaE序中所有的对象都是?span lang=EN-US>new操作W徏立在内存堆栈上,q个操作W类gc++?span lang=EN-US>new操作W。下面的语句׃个徏立了一个类Read的对象,然后调用该对象的workҎ(gu)Q?span lang=EN-US>
Read rQ?span lang=EN-US>new Read()Q?span lang=EN-US>
r.work()Q?span lang=EN-US>
语句Read rQ?span lang=EN-US>new Read()Q在堆栈l构上徏立了一?span lang=EN-US>Read的实例?span lang=EN-US>Java自动q行无用内存回收操作Q不需要程序员q行删除。?span lang=EN-US>c十十中必ȝE序贝释攑ֆ存资源,增加了程序设计者的负扔?span lang=EN-US>Java中当一个对象不被再用到Ӟ无用内存回收器将l它加上标签以示删除?span lang=EN-US>JAVA里无用内存回收程序是以线E方式在后台q行的,利用I闲旉工作?span lang=EN-US>
5Q操作符重蝲
Java不支持操作符重蝲。操作符重蝲被认为是c十十的突出特征,?span lang=EN-US>Java中虽然类大体上可以实现这L(fng)功能Q但操作W重载的方便性仍然丢׃不少?span lang=EN-US>Java语言不支持操作符重蝲是ؓ(f)了保?span lang=EN-US>Java语言可能简单?span lang=EN-US>
6Q预处理功能
Java不支持预处理功能?span lang=EN-US>cQ?span lang=EN-US>c十十在编译过E中都有一个预~泽阶段Q即众所周知的预处理器。预处理器ؓ(f)开发h员提供了方便Q但增加丁编译的复杂性?span lang=EN-US>JAVA虚拟机没有预处理器,但它提供的引入语?span lang=EN-US>(import)?span lang=EN-US>c十十预处理器的功能类伹{?span lang=EN-US>
7. Java不支持缺省函数参敎ͼ?span lang=EN-US>c十十支持
?span lang=EN-US>c中,代码l织在函CQ函数可以访问程序的全局变量?span lang=EN-US>c十十增加了类Q提供了cȝ法,该算法是与类相连的函敎ͼc十十cL法与JavacL法十分相|然而,׃c十十仍然支持cQ所以不能阻?span lang=EN-US>c十十开发h员用函敎ͼl果函数和方法合用得程序比较乱?span lang=EN-US>
Java没有函数Q作Z个比c十十更纯的面向对象的语言Q?span lang=EN-US>Java开发h员把所有例行程序包括在cMQ事实上Q用Ҏ(gu)实现例行E序可激励开发h员更好地l织~码?span lang=EN-US>
8 字符?span lang=EN-US>
c?span lang=EN-US>c十十不支持字W串变量Q在c?span lang=EN-US>c十十E序中?span lang=EN-US>Nulll止W代表字W串的结束,?span lang=EN-US>Java中字W串是用cd?span lang=EN-US>(strinR?span lang=EN-US>stringBuffer)来实现的Q这些类对象?span lang=EN-US>Java语言的核心,用类对象实现字符串有以下几个优点Q?span lang=EN-US>
(1)在整个系l中建立字符串和讉K字符串元素的Ҏ(gu)是一致的Q?span lang=EN-US>
(2)J3阛_W串cL作ؓ(f)Java语言的一部分定义的,而不是作为外加的延部分Q?span lang=EN-US>
(3)Java字符串执行运行时I,可帮助排除一些运行时发生的错误;
(4)可对字符串用“
9“goto语句
“可?span lang=EN-US>”?span lang=EN-US>goto语句?span lang=EN-US>c?span lang=EN-US>c++?span lang=EN-US>“遗物”Q它是该语言技术上的合法部分,引用goto语句引v了程序结构的混ؕQ不易理解,goto语句子要用于无条件{UdE序和多l构分支技术。鉴于以q理由,Java不提?span lang=EN-US>goto语句Q它虽然指定goto作ؓ(f)关键字,但不支持它的使用QɽE序z易诅R?span lang=EN-US>
l0Q类型{?span lang=EN-US>
?span lang=EN-US>c?span lang=EN-US>c十十中有时出现数据类型的隐含转换Q这涉?qing)了自动强制cd转换问题。例如,?span lang=EN-US>c十十中可一点D予整型变量,q去掉其数?span lang=EN-US>Java不支?span lang=EN-US>c十十中的自动强制cd转换Q如果需要,必须q序显式进行强制类型{换?span lang=EN-US>
11.异常
JAVA中的异常机制用于捕获例外事gQ增强系l容错能?span lang=EN-US>
try{Q/可能产生例外的代?span lang=EN-US>
}catch(exceptionType name){
//处理
}
其中exceptionType表示异常cd。?span lang=EN-US>C++则没有如此方便的机制?span lang=EN-US>
class test{
public:void test1();
private:void test2();
};
注意q里的写?span>.最后那个大括号后面必须要跟一个分L(fng).JAVA则不?span>.我一开始及(qing)其不适应.
然后?span>cpp文g中来定义
void test::test1(){
cout << "aaa";
}
void test::test2(){
cout << "bb";
}
注意:q里大括号后面有没有带分号都没关p?span>.
4.C++中对函数的调用方法也灉|.
test t;
t.test2();
----------------
test* t = new test();
t->test2();
其实我还是喜?span>test t = new test();t.test2()
5.~译器的解析.如果没有引入头文件的话你必须?span>main()函数攑ֈ文g的最下面.
void main(){
test();
}
void test(){
cout << "aa";
}
q样写编译器?x)报找不?span>test()Ҏ(gu)?span>.q个?span>C遗留下的问题.解决Ҏ(gu)是引入头文?span>,或者把main写到最?span>.或者在main前面声明一?span>:
void test();
void main(){
test();
}
void test(){
cout << "aa";
}
q种做法和引入头文件差不多?span>.
6.析构函数.q个Ҏ(gu)很有用,在类消失的最后一刻自动调用这个种cd的函数来做一些清除操?/span>
7.争议比较大的声明指针cd.
int* pt=0;
int *pt=0;
q个星号是紧跟着cd呢还是紧跟着变量名呢.׃C++的灵zd太高.q两U写法都没错?span>.但按理来说紧跟着cd应该?x)好一?span>.因ؓ(f)我们是在声明一个指针类型的变量.但如果按下面的写?span>:
int* pt,pt1;
你说pt1是指针类型吗,{案是不?span>.遇到q种情况p?span>*L(fng)跟着变量名了
int *pt,*pt1;
耐心点,接下来的是精?br>
main 函数
C++
//自由动的函?span>
int main( int argc, char* argv[])
{
printf( "Hello, world" );
}
Java
// 每个函数(Ҏ(gu))都必L一个类的一部分;?span>java <class>q行是一个特定类的主函数?x)被调?span>
// (因此你可以让每个c都有一?span>main函数Q这在写单元试是很有用)
class HelloWorld
{
public static void main(String args[])
{
System.out.println( "Hello, World" );
}
}
cȝ声明
除了 Java 不要求用分号外几乎是相同的?span>
C++
class Bar {};
Java
class Bar {}
Ҏ(gu)声明
都相同的, 除了?span>Java,Ҏ(gu)必须L某个cȝ一部分q且可能public/private/protected 作ؓ(f)修饰
构造函数和析构函数
构造函数都是相同的 (即类的名?span>), Java没有准确意义上的的析构函?span>
静态成员函数和变量
Ҏ(gu)声明是相同的, ?span> Java 提供静态初始化块来来初始化静态变?span> (不需?span>在源文g中声?/span>):
class Foo
{
static private int x;
// 静态初始化?/span>
{ x = 5; }
}
对象的声?/span>
C++
// 在栈?span>
myClass x;
//或者在堆中
myClass *x = new myClass;
Java
// L在对堆中声明
myClass x = new myClass();
l?span> ?/span>
C++
class Foo : public Bar
{ ... };
Java
class Foo extends Bar
{ ... }
讉KU别 (abstraction barriers)
C++
public:
void foo();
void bar();
Java
public void foo();
public void bar();
虚函?/span>
C++
virtual int foo(); // 或者非虚函数写?span> int foo();
Java
// 函数默认的就是虚函数; ?span>final关键字防止重?span>
int foo(); // 或?span>, final int foo();
内存理
大体上是相同?span>--new 来分配, 但是 Java没有 deleteQ因为它有垃圑֛收器?span>
NULL vs null
C++
// 初始化一个指针ؓ(f) NULL
int *x = NULL;
Java
// ~译器将捕获使用未初始化的引?span>
//但是如果你因需要初始化一个引用而赋一?span>nullQ那么这是无效的
myClass x = null;
布尔?/span>
Java有一点罗?span>: 你必d boolean而不止是 bool.
C++
bool foo;
Java
boolean foo;
?span> ?/span>
C++
const int x = 7;
Java
final int x = 7;
抛异?/span>
首先Q?span>Java在编译器强制抛异?span>?/span>如果你的Ҏ(gu)可能?x)抛异常你必需明确报告
C++
int foo() throw (IOException)
Java
int foo() throws IOException
?span> l?/span>
C++
int x[10];
// ?span>
int *x = new x[10];
// 使用 x,然后归还内存
delete[] x;
Java
int[] x = new int[10];
// 使用 x, 内存有垃圑֛收器回收?span>
//或在E序生命周期头归还l系l?span>
集合和P代器
C++
q代器是cȝ成员。范围的开始是<容器>.begin(), l束?span> <容器>.end()??span>++ 操作W递增, ?span> *操作W访?span>
vector myVec;
for ( vector<int>::iterator itr = myVec.begin();
itr != myVec.end();
++itr )
{
cout << *itr;
}
Java
q代器只是一个接口?范围的开始是 <集合>.iteratorQ你必须?span>itr.hasNext()来查看是否到N合尾?使用itr.next()(是在C++中用操作符++ ?span>*操作的结?span>)来获得下一个元素?span>
ArrayList myArrayList = new ArrayList();
Iterator itr = myArrayList.iterator();
while ( itr.hasNext() )
{
System.out.println( itr.next() );
}
// ?span>, ?span>Java 5?span>
ArrayList myArrayList = new ArrayList();
for( Object o : myArrayList ) {
System.out.println( o );
}
抽象c?/span>
C++
// 只需要包含一个纯虚函?span>
class Bar { public: virtual void foo() = 0; };
Java
// 语法上允许显C的声明!
abstract class Bar { public abstract void foo(); }
// 或者你也可以声明一个接?span>
interface Bar { public void foo(); }
// 然后让一个类l承q个接口:
class Chocolate implements Bar
{
public void foo() { /* do something */ }
}
引用 vs 指针
C++
//引用不可改变,通过使用指针来获得更多的灉|?span>
int bar = 7, qux = 6;
int& foo = bar;
Java
// 引用是可变的Q仅存储对象地址;
//没有指针cd
myClass x;
x.foo(); // error, x is a null “pointer”
// 注意你要L?span> . 来访问域
~?nbsp;?/strong>
C++
// ~译
g++ foo.cc -o outfile
// q行
./outfile
Java
// ~译foo.java文g中的cL<classname>.class javac foo.java
// 通过调用<classname>中的静?span>mainҎ(gu)来运?span>
java <classname>
?span> ?/strong>
两种语言是一L(fng) (// ?span> /* */ 可以?span>)
慎重选取E序设计语言Q一旦选了Q就心无旁骛地坚持学到底Q创Z些企业的应用程?/strong>
要脚t实圎ͼ快餐式的学习(fn)不可取,q点非常重要Q时M证质量第一Q引用小学班MQ的话“一步一个脚?#8221;Q遵循发展的规律来学Q@序渐q地d?fn),千万Q绝对!Q不能想三两下马上搞定一门语aQ激情固然总要Q但前述更ؓ(f)大大地重要。工PIDEQ固焉要,Java语言本n才是本质的问?/strong>
多动手实践,不要夸夸其谈Q动手是最好最快的消化方式Q发现相关的l节的问题,发现一些只有当我们动手L击键盘时才会(x)遇到的种U问?/strong>
多参考程序代码,汲取营养Q吸收编E思想Q包括设计、架构的思想Q考虑别h是怎么发现问题、分析问题、解决问题的Q思\程Q思想非常非常地重要,q点再怎么都不q分Q这点也是学?fn)编E的一?#8220;捷径”
加强英文阅读能力Q习(fn)惯成自然Q作?#8220;p高手”的我在这斚w也不能麻痹大意,不能疏忽Q不能放松自己,也要老老实实地掌握一些专业词?/strong>
求h不如求己Q万不得已才h别hQ或者利用搜索)Q又涉及(qing)到老生常谈的一个问题了“躁”Q读了这么多书,?#8220;智慧”的我非常的不应该在这里犯qL(fng)了!Q碰到问题,自己试独立解决Q认真的好好L考,用尽各种办法Q各U途径Q这个解决问题的q程其实是提高自己能力Q提高自己实力的q程Q我们应该感谢这L(fng)q程
多读好书Q读一的书,做一的人;何ؓ(f)“好书”Q其实就是适合自己的书Q当然我本h喜欢同一斚w的书多读几本Q这h有掌控感。LSY学长好像说过“适合自己的才是最好的”q话现在是最好的应用?/strong>
使用合适的工具Q工具和某项新技术、新观念的诞生便是ؓ(f)了世界的更美好一?br>
以上Z人愚见,q请各位兄弟指教Q?/strong>
----joahon学长
--》关键字Q持l学?fn),破釜沉?/span>
·面向对象的特征有哪些斚w
·抽象Q过E、数据的抽象?/span>
·装Q现实的世界是一个封装的世界Q通过一个受保护的借口来访问,cM圎ͼ装了过E和数据?/span>
·l承Q?#8220;一U联l类的层ơ模型,允许和鼓q的重?#8221;Q子cM父类l承Ҏ(gu)和(实例Q变量,q可以根据需要增加方法和变量?/span>
·多态:(x)“允许不同cȝ对象对同一事g做出响应”Q参数化、包含多态性?/span>
·final?/span>finally?/span>finalize的区?/span>
·finalQ?/span>1、修饰类Ӟ表示此类不能被承,也不?x)从其他cȝ承;用了final׃能出?/span>abstractQ否则矛盾;2、修饰方法和变量Ӟ修饰变量时只能初始化一ơ,且不能再修改Q方法的话不能被重蝲?/span>
·finallyQ?/span>try{..}catch(..){..}中用来执行Q何的清除操作?/span>
·finalizeQ?/span>Garbage Collector在收集垃圾之前,?/span>finalizeҎ(gu)来整理系l资源或者执行相x理操作?/span>finalize?/span>java.lang包中Objectcd义的Ҏ(gu)Q因此被所有的cȝѝ?/span>
System.gc() ;
Runtime.getRuntime().gc() ;