??xml version="1.0" encoding="utf-8" standalone="yes"?>
class Cache{
static {
initializeIfNecessary();
}
private static int sum;
public static int getSum(){
initializeIfNecessary();
return sum;
}
private static boolean initialized = false;
private static synchronized void initializeIfNecessary(){
if(!initialized){
for(int i=0; i < 100; i++ )
sum+=i;
initialized = true;
}
}
}
pubic class Client {
pubilc static void main(String[] args){
System.out.println(Cache.getSum());
}
}
E序是一个典型的半开循环Q应该打印出1?9的整数dQ即4950Q但E序q行打印的ؓ(f)9900Q是预期值的两倍?/p>
E序在确保sum在用之前就已经初始化这个问题上Q遇Cȝ。程序结合了惰性初始化和积极初始化Q还使用上了同步Q以保~存在多U程环境下也能工作,但程序无法完成预期的工作?/p>
E序输出打印是控制标志initialized 的问题。qq上一个朋友问的一本书里的问题Q我也找到那本书了,是惰性初始化Qstatic初始化)的问题,控制标志在static完成初始化后又重新被构造器赋gؓ(f)falseQ初始化d值的Ҏ(gu)被执行了两次?/p>
1.|络体系的结构ؓ(f)?wi)状拓扑l构Q主要依据该公司的组l机构徏立,该公司组l机构分为d怸U,分公怸U,县公司一U以?qing)直接负责煤炭运销具体的工作的公司一U。网l体pM此而徏Q也分ؓ(f)四|络?/font>
2.使用一套c/s体系的YӞ完成基础数据的收集,q定时上报到县公司或者直属的分公司,然后数据汇d析后通过q套软g提交Q统一储存到d司数据库服务器?/font>
3.Ҏ(gu)该行业的业务Q每q全省的煤炭q量Q特别是通过铁\渠道的运量,在年初通过{订的全q合同决定,该年的业务也以此q量为准?/font>
q套软g成型?002q_(d)在当时的条g限制下这是一套最为有效的软g工作体系了,但也有其~陷Q?/font>
1. 管基础数据攉大都已经为通过?sh)子U量pȝ实现自动数据提取Q但在上报过E中Q仍有可能对数据q行改QY件ؓ(f)此专门增设了一个子功能pȝQ但使用情况不容乐观Q收效甚微?/font>
2. 数据l一存储在d司数据库服务器中Q方便管理,在最初的设计中,数据库没有设计负载分以?qing)镜像备份的{处理,随着pȝ的用,数据量的增加Q数据库负蝲增大QY件反应速度来慢?/font>
q个~陷在今q年初运量提报和每个月初的各个分公司的运量提报中ؓ(f)明显Q数据库出现多次当机情况Q处理过多次Q但收效不明显,在用高峰期需要注意数据库的用情c?/font>
q个pȝ的网l部分就写这么多吧,毕竟不太熟?zhn)Q还是掺杂了软g的非|络部分Q?-)。下一开始写q个软g的web架构部分Q主要是mvc框架和dao框架部分?/font>
The Architect (dedicated non-programming technical decision maker and problem solver for business): 架构师(专用非编E技术决{者,业务问题解决者)
|
完成该系l后Q所完成的后期维护工作中Q最大的以部分就是数据统计查询分析功能的完善了?/font> pȝ软g框架提供了一套报表生成系l来完成数据l计查询的功能。这条报表生成系l可以生成excel和pdf两种格式的统计报表?/font> q个pȝ使用报表的流E大致ؓ(f)Q?/font> 1.每个功能都提供一pd的报表,在Y件中q些报表以二l字W串数组的数据格式保存,每个字符串数l对象包括该报表的唯一键|报表名称Q报表条件提供页面以?qing)生成该报表的具体的JavacR?/font> 2.选择需要生成的报表Q系l将该报表的唯一键g入统一的报表控制类Q首先是跌{到生成该报表的条仉面,按照功能划分报表的主要原因就是每个功能的报表条g一_(d)可以使用l一的控制类?/font> 3.提交条g后,l一的报表控制类?x)调用该报表的生成?q些c需要承统一的接?提供了一个统一的方法,q回数据cd为Vector集合的对象,q个Vector对象容器数据对象要求为:(x) 两个Vector对象Q一个ؓ(f)表头VectorQ一个ؓ(f)表体VectorQ这两个Vector对象中存储的数据为字W串数组对象?/font> 在具体应用中Q只要将数据填充到字W串数组中,再依ơ放入Vector中,报表框架?x)生成报表?/font> q个框架的一个确定就是只能接受字W串数组对象Q如果生成excel格式的报表,无法Ҏ(gu)生成的报表进行计,必须手动的将数据调整为数字型?/font>
|
大家喝的是啤酒,q时你入座了Q给自己倒了杯可乐,q叫低配|;l自己倒了杯啤酒,q叫标准配置Q给自己倒了杯茶_(d)q茶的颜色还跟啤酒一Pq叫木马Q给自己倒了杯可乐,q滴了几滴醋Q不仅颜色跟啤酒一P不冒热气q有泡Q这叫超U木马;你同事给你到了杯白酒Q这叫推荐配|? 人到齐了Q酒席开始了。你C个h喝了一口Q这叫单元测试;你跟旁边的h说哥们咱们随意,q叫交叉试Q但是他说不行,q杯要干了,q叫压力试Q于是你说那大家一h吧,q叫内部试Q这时候boss向全ZD杯,q叫公开试?/p>
菜过三EQ你׃跟他们客气了Q你向对面的人敬酒,q叫p2pQ他回敬你,你又再敬他,q叫TCPQ你向一桌h挨个敬酒Q这叫o(h)牌环Q你说只要是兄弟干了这杯,q叫q播?/p>
有一个hq来向这卓敬酒,你说不行Q你先过了我q关Q这叫防火墙。你的小弟们q来敬你酒,q叫一对多?/p>
酒过三E后,你也该活动活动了Q你一桌一桌的赎ͼq叫轮询Q你H然看见某一桌的漂亮mmQ走了过去,q叫优先U;你去了坐下来׃打算CQ这叫死循环Q你的老大举杯邀你过去,你只好走q去Q这叫激zM件?/p>
你向一桌敬酒,他们_(d)(x)“不行Q不行,我们都喝白的?rdquo;于是你也喝白的。这叫本地化Q你向boss敬酒Q可是boss被围hQ你只能站在外围Q这叫排队;你终于到了内_(d)心翼的向前一步,q叫讉K临界区;你拍照boss的肩膀说哥们咱们再喝已被,q叫界?/p> |
一个程序员对自q未来很迷茫,于是去问上帝Q?ldquo;万能的上帝啊Q请你告诉我Q我的未来会(x)怎样Q?rdquo; 上帝_(d)(x)“我的孩子Q你去问LippmanQ他现在领导的程序员的队伍可能是地球上最大的?rdquo; 于是他去问LippmanQLippman_(d)(x)“E序员的未来是NE序员?rdquo; q个E序员对q个未来不满意,于是他又去问上帝Q?ldquo;万能的上帝呀Q请你告诉我Q我的未来会(x)怎样Q?rdquo; 上帝_(d)(x)我的孩子Q你去问GatesQ他现在所拥有的胦产可能是地球上最多的?rdquo; 于是他去问GatesQGates_(d)(x)“E序员的未来是榨取E序员?rdquo; q个E序员对q个未来不满意,于是他又去问上帝Q?ldquo;万能的上帝啊Q请你告诉我Q我的未来会(x)怎样Q?rdquo; 上帝_(d)(x)“我的孩子Q你去问侯捷Q他写的计算Z的读者可能是地球上最多的?rdquo; 于是他去问侯捗?/font> 侯捷_(d)(x)“E序员的未来是诱惑E序员?rdquo; q个E序员对q个未来不满意,于是又去问上帝:(x)“万能的上帝啊Q请你告诉我Q我的未来会(x)怎样Q?rdquo; 上帝摇摇_(d)(x)“唉,我的孩子Q你q是别当E序员了?rdquo; |
该系lY件框架对sql操作q行了封装,q提供了一批API帮助客户E序员更为简便的q行数据库操作。这些api包括:
q个数据库框架还提供了一些方便编写代码的操作Q例如拼装sql语句Q提供了一个这L(fng)Ҏ(gu)QMakeUpcR代码如下:(x) java 代码
q个makeUpҎ(gu)?x)将sql语句D好,@表示数字占位Q?表示字符占位?/font> q个pȝ的数据库操作理大致是q样了,比较单,ȝ来说是对dbconncetion 操作q行了重新封装,方便客户E序员的使用?/font>
|
l护的这个Y件系l用了一个比较复杂的pȝ权限理pȝQ原本的设计是将用户对Y件的使用权限控制C最末的菜单,q根据公司组l机构的设计Q上U组l单位可以将自n所获得的权限l授权到自己的下U公司?/font>
Z授权权限的操作简单话Q不然每ơ都从几百个菜单选项中选择l该用户授权的菜单权限,恐怕这个权限系l管理员p崩溃了?-)Q权限管理系l将权限分ؓ(f)了权限组Q权限域Q基本权限管理?/font> 权限l和权限域的区别我至今没有太分的清楚Q郁闷中····在不多的使用当中Q主要是讄试用户的权限)感觉上这两种权限范围讄是评U的Q没有谁是谁的上U的关系Q不清楚当初Z么设|成q样Q我用的主要是权限域的设|?/font> l用h权下权限Q前提是已经有相应的权限域设|?/font> 1.权限域设|:(x)权限域需要相应的讄~码Qƈ选择该权限域包括的菜单权限?/font> 2.在设|好权限域后Q就可以直接该权限域授权到pȝ用户?/font> 权限理使用了数据库信息理Q现在用v来比较笨拙,不过׃最初的讄q于复杂Q如果用现在比较统一的xml文g配置Q可能用v来也不是很方ѝ?/font> 每个菜单权限w有一个自w的权限~码Q该pȝ的菜单全部分ZU,~码规范为:(x)一U菜单编码_二菜单~码_三菜单~码。这P在授权权限的时候可以直接将一U菜单授权,用户相应的也获得该一U菜单下所有功能的使用权?/font> 用户d成功后系l会(x)该用户的合法权限值压C个集合中Q放到sessin对象里?/font> 权限的控制在pȝ的页面和后台控制c都有实现。页面用了上一提到的面逻辑标签实现控制Q在昄该页面之前,控制cM用了个系l框架提供的公共权限控制cd该用L(fng)权限值压到页面g?/font> 在调用该功能之前Q控制类C(x)判断该用L(fng)权限Q有一个通用c,该功能的权限和当前的用户对象作为参C入,该类?x)判断在用户的权限集合中是否包括该权限,以决定是否l执行该功能程?/font> q个pȝ的权限管理部分就是这么多了,下一讲讲这个系l的数据库管理部分。维护的q个软gpȝ使用了一个比较复杂的pȝ权限理pȝQ原本的设计是将用户对Y件的使用权限控制C最末的菜单,q根据公司组l机构的设计Q上U组l单位可以将自n所获得的权限l授权到自己的下U公司? Z授权权限的操作简单话Q不然每ơ都从几百个菜单选项中选择l该用户授权的菜单权限,恐怕这个权限系l管理员p崩溃了?-)Q权限管理系l将权限分ؓ(f)了权限组Q权限域Q基本权限管理?/font> 权限l和权限域的区别我至今没有太分的清楚Q郁闷中····在不多的使用当中Q主要是讄试用户的权限)感觉上这两种权限范围讄是评U的Q没有谁是谁的上U的关系Q不清楚当初Z么设|成q样Q我用的主要是权限域的设|?/font> l用h权下权限Q前提是已经有相应的权限域设|?/font> 1.权限域设|:(x)权限域需要相应的讄~码Qƈ选择该权限域包括的菜单权限?/font> 2.在设|好权限域后Q就可以直接该权限域授权到pȝ用户?/font> 权限理使用了数据库信息理Q现在用v来比较笨拙,不过׃最初的讄q于复杂Q如果用现在比较统一的xml文g配置Q可能用v来也不是很方ѝ?/font> 每个菜单权限w有一个自w的权限~码Q该pȝ的菜单全部分ZU,~码规范为:(x)一U菜单编码_二菜单~码_三菜单~码。这P在授权权限的时候可以直接将一U菜单授权,用户相应的也获得该一U菜单下所有功能的使用权?/font> 用户d成功后系l会(x)该用户的合法权限值压C个集合中Q放到sessin对象里?/font> 权限的控制在pȝ的页面和后台控制c都有实现。页面用了上一提到的面逻辑标签实现控制Q在昄该页面之前,控制cM用了个系l框架提供的公共权限控制cd该用L(fng)权限值压到页面g?/font> 在调用该功能之前Q控制类C(x)判断该用L(fng)权限Q有一个通用c,该功能的权限和当前的用户对象作为参C入,该类?x)判断在用户的权限集合中是否包括该权限,以决定是否l执行该功能程?/font> q个pȝ的权限管理部分就是这么多了,下一讲讲这个系l的数据库管理部分?/font> |
q个软g架构使用的mvc架构包括使用自n一套页面逻辑Q标{型比较简单,包括逻辑判断标签、页面赋值标{֒循环list对象取值标{?
在执行完面hq回的页面没有规定,可以是jspQ也可以是html面Q用上一提到的Common对象跌{面Q方法ؓ(f)Qcommon.showPage("page")Ҏ(gu)Q因为没有该框架的这部分源代码,只能大概推测Q这个方法是d面Qƈ执行页面含有的逻辑标签和赋|一个方法可以多ơ用该Ҏ(gu)Q最后的执行l果是多个页面顺ơ显C,比如Q?/font> ![]() ![]() ![]() ![]() ![]() page1的页面代码:(x) ![]() ![]() ![]() ![]() ![]()
page2的页面代码:(x)
![]() ![]() ![]() ![]() ![]()
最后显C的面代码Q?/font>
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 面的逻辑标签很简单:(x)<if><else><endif>Q完成简单的面逻辑判断 在页面最l生成之前执行的代码Qcommon的showpageҎ(gu)?x)将标签作?f)java代码执行?/font> 面赋值标{ֆ法很单:(x)($value$)Qvalue获取的参数|使用$W号区隔Q可以和逻辑标签混合使用Q?/font> <if ($value$)==1>1<else>2<endif> 写法有些cM现在行的mvc开源框架?/font> 另一个常用的循环标签Q?lt;loop ($list$) ></loop> list为@环的集合对象。也可以同时循环多个list集合对象Q但前提是多个对象的集合大小相同Q不然就?x)出现数l溢出的错误?/font> 该mvc框架配合了一套js脚本库一同用,因此像一些常用的脚本Ҏ(gu)和mvc框架的一些特点结合v来用,js代码~写量减?/font> 表单提交参数验证有一套统一的方法,现在应该应用的很普遍了。在表单对象标签里增加一些属性,最后提交表单是调用l一表单验证Ҏ(gu)Q该Ҏ(gu)?x)读取该对象的属性,判断该对象值是否符合要求,包括判断复选框对象是否有选择对象Q例如在删除列表中的多个对象使用?/font> 在常用的查询列表和该列表的某个具体对象时Q脚本库提供了统一的方法:(x) 1、常用的页Ҏ(gu)Q首,NQ上一,下一,跌{到某一늚Ҏ(gu)Q只需要用脚本库中统一的方法,传入表单名称参数Qclass名称Qmethod名称Q蟩转到某一需要再传入面参数卛_Q不需在编写js代码?/font> 2. 查看某一条具体记录,Ҏ(gu)cM于翻|法,同样传入表单名称参数Qclass名称Qmethod名称表单名称参数Qclass名称Qmethod名称Q和该条记录的主键倹{?/font> 今天写到q里Q下一写写这个系l的权限pȝ?/font> |
今天ȝ一下这个系lY件用的pȝ架构?/font> q个软g使用的mvc框架有点cM于strutsQ我是在2005q开始接触java的,在维护这个系lY件之前用的mvc框架包括struts和webwork两种Q相比较之下Q与strtus更ؓ(f)cMQ或怹是因为strus中控制类部分也是直接操作request吧?/font> q个mvc框架自n的特点大致有q么几个Q?/font> 1.q个mvc框架没有使用配置文gQ在webconfig文g中配|有一个L的servletQ负责接受页面提交的hQ进行{发?/font> 面提交h方式是直接请求这个LservletQ在提交h到这个servlet的同Ӟ提交两个固定的参敎ͼ分别是class和method参数Q通知servlet请求{到相应的c,q调用参C的方法?/font> 2.Lservlet调用的类为普通的javac,没有Ҏ(gu)的要求,比如struts中要l承action父类Q方法写法有严格的要求,为静态方法,不允许有q回参数Q接受的参数也固定,如下Q?/font> public static void expMethod(HttpServletRequest req, 因ؓ(f)没有使用配置文gQ方法调用结束后q回到哪个页面,在该Ҏ(gu)中直接赋D面的具体\径。这样修改v来有点复杂,需要重新编译类Qƈ且在调试的时候,如果需要找到该h调用的页面的具体路径Q必L到这个类和方法,不如使用配置文g一目了然?/font> 3.获取面上的参数Q这个框架提供两U不同的选择?/font> 框架提供一个Common的对象,该对象封装了对request的部分操作,提供了一?font face="Arial">RequestHash对象Q该对象Z个Vector集合Q页面表单提交的数据已经装到该集合中,参数获取方式为,创徏一个字W串数组Q将需要获取的参数名称赋值到该数l中QCommon的toDataҎ(gu)q回与字W串数组相对应的参数|如下 Common common = new Common(req,res);//req request对象Qres为response对象 String[] keys = {"param1","param2"}; 此时values数组中,values?】中的gؓ(f)param1表单|相应的ؓ(f)param2的表单倹{?/font> 如果需要获取一个数l|request的操作是getParamValuesҎ(gu)Q例如表单中的复选框|RequestHash对象提供了类grequest的这个操作?/font> reh.getParameterValues("params"); 4.为显C页面赋g使用了Common对象?/font> a?nbsp;赋值简单的字符串对象:(x)common.addString("showParam", param); W一个参Cؓ(f)面获取该参数g用的名称Q第二个对象名称?/font> b、一ơ性赋值多个字W串对象Q?font face="Arial">common.addArray(keys, values); 相对应的Qkeys为页面获取参数值的名称Qvalues为参数的倹{?/font> c、赋g个复杂的对象Q例如自定义对象或者一个List对象Q?/font> common.addObject("voname", vo); 用法一致?/font> 该框架提供一套通用的js脚本库和一些统一的赋D则,例如d用户对象名称Q子pȝ名称和提C名Uͼ因此common对象赋g提供了一些特D的Ҏ(gu)Q只接受参数的|参数名称为已定义名称Q因此在为页面赋g要注意不要与pȝ框架已定义对象名U冲H?/font> 今天写到q里Q下一写写这个mvc框架的页面逻辑Q标{还有这个脚本库的内容吧?/font> |