??xml version="1.0" encoding="utf-8" standalone="yes"?> 在我看来Q面向对象编E(OOPQ最有魅力对开发技术改q最有媄响力的就是接口,接口定义一套规范或标准Q如何实现取决于他的实现c,q给开发h员提供了_的灵zL,大大增强了系l的可塑性,为开发h员提供了更加先进有效的扩展性能?/font>JDBC是接口应用最典型的示例之一Q?/font>Java JDK定义了一l接口,?/font>Connection?/font>Statement?/font>ResultSet{,但ƈ不作出具体的实现Q事实上Q?/font>sun公司也没有能力去实现Q因Z同的DBMS有不同的数据l织格式Q如何连接数据库、如何执?/font>SQL语句、如何处理返回的l果集,sun公司无从知晓Q所以,通过接口实现数据讉K的工作y妙地转移C数据库提供商Q不得不说这招实在高明?/font> 在我们的pȝ中,合理利用接口的特征能有效提高pȝ的扩展性和灉|性,其Spring的出玎ͼ通过?/font>IOC的强化,更加H出了接口的作用Q学习者更Ҏ从代码别理解接口的意义?/font>Spring无污染非侵入式的设计Q降低了lg替换和功能扩展的成本Qؓ开发h员打开了程序开发的另一扇窗?/font> q不是系l中的所有组仉需要提供接口,定义接口时应该先明确功能扩展点,对于那些比较固定有一定格式的代码则无需定义接口Q通常情况下,Z务类定义一个接口是不错的选择Q业务变更是家常侉KQؓ业务cL供接口有利于我们d适应业务的变化?/span> Eclipse?#8220;重构”做得比较强大了,如果你的业务c还没有接口Q通过“Refactor->Extract Interface”菜单可以自动Z务类生成相应的业务接口?/font> 虽然Struts2+Spring3+Hibernate3三大框架上市已久Q但廉颇未老,目前仍然是众多JavaEE应用E序的首选技术。本文将向您详细阐述SSH2应用E序的构架、思想、技术与技巧,打通JavaEE的Q督二脉,行文力求通畅z,希望能让读者豁然开朗,快速掌握JavaEE应用E序的开发流E与关键技术?/font> 本文q面向无Java基础的读者,您需要掌握一定的~程思想、Java技术和Struts2、Spring3与Hibernate3{框架技术,q了解Oracle{DBMS?/font> JavaEE体系架构采用传统的MVC设计模式Q分为Model、View、Controller三层Q其中:Modelx型层Q定义数据模型和业务逻辑。ؓ了将数据讉K与业务逻辑分离Q提高业务精度,降低代码之间的耦合Q模型层又细分ؓDAO层与业务层,DAO全称为Data Access ObjectQ数据访问对象)Q将数据库访问代码封闭v来,Hibernate API也在此封装,不再出现在其他层或向其他层暴Ԍ业务层是整个pȝ最核心也最具h值的一层,该层装应用E序的业务逻辑Q处理数据,x客户需求,在业务处理过E中会访问原始数据或产生新数据,或者需要持久化数据QDAO层提供的DAOc能很好地帮助业务层完成数据处理Q业务层本n则侧重于对客户需求的理解和业务规则的适应Q自然也包括大部分的计算QM说来QDAO不处理业务逻辑Q只Z务层提供辅助Q获取原始数据或持久化数据等操作。View卌囑ֱQؓ最l用h供一个友好的交互界面Q用户可以查看请求结果,也可以通过表单{交互手D实现数据录入。Controller层即控制器,控制器是Model与View的桥梁,二者很好的衔接Q通过View接收用户数据QController数据传输给ModelQModelҎ据进行处理;或者Modeld数据后,Controller数据传递给ViewQView向用户展C数据。一来一往QController成了Model与View之间的快乐者?/font> 关于MVC更多的解释请参考百度百U链接(http://baike.baidu.com/view/31.htmQ,下图展示?font face="Times New Roman" style="line-height: 25px; ">MVC的结构: 从调用关pM看,左ؓ高层Q右Z层,下ؓ高层Q上Z层,高层可以调用低层Q但低层不能调用高层Q层与层之间的调用是单向的?/font> 从数据传输上看,数据可以从视囑ֱ传输到DAOq而保存到数据库,也可以从数据库中d数据q行处理或者显C,所以,数据的传输是双向的?/font> 从技术实C看,视图层用HTML/JSPlg实现Q控制器使用Servlet或Actionlg实现Q模型层使用JavaBeanlg或EJB技术实现?/font> Hibernate装在DAO层,负责数据讉K操作QStruts充当控制器角Ԍ对用h据进行合法性检验和cd转换Qؓ视图层提供标{化页面显C,提供国际化支持等{;Spring是应用程序的家QDAO、ServiceQ业务)、Action{对象由Spring创徏q维护各对象之间关系Q同时提供声明式事务理Q简化事务编E?/font> 软g工程中的业务与日常生zM的业务不同,q_的业务偏指销售,指需要处理的事务。这里的业务涉及一个以上组l,按某一共同的目标、通过信息交换实现的一pdq程Q其中每个过E都有明的目的Qƈ延箋一D|间。将范围更局限一点,业务是指为完成某个事务而进行的一pdzdQ需要对象的参与q按照一定的规则触发一pd行ؓ?/font> 业务包含三大元素Q对象、行为和业务规则?/font> 对象是主体,是行为的触发者,q里的对象可能是用户、订单、品或DAO对象Q也可能是外部系l,比如支付pȝ。一个业务的完成Q可能需要一个对象参与,也可能是多个对象参与Q这取决于业务本w。行为是对象的动作,多个行ؓ按照一定的序执行Q构成业务完整的执行能力。业务规则是对业务的一U约束,每一个行为所产生的结果必d规则负责Q规则监视对象、行Z及业务执行的l果Q保证业务的正确性和准确性?/font> 我们以取ƾ业务ؓ例,来分析本业务中涉及的对象、行为和规则?/font> 取款业务描述Q输入用戯̎P银行刷卡完成Q,提醒用户输入密码Q银行系l核对密码是否正,如果正确Q用戯入取N额,pȝ更改账户金额q记录取ƾ信息,打印据Q取Ƒ֮成?/font> q是一个司I惯的业务Q从q个业务中,我们提取出如下的元素信息Q?/font> 对象Q̎P交易Q打印机Q?/font> 行ؓQ核对卡号和密码Q更改̎户余额,记录取款交易信息Q打印票据; 规则Q一ơ最多只能取2000元,一天最多只能取5ơ,取款金额大于50000需要预U; Ҏ以上的分析,我们很容易{变成源代码。很多时候,我们遇到的业务比q个要复杂得多,目的规模也很大Q这p求我们具备全局观,控制全场Q运{帷q,仔细分析Q辅助徏模,辑ֈ最理想的效果?/font> ——作者:李赞U?Qlifenote@21cn.comQ,转蝲请保留版权!
下蝲地址Qhttp://download.csdn.net/detail/lifenote/9445898
面 1
]]>
]]>五?/span>面向接口~程
]]>
]]>一、前a
二?font face="Arial" style="line-height: 33px; ">JavaEE体系架构
三、如何理解业务?
]]>
+ 查看帖子后浏览数自动+1
+ 完成引用回复,修改了回复蟩转逻辑(以前没有跌{到原始帖?
* 昄帖子时只在第一|C楼ȝ帖子,后面的页不再昄
* 分页标签d"上一??下一?功能
* 完善d子版块的界面,ȝ块用ajax动态读?br />
* 发现q解决主贴没有回复时昄???的BUG
* 解决如果只有一|分页标签昄不完整的BUG
2010-3-22
+ 开始加入异常处理机?q没做好(与动态代理的整合Z炚w?,来整合Spring后再d搞好.
+ d及回帖右下角?回复"链接指向帖子最底部?快速回?
* 解决阅读帖子及回帖时d新帖没有指定版块的BUG
* 优化快速回?解决不换行问?br />
2010-3-21
+ 完成帖子昄部分,包括回帖列表昄(q个׃整整6个小?
+ 使用ajax(jQuery)实现快速回?br />
* ojdbc14驱动有问?无法dCLOBcd的数?换成classes12问题解决
* 优化发新帖和回复帖子的页?br />
* l箋优化帖子列表的页面效?br />
* 优化标签样式,更适应览器窗口的大小
- 删除帖子标题后面?回帖"链接
2010-3-20
+ 帖子列表d了分?br />
+ 定义分页标签
* 重写了查询帖子列表的SQL语句,使用视图实现?前面使用HQL语句有BUG,分页时会出现问题
* |顶,_֍,推荐,锁定的页面呈C再用文?而是使用图标
* 优化了帖子列表的面效果
* eWebEditor-4.6~辑器不兼容chrome览?替换成kindeditor-3.4.1
- 删除了集合排序帖子列表的功能,q种做法有BUG,达不到正怋用的要求
1 Struts2与控制器
1.1 Struts2介绍与环境搭?br />
1.2 StrutsPrepareAndExecuteFilterqo?br />
1.3 Action,ActionSupport及配|?br />
1.4 Action与Servlet API (XXXAware, ActionContext, ServletActionContext)
1.5 Action控制逻辑
1.6 Action与请求参?br />
1.7 l果处理(result)
2 cd转换与输入验?br />
2.1 cd转换
2.2 输入验证
2.3 fielderror标签
3 截拦?br />
3.1 截拦器的作用和意?br />
3.2 截拦器的定义与配|?br />
3.3 默认截拦器分?br />
3.4 截拦器栈
3.5 截拦器示?讉K控制
4 ONGL与标{ֺ(1)
4.1 ONGL
4.2 Struts2标签分类
4.3 控制标签(if, elseif, else, iterator, append, merge, generator, subset, sort)
4.4 数据标签(bean, param, date, debug, include, set, url, push)
5 标签?2)
5.1 表单标签(单标{? checkboxlist, combobox, datetimepicker, doubleselect, optiontranserselect, select,
radio,updownselect)
5.2 Ajax标签(div, a, submit, tabbedPanel)
6 Struts2高
6.1 异常处理
6.2 国际?br />
6.3 文g上传与下?单文件与多文件上?
6.4 与Spring整合
eclipseq_允许我们通过插g扩展出另一个插Ӟ与^台紧密集成ؓ用户提供更好的体验,本文向您阐q如何向视图和编辑器中添加动?span lang="EN-US">(上下文菜?span lang="EN-US">)Qƈ且允ؓ您自己定义的视图和编辑器d其他新的动作。文中的每一个示例将详细的向您展C每一U不同应用的特征?/span>
上面的图片显CZ插g中能d动作的众多区域:
1?span style="font: 7pt 'Times New Roman'"> 在视囑֒~辑器中d上下文菜?span lang="EN-US">
2?span style="font: 7pt 'Times New Roman'"> 在视图上d工具栏和下拉菜单
3?span style="font: 7pt 'Times New Roman'"> 在工作台H口的主工具栏和菜单上添加动?span lang="EN-US">
本文对上面的种U进行演C,q过实例形式向您详细讲解?span lang="EN-US">
我们假设您有插g开发的基础Q如果想获得?span lang="EN-US">eclipseq_上开发插件的更多信息Q请阅读Jim Amsden的入门文?#8220;Your First Plug-in”Q该CZ的运行结果,L?#8220;running the examples”?/span>
在上下文菜单中添加动?/span>
可以在视囑֒~辑器的上下文菜单中d动作q紧密集成,比如Q?span lang="EN-US">VCM插g在存在的视图?span lang="EN-US">Navigator?span lang="EN-US">Packages中添加了许多新的动作Q对资源q行版本理.Z在上下文菜单中添加新的动?span lang="EN-US">,eclipse提供了插件点org.eclipse.ui.popupMenus,包括两种cd的动?span lang="EN-US">,卌d到视图或~辑器的上下文菜单中,也能为指定的对象cdd上下文菜单。下面的三个CZؓ您详l说明?/span>
CZ一Qؓ默认的文本编辑器d新的动作
让我们看看如何向默认的文本编辑器d一个动作:
?span lang="EN-US"><viewerContribution
id="org.eclipse.ui.articles.action.contribution.popup.editor"
?span lang="EN-US"> targetID="#TextEditorContext">
?span lang="EN-US"> <action
id="org.eclipse.ui.articles.action.contribution.editor.action1"
label="Editor Action 1"
icon="icons/red_dot.gif"
?span lang="EN-US"> menubarPath="additions"
?span lang="EN-US"> class="first.plugin.action.ContextMenuAction">
</action>
</viewerContribution>
</extension>
targetID属性(②)指定上下文菜单所依附的目标视囑֒~辑器标识符Q官Ҏ档提供了可用的标识符列表Q如果您讄的标识符不存在,则上下文菜单不被注册。一个视图或~辑器可以有不只一个上下文菜单?span lang="EN-US">
actionQ③Q标记用于定义一个动作,id是该动作的标识符Q?span lang="EN-US">label?span lang="EN-US">icon表示菜单的昄文本和图标,icon为可选项?span lang="EN-US">menubarPathQ④Q属性指定动作菜单项的位|,从上下文菜单的根开始,action被d到这里。在本示例中Q?#8220;additions”其实?span lang="EN-US">org.eclipse.ui.IWorkbenchActionConstantscȝ一个常量|MB_ADDITIONSQ。添加的动作独立成组Q在上述情况下,如果menubarPath属性没有指定,工作台将首先d?#8220;additions”l中Q如?span lang="EN-US">additions不存在,动作被dC下文菜单的末?/span>
classQ⑤Q属性是一个菜单项被用户选中后将要执行的动作的类Q如果是~辑器的上下文菜单,该类必须实现org.eclipse.ui.IEditorActionDelegate接口Q如果是视图的上下文菜单Q则实现org.eclipse.ui.IViewActionDelegate接口。有一个非帔R要的情况是只有当用户选择了菜单项后该cL被工作台加蝲Q这意味着很多初始化的逻辑必须?span lang="EN-US">XML文g中描q。一旦该c被工作台加载,该类可以控制动作的启用与禁用。如果动作被选中Q将执行run()Ҏ完成需要的功能?/span>
下面是一个典型的实现c:
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
}
@Override
public void run(IAction action) {
MessageDialog.openInformation(null, "", "我是上下文菜?span lang="EN-US">");
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
}
每一个标志都使用一个以1开?/span>,后面全部?/span>0的二q制表示,长度不限,?/span>:
int x = 0x8 -> 1000
int y = 0x10 -> 10000
int z = 0x20 -> 100000
叠加的结果是:int a = x | y | z. -> 111000
判断是否?/span>x标志:
if((a & x) == x) -> 如果q回gؓ?/span>,表示实包含?/span>x标记.
代码:
int x1 = 0x8;
int y1 = 0x10;
int z1 = 0x20;
int rrr = x1 | z1;
if((rrr & x1) == x1)
{
printf("?/span>x标记"n");
}
if((rrr & y1) == y1)
{
printf("?/span>y标记"n");
}
if((rrr & z1) == z1)
{
printf("?/span>z标记"n");
}
CZ:
package com.aptechb;
import java.util.Scanner;
/**
* 应用一:保存状?br />
* <hr>
* 比如在描qC个h的爱好时,会用多个复选框标识出选项:阅读,看电?交际{?如何保存到数据库比较好呢?
*/
public class Binary {
public static void saveStatus() {
int status = 0x0; // 用于保存爱好,如果爱好目很多,可以用long{?每一位保存一个爱?
// 假设:
// 0000 0000 0000 0000 0000 0000 0000 1111
// 从低位到高位分别保存阅读,交际,电媄,喝咖??br />
// 0000 0000 0000 0000 0000 0000 0000 1(喝咖?1(电媄)1(交际)1(阅读)
// 如果?表示没有该爱?
// 比如我的爱好?电媄,阅读,?br />
// status = 0x5;
// ?x5?x1?amp;q算,如果l果?x1,则表C阅L我的爱好
// ?x5?x10?amp;q算,如果l果?x10,则表CZ际是我的爱好
// ?x5?x100?amp;q算,如果l果?x100,则表C电影是我的爱好
// ?x5?x1000?amp;q算,如果l果?x1000,则表C喝咖啡是我的爱?br />
//接收输入
System.out.println("误入对应数?\n1.阅读\n2.交际\n4.电媄\n8.喝咖啡\n\n0.l束输入\n");
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
while(input != 0){
status |= input;
input = scanner.nextInt();
}
System.out.println("您输入的l果计算后的二进制表C?" + Integer.toBinaryString(status));
System.out.println("\n-----------------\n您的爱好?");
for (Hobby hobby : Hobby.values()) {
if ((status & hobby.getFlag()) == hobby.getFlag()) {
System.out.println(hobby);
}
}
}
public static void main(String[] args) {
saveStatus();
}
}
package com.aptechb;
public enum Hobby {
阅读(0x1), 交际(0x2), 电媄(0x4), 喝咖?0x8);
private int flag;
private Hobby(int flag){
this.flag = flag;
}
public int getFlag() {
return flag;
}
}
&:同ؓ1l果?,否则?
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0100
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0000 -> 0
4 | 8
|: 一方ؓ1l果便ؓ1,否则?
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 1000
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
~9
~:取反,0变成1,1变成0 ->要得到最后结果必d计算补码(反码+1)
0000 0000 0000 0000 0000 0000 0000 1001
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 0110 ->得到反码,下面回算补码(卛_1取反)
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 0101 ->-1
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010 ->取反l果?0,取反码的时候以1开?即ؓ负数,所以结果ؓ-10
下面?10在java中的表示:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0101 +1
1111 1111 1111 1111 1111 1111 1111 0110
8 ^ 23
^:异或, 不同?,相同?
0000 0000 0000 0000 0000 0000 0000 1000
0000 0000 0000 0000 0000 0000 0001 0111
---------------------------------------
0000 0000 0000 0000 0000 0000 0001 1111 -> 31
4 << 3
<<:左位U?4的二q制向左Ud3?双?
0000 0000 0000 0000 0000 0000 0000 0100
---------------------------------------
0000 0000 0000 0000 0000 0000 0010 0000 -> 32
5 >> 9
>>:右位U? 5的二q制向右Ud9?左边?
0000 0000 0000 0000 0000 0000 0000 0101
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0000 -> 0