这是一个幸福的时代,特别是作为一个java程序员(感慨一下而已,这并不意味着我所讲的内容仅适用于java)。
基于我个人的一贯风格,我不准备采用大量技术术语和官腔讲述这次的主题:工厂模式应用与发展。今时今日提到工厂模式,相信绝大部分的人都已经对这个词汇有所了解(恩恩,注意我的用词,我没说“对他的概念、含义和用途有所了解”)。
那么,在开始进入正题之前,我们先回顾一下工厂模式的作用(我不准备列举在这,自己想想)。
OK,下面开始我的讲述,请大家耐心点(是的,我怕有人半途而废;噢,再啰嗦一下,重点在示例代码)!
2 石器时代 2.1 痛苦的开始据说原始人类所使用的工具的产生有很大的随机性。例如这样的情况:最开始大家吃肉肉,一窝蜂扑上去撕咬;后来可能觉得不卫生(也可能是觉得咬起来牙齿疼,也可能是觉得自己每次都咬不过别人),于是按自己牙齿的模样,找些放大比例的动物牙齿(或者石头),尝试着割肉,发现挺好使的,于是工具产生了。
代码界同样有这样的事情发生(产品的童鞋要我们为每个名人设计一句话):
...
if(name == "bill gates") {
out.println("Doyou like Win8?");
} else if(name == "Stevejobs") {
out.println("sonice iPhone.");
} else if(name =="Zuckerberg") {
out.println("Welcometo facebook.");
} else {
...
看上去这样没有什么不妥,是不是?
然而,事情远远没有这么简单。
“花心”的产品童鞋总会给我们提点新要求,有木有?他们很可能觉得每个名人都应该充分体现自己的个性,要求为他们增加肢体语言什么的。有木有?
好吧,我们的痛苦从此开始了……
2.2 梦想我猜想,原始人类估计不像我们现在这么贪婪,他们在寻找牙齿与石头的时候,很可能是在想:老天爷,赐我一把割肉神器吧(而不是:老天爷,赐我一具不用吃饭的肉体吧)!当然,在得到神器的那一天来临之前,我们的原始先祖们,还是不得不继续寻找更锋利的牙齿与石头。
是的,代码界也发生了一些变化:
...
public void billgatesShowtime() {
out.println("Doyou like Win8?");
out.println("Andput up his hands.");
}
...
if(name == "bill gates") {
billgatesShowtime();
} else if(name == "Stevejobs") {
stevejobsShowtime();
} else if(name =="Zuckerberg") {
zuckerbergShowtime();
} else {
...
噢,看上去确实好多了,我们可以让老比尔给大家举手示意了,不是吗?
是的,你兴奋了很久,甚至晚上睡觉都带着醉人的笑容。
顺便还做了个梦:你站在云端,觉得孤独,便心血来潮的说:要有比尔,于是比尔出现了;你又说:要有乔布斯,于是乔布斯出现了;你接着说:要有马化腾……
3 青铜器时代在这之前,大概还有一个短暂的后石器时代,在这个阶段里有一种做法,那就是直接在if语句里,写上newXxx(),然后调用Xxx类的特定方法。但我们认为这不具备代表性,所以,让我们大家一起忽视他吧。
3.1 痛苦的持续哦,时光悠悠,石器时代过去了。
我们的先祖仍在期待神器,仍在寻找更锋利的割肉工具……
代码界,你跌坐在屏幕前,嘴里念念有词:果然应验了,我TM说“要有马化腾”干毛啊?
是的,可恶的产品童鞋说了,要把马化腾加入这个名人行列,同时还要抱一只企鹅。
在一万只草泥马奔腾过后,你从泥泞的草原上站起来,向着太阳的方向,前进前进前进进……
3.2 曙光好在先祖们发现了青铜,相比之下,青铜比石头和牙齿更靠谱,还能自己决定着割肉工具的外形(嚯嚯,越拉风越好哇)。
代码界里,你也在进步(java程序员嘛,幸福哇):
...
interface People {
publicvoid showtime();
};
...
class Xiaomage implements People {
publicvoid showtime() {
out.println("Fuck360.");
out.println("Doyou like QQ pets?");
}
};
...
class FamousPersons {
privateMap<String, People> peoples = new HashMap<String, People>();
publicFamousPersons() {
peoples.put("billgates", new Billgates());
peoples.put("stevejobs", new Stevejobs());
peoples.put("马化腾", new Xiaomage());
…
}
publicPeople find(String name) {
returnpeoples.get(name);
}
};
...
FamousPersons famousPersons = newFamousPersons();
People people =famousPersons.find(name);
if(people != null) {
people.showtime();
}
...
咦?代码好像变多了,但我们为你自豪;因为到此时,你已经真正实现了工厂模式。
是的,不管是基于OO思想,还是逻辑结构上,代码都有了很大进步;你再也不同担心产品给你增加名人,不用担心名人的各种性格和癖好。
于是你睡了个好觉,但你诚惶诚恐,不敢做梦。
4 铁器时代 4.1 愤怒的燃烧青铜的冶炼和锻造技术已经达到了巅峰。吴钩、鱼肠、干将、莫邪……,喔噢,这已经是割肉神器了不?
仿佛从现在开始,担心先祖的生活已经有点多余了。
是的,因为代码界里,名人的数量已经达到了10000+(名人的各种性格和癖好,也让你震惊到了无以复加)。
你已无数次的被这份名单中人从梦中惊醒,你的生活开始变得枯燥,你的世界渐渐黑白。仿佛你的生活就是为了这份名单而存在(有的名人改名了;有的名人换公司了;有的名人变性了,擦啊啊啊……)。
FamousPersons已经被神兽草泥马践踏了无数次,而且变成了工程里面个头最大的源代码文件;每次你从peoples里找名人的时候,这份超长的名单几乎亮瞎了你的钛合金眼。
一次次的代码更新,SVN上的代码号直接蹦到了5位数;当你部署代码时,看着运维冒着幽光的怨恨眼神,你叔忍了,但你婶认为绝不能忍;于是你发粪图墙……
4.2 福音有一天,某位先祖发现自己的神器青铜大剑居然被一柄小匕首斩断了,擦啊,这是什么玩意?超神器?
呵呵,猪脚模式开启了,在代码界,你也发现了“神器”。
你先把这个名单弄到了数据库里(表名famous_persons):
然后,你用这把“神器”大刀阔斧把臃肿的FamousPersons剁的稀烂。
再然后,你重造了一个轮子:
...
class FamousPersons {
privateConnection conn = null;
...
privateString findClass(String name) {
StringclassName = null;
Statementstmt = conn.createStatement();
ResultSetresult = stmt.executeQuery("SELECT * FROM famous_persons WHERE Name="+ name);
if(result.next()){
Apache Shiro官网:http://shiro.apache.org/
概念:
shiro是一个强大灵活的开源安全框架,可以干净利落的处理认证、授权、企业会话管理和加密。
shiro的首要目标是简单和易于理解。安全有时候是非常复杂令人头疼的问题,shiro隐藏了复杂
的细节,暴露了简介直观的API来简化开发者使他们的应用程序更安全的努力。
功能:进行用户认证、执行访问控制、单点登录、Remember Me服务
安全的一些概念:身份认证、授权、会话管理、加密被认为是构成应用安全的基础要素。
身份认证,就是验证用户身份,典型的“登录”过程就是身份认证的过程。
授权:也就是访问控制(ac),也即某用户可以可以使用应用的哪些功能?
会议管理:管理用户特定的会话,即使在非Web或EJB应用。
加密:保持数据的安全使用的加密算法,同时仍然易于使用。
对于Session,在WEB应用中它基于HttpSession,而一般应用中默认使用企业会话管理。shiro的Session
用起来和HttpSession差不多,并且使用它不需要Http环境。
在最高的层次上讲,shiro主要有三个主要的概念,它们分别是Subject、SecurityManager和Realms。
1、shiro使用Subject这一概念来描述当前用户,‘User’这个词通常隐含的指一个人,但是Subject可以是一个
人也可以代表第三方服务,守护账户,定时作业,或者其他类似的与软件交互的事物。
2、所有Subject实例都与一个SecurityManager绑定,当你和一个Subject交互时,所有交互都会通过SecurityManager
转换为特定Subject的交互。
SecurityManager是shiro架构的核心,它扮演‘保护伞’对象的角色,与其他内部安全组件一起构成对象图的核心。
SecurityManager及其内贸部对象图一旦被应用配置,它基本上就被放在一边不再被程序员使用了,
开发人员基本上总是在与Subject的相关API打交道。它在幕后支持Subject的安全操作。
3、Realms在shiro与你的应用程序的安全数据之间充当着桥梁或者说是连接器的作用。
从这种意义上讲,Reaml就是一个特定的安全DAO,它为shiro提供所需的数据。
在配置shiro时,你必须为认证、授权指定至少一个可用的Realm。
shiro提供了现成的Realm连接到LDAP、关系数据库(JDBC)、ini和properties文件等。
用户可以使用自己的Realm
Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权。使用 Shiro,您就能够为您的应用程序提供安全性而又无需从头编写所有代码。
Shiro 的 Session 对象允许无需 HttpSession
JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。JavaServer Faces 还引起了广大 Java/Web 开发人员的兴趣。“企业开发人员”和 Web 设计人员将发现 JSF 开发可以简单到只需将用户界面 (UI) 组件拖放到页面上,而“系统开发人员”将发现丰富而强健的 JSF API 为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构建的模型-视图-控制器 (MVC) 设计模式集成到它的体系结构中,确保了应用程序具有更高的可维护性。最后,由于 JSF 是通过 Java Community Process (JCP) 开发的一种 Java 标准,因此开发工具供应商完全能够为 JavaServer Faces 提供易于使用的、高效的可视化开发环境。
本文讲述的内容是JSF。首先给不熟悉的读者们进行一下简单的JSF入门介绍:JSF是java web 的标准,可能会取代jsp 时代。JSF直译过来就是Java Web应用的用户界面框架。
JSF提供一套API以及标签库,用来创建页面表单以及复杂的界面元素
JSF使得编写表单提交的代码更加简单,这些代码可以响应那些不同的按钮提交,改变某些值或某些用户的选择等等
◆Managed beans:使得JSF简化了处理请求参数的方法
◆EL(Expression Language):JSF有一套表达式语言用来访问java bean的属性以及集合元素等。
◆提供表单域类型转换以及验证
◆特有属性
◆UI组件模型
JSF提供一套丰富灵活的组件模型,包括:
◆一套UIComponent类,定义UI组件的状态和行为。
◆呈现模型:定义如何用不同的方式来呈现组件
◆事件和监听器模型用来处理组件的事件。
◆转换模型:进行数据转换
◆验证模型:如何验证数据的合法性
JSF入门:数据转换模型
当一个组件绑定到一个对象上之后,对于组件数据来说,总共有两个视图:
一个是模型视图:从这个角度去看,数据表现为java对象的类型,如int ,long,Date等等
一个是呈现视图:从这个角度去看,数据表现为一种可以被人读取或修改的形式。比如一个Date类型,可能被展现为一个yyyy-MM-dd格式的字符串,或者是三个字符串,分别代表年、月、日。
可以定义自己的转换器来转换数据。
JSF入门:事件与监听器模型
事件:值改变事件、动作事件、数据模型事件。
值改变:比如输入框的值被更改、选中了checkbox等
动作事件:点击按钮或超链接
数据模型事件:UIData组件的一行被选中的时候触发这个事件。
JSF入门:导航模型
Navigation-rule,可以包含一个from-view-id和多个navigation-case
每个navigation-case中,主要包括转向的页面。
From-view-id : 当前页面
From-action:从哪个action方法
From-outcome:从哪个逻辑名称
To-view-id:转向哪个页面
导航解决的问题是:从哪里到哪里。一句话来说就是:从from-view-id页面,当from-action方法被调用而且其返回值是from-outcome的时候,转向to-view-id页面。
【编辑推荐】