??xml version="1.0" encoding="utf-8" standalone="yes"?> 本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/zhaoyu_1979/archive/2011/03/16/6254021.aspx
]]>
6.发扬团队协作_Q提高整体测试交叉测试意识,U极ȝ开发一般性类库函敎ͼ提供l大家调用。分享成功经验。避免一个h孤军开发,愁眉苦脸的编写程序。共同攻克业务技术难题,苦中有乐?br />
7.力求高质量高效的完成开发模块,不要ȝ角尖Q经怺,不懂问。注意不要把问题复杂化,惛_Ӟ自己跟自己制造困难。如果问题越来越复杂Q越开发代码越没头l就立即停止~写Q回到问题的原点重新考虑或跟大家交流听听别h的意见?br />
8Q在解决技术问题上Q如果是关键问题Q坚决研IӞ要彻底搞明白。与目相关不媄响全局的问题,可以Ҏ(gu)实际情况优先U放低一U。针寚w点业务复杂的问题Q先做外围知识技术准备,扑և关键点,先易后难分步骤逐渐深入的去解决。最后将其诏I成一个整体?br />
9.l常查看别h代码Q吸取别人的l验Q充实自己。我们的知识U篏主要来自别hQ主要在当前目。取之于别hQ受益于自己。受益于目?br />
10Q善于利用零星时_(d)比较已经做过的功能模块。不断的整理Q优化已l开发过的代码。发现Bug?qing)时修正Q精益求_?/p>
]]>
q入该网? http://java.sun.com/javase/downloads/index.jsp (或者直?a target="_blank">点击下蝲)如下?
选择 Download JDK 只下载JDKQ无需下蝲jre.
(2)eclipse下蝲
q入该网? http://www.eclipse.org/downloads/ (或者直接点M?BT下蝲 HTTP下蝲) 如下?
我们选择W一?即eclipse IDE for java EE Developers)
(3)下蝲Android SDK
说明: Android SDK两种下蝲版本Q一U是包含具体版本的SDK的,一U是只有升工具Q而不包含具体的SDK版本Q后一U大?0多MQ前一U?0多M?/span>
完全版下?/a> (android sdk 2.1 r01) 升版下?/a> (使用q个Q本例子是使用q个q里面不包含具体版本Q想要什么版本在Eclipse里面升p)
?软g安装
(1)安装jdk 6u19 安装完成卛_Q无需配置环境变量
(2)解压eclipse eclipse无需安装Q解压后Q直接打开p
(3)解压android sdk q个也无需安装Q解压后供后面?/span>
(4)最l有三个文g夹,如下?
?Eclipse配置
1 安装android 开发插?/span>
(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare 出现如下界面:
点击 Add按钮,出现如下界面
输入|址: https://dl-ssl.google.com/android/eclipse/ (如果出错Q请httpsҎ(gu)http)
名称: Android (q里可以自定?
点击OKQ将出现如下界面
点击 Next按钮 Q出现如下界?
点击Next按钮Q出现如下界?
选择 I accept the terms of the license agreements 点击Next,q入安装插g界面
安装完成后,出现如下界面
点击Yes按钮Q重启Eclipse
2 配置a(chn)ndroid sdk
(1)点击菜单window->preferences,q入如下界面
选择你的android SDK解压后的目录Q选错了就?x)报错,q个是升U工P目前q没有一个版本的SDK
Q?Q升USDK版本,选择菜单 window->Android sdk and avd manager 出现如下界面
选择update all按钮Q出现如下界?/span>
选择左边的某一,点击accept表示安装Q点击reject表示不安装,我这里只选了SDK 2.1 和samples for api 7 , 自己可以L自定义,定后,选择install按钮Q进入安装界面如?
安装完成如下:
(3)新徏AVD(android vitural device) 和上面一Pq入android sdk and avd manager,选中Vitural Devices 在点击New按钮
点击New按钮后,q入如下界面:
名称可以随便取,target选择你需要的SDK版本QSD卡大自定义,点击 Create AVD,得到如下l果
如上昄创徏AVD完毕
3 新徏Android目
(1)选择菜单file->new->other q入如下界面:
选择新徏Android Project目Q点击Next按钮Q进入如下界?/span>
名称自定义,应用E序名自定义Q报名必d含一个点以上Qmin SDK version里面必须输入整数
点击Next出现如下界面:
? 若有错误? Project ... is missing required source folder: 'gen' ,则将gen->Android.Test->R.javaq个文g删掉QEclipse?x)?f)我们重新生成q个文gQƈ且不?x)报错?/span>
(3)配置q行
右键目->Run as -> Run Configuration q入如下界面:
该界面,点击Browse 按钮Q选择你要q行的项?/span>
选择Target切换C下界?/span>
该界面选择q行的AVDQ将AVD前面的方框设|ؓ(f)选择状态?/span>
(4)试目q行
右键目名称->run as ->Android Application 卛_启动q行该AndroidE序Q如下所C?
正在q入
试E序q行l果
?l束?/span>
xQandroid开发环境搭建完毕,有问题请留言。在q里要注意,我这里只是下载了android sdk r4升工具Q没有下载具体的SDKQ而是通过在Eclipse里面的Android Sdk理工具升的,你也可以直接下蝲具体的SDK版本Q如: Android sdk 2.1 r1 上面有这个的下蝲链接Q但我Q务用升工具更好?/span>
string testString;
public string TestString
{
get { return testString; }
set { testString = value; }
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
if (OkClicked != null)
{
TestString = txtUserInfor.Text;
OkClicked(this,new EventArgs());
}
this.DialogResult = true;
}
public FatherControl()
{
InitializeComponent();
childWindowDemo.OkClicked += new EventHandler(childWindowDemo_OkClicked);
}
void childWindowDemo_OkClicked(object sender, EventArgs e)
{
tbInfo.Text = childWindowDemo.TestString;
}
private ChildWindow1 childWindowDemo = new ChildWindow1();
private void Button_Click(object sender, RoutedEventArgs e)
{
childWindowDemo.Show();
}
完毕?br />
q行Q点ȝH体按钮Q弹出子H体。在子窗体的输入框中输入内容Q点ȝ认后关闭子窗体,同时子窗体的数据更新到父H体的输入框中?/p>
一Q?nbsp; 好的~程?fn)?/p>
1. 写程序前打个草稿可以在心里,最好在U怸Q目的要从整体上考虑E序的实现?/p>
如果公司采用建模的方式,有徏模工Prose Qvisio Q那是最好不q的了?/p>
2Q?nbsp; 注意休息Q不要浪费自已的休息旉Q用M自已的时间不但会(x)写出的代码因为注意力不集中而会(x)常常出现代码的质量有问题Q逻辑常出?/p>
3Q?nbsp; 要善于收集相关的专业开发上的资料,以便以后能更快更好的解决问题目。提倡公司能提供内部知识N的工具Q如知识论坛Q内部即时聊天器Q;提倡公司内部有技术资料的׃n库,提高解决问题的能?
4Q?nbsp; 提高Ҏ(gu)写的模块的相兛_局把握能力Q在写程序中要最好先详细设计后再发布.
5Q?nbsp; 要学?x)与他h沟通如非工E师Q学?x)沟通的不同方式Q提高沟通的效率?/p>
二. 不同的目标不同的知识重点
(一Q?nbsp; 目标Q程序员
职责Q根据详l设计文档,或根据高U程序员的设计进行相关的开发?/p>
1Q?nbsp; 要学?x)看相关的需求文档及(qing)详细设计文档?/p>
注意Q你必须要通过阅读q些文档把握住其中的重点Q关键点Q相x漏点
2Q?nbsp; 如果公司里会(x)用UML来相互的沟通,q时你必要深刻理解UML 的相关知识,一定要注意千万不要对UML图一知半解的情况下,q写代码,那样?x)错的很惨?/p>
3Q?nbsp; 学好对应的计机语言的基知识Q如Q程序的语法Q关键点Q易错点Q对应的出错如何出理Q如何才能把对就的程序写的键壮一?/p>
4Q?nbsp; 如果用到数据库的内容Q在学会(x)sql的前提下Q尽量学?x)数据库原理中的相关sql内容, 当然Z提高查询的能力也可以增加一?/p>
5Q?nbsp; 如果用到面向对像的语a那最好学点相关的设计模式Q这L(fng)可以增加代码的扩展性,?qing)可l护性等Q能够理解详l设计中的模块间的设计原则这个也可以提高Ҏ(gu)块的内容~写的正?
6Q?nbsp; 你一定要学会(x)公司内部的通用的编码规范?/p>
7Q?nbsp; 学习(fn)如何做单元测试比较好.必须要熟(zhn)相关的单元试工具.
8Q?nbsp; 要不断的对相关知识进行ȝQ同时也要必L相关的资料进行整理和学习(fn)Q在学习(fn)q后的资料中你可以在遇到问题时更快的扑ֈ问题的答题?/p>
9Q?nbsp; 在开发你必须记录下大家常出错的地方及(qing)大家的解x法,q个对你以后错误的避免有很大的作?
10Q?nbsp; 在写代码中时必须把上面写q代码记在心里,q样可以养成习(fn)惯,提高代码的速度
11Q?nbsp; Ҏ(gu)据库操作Ӟ要尽量共用ConnectionQƈ用以减Connection的数?/p>
(二) 目标Q高U程序员
职责Q对需求文档进行系l相x块的详细设计Qƈ负责对程序员的支持及(qing)指导和相x心模块的~写
所以不但要学会(x)相关E序员要的知识,同时q要学会(x)隑ֺ比较大的知识?/p>
1Q?E序员的知识Q如设计模式你一定要不是单的看要懂,你还要应用设计模式对相应的模块进行相关的详细设计?/p>
2Q?nbsp; 要学好相兌l设计的工具做的有的攄Q这样可以更好提高对自已的设计的表达
3Q?nbsp; Z提高pȝ的运行效率会(x)q用?/p>
a. 数据库的表结构如何徏才能使应用的要查询sql 更快。这时可要认真认真的学习(fn)一h据库原理Q千万不要以为采用数据库的范式越高系l的q行效率?x)越好,有时候适当的表冗余可以大幅度的提高pȝ的查询效? 同时适当的徏索引,视图Q存储过E也是提高系l对数据库的查询的效率之一?/p>
b. 学习(fn)多线E的~程Q不q千万不要以为线E数多q行的速度?x)越快,一般线E的数量过一定的数量后,pȝ的运行速度反而会(x)变慢。ؓ(f)了应用好多线E,操作pȝq本书也要关于同步及(qing)相关q程和线E的知识必不可少?/p>
c. 设计好的一E序的好的算法,可要比v解一道同一复杂的数学题Q要隄多,所以要在学好的相关数学的知识上Q如U性代敎ͼL数学Q概率论Q数理统计)。更要深入计方法,?qing)数据结构,让数学问题用计算机来解决?/p>
4Qؓ(f)了让pȝ设计的更加的可扩展性,E_性,设计模式和Y件工E可是不能少的东ѝ所以必L设计模式用于模式U的设计.
5. 如果公司采用的是Rose (UML)q行设计的话Q你对于UML 的理解一定要非常的准,同时你要跟小l中的程序之间进行充分的UML概念上及(qing)对应用例图,cd图,对象图,协作囄意思多写一些注释加深大家对你的设计上的理解?/p>
Q三Q?nbsp; 目标Q系l分析员
职责Q做好与客户之间的关p,同时对客L(fng)需求要正确的理解,要选择合适的开发技术,同时做好与客户间沟通交,学会(x)说服Ҏ(gu)?/p>
1Q?nbsp; 学会(x)对客L(fng)沟通:(x)要正理解客L(fng)需求同时要保证怺之间的沟通顺畅?/p>
2Q?nbsp; 对了解来的需求要能用W正的描述下来Qƈ能很好的传叙l其他h。这时要学会(x)用如ROSE {的软g建模的工兗和powerdesign{的数据库徏模工兗和相关的UML,数据程囑֏(qing)相关的内容的知识?/p>
3Q?nbsp; 不但要全面的了解客户的需求而且q要寚w求进行未来的可能的改变要有相当多的了解?/p>
4Q?nbsp; 全面的了解客L(fng)需求后Q要选择合适的相关技术用于开发,Q?/p>
q时要学?fn)各U知?/p>
a. 先择数据库:(x)db2,infomix ,oracle ,sql server,mysql 的优~点,可以从中选择最适合的数据库?qing)理由?/p>
b. 设计数据库:(x)要扎实在数据库的理论Q数据库原理Q数据库pȝ设计Q及(qing)相关数据库设计经验,要尽量多的分析过L据库设计Q分析这么设计数据库的好处。这时可能要用到 powerdesign{工兗?
c. 写需求说明文和概要设计文档Q同时要学会(x)要分析相关需求说明文的需要的内容的相关知识,如h员工时的计算Ҏ(gu)Q?一般会(x)?project 来分析相关的目的内宏V?/p>
d. 选择合适的E序语言?qing)相关的架构Q一般主的架构?J2EE?net的相应的优点?qing)它们之间的l合Q如采用soap xmlq行相关的结合,或用java-com ?q行相关的功能的调用。和它们之间的相兌a优缺?/p>
e. q要Ҏ(gu)b/s,c/s l构对开发的|络影响的相兛_定w取选择?/p>
5. 学会(x)说服Ҏ(gu)Q毕竟客户都不是个个是Y件专Ӟ他们的选择有时未必是正的所以学?x)说服对方,是系l分析员必备的能力条?
三. 训练的方法:(x)
1. 计划行事Q?/p>
(1 讑֮你的未来的学?fn)目?/p>
a. 未来要成Z么样的hQ主要是工作角色Q如E序员,高E序员,pȝ分析员)
b. 你近期要成ؓ(f)什么样的hQ当前的工作职责是什么,如果只写代码是程序员{)
c. 要完成近期的工作所必须要知识(如java E序员,要学?fn)java 基础知识Q等Q,关键的知识(如java中关键要用到的知识有Q面向对象等Q?易错的知识(比较原来的已有知识进行合对)
(2 讑֮你的学习(fn)目标后,q要有针Ҏ(gu)的对应目标讑֮学习(fn)旉的按排及(qing)学习(fn)路线。ƈ直观的记录在案,以便以后随时核对Q?/p>
(3 常常抽出一定的旉认真核对计划的完成情况,如果没有按时完成计划的内宏V分析原因,量x赶上计划内容如果存认是计划有误,要认真ȝ计划p|出错的原因,对你的未来有很大的帮助?/p>
注意Q不要对计划的按排过于乐?要尽量的考虑实现中的各种情况Q同旉当按排一些缓冲时_(d)以便真正能按照计划行事,以提高按计划行事信心Q同时这能有效避免出现计划中途成没有意义的东ѝ?/p>
2Q?nbsp; 针对工作角色对自已的能力q行培养和知识进行学?fn)?/p>
关键的能?
(1. 记忆能力Q要学会(x)把自已的写的代码和改的代码记的清清楚楚。要能提高效率?/p>
Q?Q?逻辑思维能力Q要多多的看别h的复杂逻辑的代码,分析复杂逻辑的运?/p>
Q?Q全局能力Q?不要再范改了东,却西出错。(构造Y件这个很重要Q?/p>
Q?Q学?fn)能力?x) q不是每个项目都你是所熟?zhn)的项目的Qƈ不是每个目中的知识你都知道Q要掌握最新的技术和最有用的知识,是最关键的。要学会(x)Q提高能力,q个东西是永q对自己有好处的?/p>
Q?Q?沟通能力; 学会(x)q默Q学?x)讲故事Q学?x)交朋友Q学?x)礼节?/p>
Q?Q自制能力:(x)如果一个h不能自制那这个h以后Q不?x)有很大成果Q即使很大机?x)发展v了,可是因ؓ(f)没有自制能力很容易被人利用,或自己明明知道怎么做,可是是不能控制自己的欲?而常做下无法挽回在错?
四. 例:(x)java E序员的知识l构?qing)学习(fn)流E:(x)
(一) 学习(fn)相关工作必须的知?/p>
1QJava 语言的基Q推荐书Q?java ~程思想》)
关键Q?/p>
Q?. java 面向对象?qing)对应的E序现实
Q?. java 多线E?/p>
Q?. java |络 socket
Q?. 应用界面
2Q学?x)用集成开发工具jbuilderQeclipse{一U?Ҏ(gu)资料里的内容Q自已写与例E类似的代码Q但注意不要直接抄它Q一定要自已写。同时最好写C个工E中以便Ҏ(gu)?/p>
3Q如果用b/sl构要学?fn)jsp的知识(推荐书:(x)?JSP 2.0技术手?》)
关键Q?/p>
Q?Q?界面处理Q?
a . HTML——超文本标志语言:用于昄面如:(x)文本链? 表格,各种标志{?/p>
b. CSS———层叠样式表:控制正文外观的一l格?用于化HTML面?
c. javaScript—嵌入HTML面览器来执行的脚本语a:让页面可以根据用L(fng)操作或事先设|等在客L(fng)q行动态变?而且不需传回服务器。比? 对表单输入的正确性做客户端验?
Q?Qjsp元素:如java代码写法Q对应标?--jsp:include,jsp:useBean,jsp:setProperty,
jsp:getProperty{?jsp的几大对
(3. javaBean?qing)其在jsp 中的调用和相兛_?
(4. 其他技术:(x)
a. 如何操作数据库—用jdbcQ可能要补充一些数据库的知识,如oracle ,sql server,
包括如何写高效率的查询sql,存储q程{) ,
b. 如何发送email—用javaMailQ?/p>
c. 如何学习(fn)如何用实现文件的上传下蝲Q如果操作文Ӟ
d. 如何操作xml --用jdom ?jaxpQ这时有必要学习(fn)一下xml 的语法如 dtd{)
e. 如何q程Ҏ(gu)调用—用 rmi
f. 如何q行消息服务 ---?jms
5.再有些公怼(x)用到 J2EE 的架构如 EJB 作ؓ(f)业务逻辑.
(1.EJB中要分清
(2. struts MVC
(3. Hibernate 操作数据?/p>
6Q最好学?fn)一下UML
学用Rose建模
?忠告Q?/p>
1. 不要以ؓ(f)自已很差Q要明白每个人都是这样一步一个脚印的走过来的?我们要有信心)
告诉自已:比尔盖次Q也是同我们一P出生时也是巴掌大.
我们只有多学Q多l才可能有出?
2. 不要以ؓ(f)自已学的多就很强Q世界上的高手多的是Q问问自己,你每时可以写几行代码,代码一ơ写下来有多错误,如果你一ơ写下没有错误,一时可以?000代码Q那才是真正的高?
3 . 不要以ؓ(f)自已没有目做就?x)落后于他hQh家是参加了很多项目,可是人家只是目中的一个小角色Q如果我们在I时能都写一些开源的目Q或自己开发和设计一些有用的开源的目Q水q_(qing)能力很快׃来了.
4. 不要以ؓ(f)自己做过很多的项目就很了不v了。你能说你做的项目中Q你能体?x)整个项目?f)什么要q样设计Qؓ(f)什么要q样开发吗Q相信绝大多数是否定的回{。那q不如多学习(fn)一些已做的目Q了解他们ؓ(f)什么要q么做,Z么这么开发,多看一下它们的目的文,我们能明白很多,q样把他们的l验放于你未来可能要接手的项目,q样不是更好吗?
5Q?不要以ؓ(f)自己的学?fn)能力很牛,你能快速阅M本书又能快速掌握它的内容吗
那么, 能不能够在进入方法前p用一些安全检? 其实Spring AOP是q个思想, 那么又如何实现安全检呢? Spring Acegi Security 框架是做这个事? 本文主要是讨Z在已有的SSHpȝ? 如何使用Acegi作ؓ(f)安全框架实现Z角色的权限控?Role Based Access Control RBAC) 本文的主要参考资? <Spring 2.0 核心技术与最?jng)_?gt; W?0?(Spring Acegi 安全框架) <_NSpring 2.X -- 企业应用开发详?gt; W?7?(使用Acegi 实施应用pȝ安全) acegi-security-1.0.6 官方文 说明: 本文介绍的是RBAC, 在官Ҏ(gu)档的基础上有所扩展或改? 以更适合WEB应用pȝ. 其实我觉得大多数的网站基于角色已l够了, 一般都没必要基于权? 文章开? 一. 下蝲所要的软g或JAR? 我的相关配置? Java 5, Tomcat 5.5.26, Struts 2.0.11, Spring 2.5.1, Hibernate 3.2, Acegi 1.0.6 ? 建立相关的数据库: 数据? 用户信息表User: id, enable, user_name, user_pass, email_box 角色信息表RoleInfo: id, role_name, role_title, descp 用户与角色关联表(用户与角色是多对多关p?UserRole: user_id, user_name, role_id, role_name q在q三个表中插入相关的数据, 我是定义了两U角?role_name): ROLE_USER, ROLE_ADMIN 和三个用? 一个用戯色ؓ(f): ROLE_USER, ROLE_ADMIN 另一个用戯色ؓ(f): ROLE_USER W三个没有角? ? 修改配置文g: 其实对Acegi框架的应用难点就在配|文? 所以要特别注意? ?src 建立Acegi的配|文? acegi-security.xml acegi-security.xml 其内容如? <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans xsi:schemaLocation="http://www.springframework.org/schema/beans <!-- ================= <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"> <list> <ref bean="daoAuthenticationProvider" /> <ref bean="rememberMeAuthenticationProvider" /> </list> </property> </bean> <!-- ZDAO验证的AuthenticationProvider --> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService" /> </bean> <bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService"> <property name="userDao" ref="userDao" /> <property name="userRoleDao" ref="userRoleDao" /> </bean> <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> <property name="key" value="obullxl@163.com </bean> <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="userDetailsService" /> <property name="parameter" value="j_remember_me <property name="key" value="obullxl@163.com <property name="tokenValiditySeconds" value="31536000" /> </bean> <!-- ================= <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"> <property name="decisionVoters"> <list> <ref bean="roleVoter" /> </list> </property> <!-- 是否全部弃权?yu)通过 --> <property name="allowIfAllAbstainDecisions" value="false" /> </bean> <bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter"> <property name="rolePrefix" value="ROLE_" /> </bean> <!-- ================= <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor </value> </property> </bean> <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" /> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"> <!-- d退出后的URL --> <constructor-arg value="/" /> <list> <ref bean="rememberMeServices" /> <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" /> </list> </constructor-arg> <!-- d退出的URL --> <property name="filterProcessesUrl" value="/j_logout.j" /> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <!-- dp|后的URL --> <property name="authenticationFailureUrl" value="/login.jsp?msg=%E6%97%A0%E6%95%88%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E6%88%96%E5%8F%A3%E4%BB%A4" /> <!-- d成功后的URL --> <property name="defaultTargetUrl" value="/user/cmd.jsp" /> <!-- d的URL --> <property name="filterProcessesUrl" value="/j_login.j" /> <property name="rememberMeServices" ref="rememberMeServices" /> </bean> <bean id="rememberMeFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager" /> <property name="rememberMeServices" ref="rememberMeServices" /> </bean> <bean id="exceptionFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <!-- 出现AuthenticationException时的d入口 --> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/login.jsp" /> <property name="forceHttps" value="false" /> </bean> </property> <!-- 出现AccessDeniedException时的Handler --> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/denied.jsp" /> </bean> </property> </bean> <bean id="securityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="accessDecisionManager" /> <property name="objectDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /admin/**=ROLE_ADMIN /user/**=ROLE_USER /cart/previeworder*=ROLE_USER </value> </property> </bean> </beans> 在上面的配置文g? U色 <bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService <property name="userDao" ref="userDao" /> <property name="userRoleDao" ref="userRoleDao" /> </bean> 在整个应用的安全控制? 我们唯一要编写代码的cd? org.ymcn.security.AcegiUserDeitailsService pd和登出的代码也不要了. ![]() ? 修改 web.xml <filter> <filter-name>acegiFilterChain</filter-name> <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> <init-param> <param-name>targetClass</param-name> <param-value>org.acegisecurity.util.FilterChainProxy</param-value> </init-param> </filter> <filter-mapping> <filter-name>acegiFilterChain</filter-name> <url-pattern>*.j</url-pattern> </filter-mapping> 注意: ? ?applicationContext.xml <!-- Acegi安全控制拦截?--> <bean id="serviceSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"> <property name="validateConfigAttributes" value="true" /> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="accessDecisionManager" /> <property name="objectDefinitionSource"> <bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes"> <property name="attributes"> <bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" /> </property> </bean> </property> </bean> <!-- 利用Spring的自动代理功能实现AOP代理 --> <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <value>serviceSecurityInterceptor</value> </list> </property> <property name="beanNames"> <list> <value>userService</value> <value>mailService</value> </list> </property> </bean> ? ~写在利用Acegi框架唯一要我们编写的c?AcegiUserDeitailsService.java package org.ymcn.security; import java.util.List; import org.acegisecurity.GrantedAuthority; import org.acegisecurity.GrantedAuthorityImpl; import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UserDetailsService; import org.acegisecurity.userdetails.UsernameNotFoundException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.dao.DataAccessException; import org.ymcn.dao.UserDao; import org.ymcn.dao.UserRoleDao; import org.ymcn.model.User; import org.ymcn.model.UserRole; public class AcegiUserDeitailsService implements UserDetailsService { private final Log LOG = LogFactory.getLog(AcegiUserDeitailsService.class); /* 依赖注入 */ private UserDao userDao; private UserRoleDao userRoleDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void setUserRoleDao(UserRoleDao userRoleDao) { this.userRoleDao = userRoleDao; } /* 用户所有的权限 */ //private final List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(6); private GrantedAuthority[] grantedAuthArray; public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException { if(LOG.isDebugEnabled()) { LOG.debug("Loading UserDetails of userName: " + userName); } /* 取得用户 */ User user = userDao.getUserByName(userName); if(user == null) { LOG.warn("UserDetails load failed: No such UserRole with userName: " + userName); throw new UsernameNotFoundException("User name is not found."); } /* 取得所有用h?*/ List<UserRole> userRoleList = userRoleDao.getUserRoleByUserName(userName); if(userRoleList == null || userRoleList.size() == 0) { LOG.warn("UserRole load failed: No such UserRole with userName: " + userName); throw new UsernameNotFoundException("UserRole is not found."); } /* 取得用户的所有角?*/ int size = userRoleList.size(); grantedAuthArray = new GrantedAuthority[size]; int j = 0; for(int i = 0; i < size; i++) { UserRole userRole = userRoleList.get(i); if(userRole != null) { this.grantedAuthArray[j++] = new GrantedAuthorityImpl(userRole.getRoleName().toUpperCase()); } } LOG.info("UserName: " + userName + " loaded successfully."); return new org.acegisecurity.userdetails.User(userName, user.getUserPass(), true, true, true, true, this.grantedAuthArray); } } ? 在业务逻辑代码中利?font style="line-height: 1.3em" color="#ff0000">Java 5注释 @Secured({"ROLE_USER"}) void sendSimpleMail(Long userId); @Secured({"ROLE_ADMIN"}) void sendAttachmentMail() throws Exception; 其实是在需要安全控制的Ҏ(gu)前加? @Secured({"角色?}) Acegi框架完全是一U可插拔式的, 完全可以在原有的pȝ中加?font style="line-height: 1.3em" color="#ff0000">一个配|文?/font> 上面?AcegiUserDeitailsService.java true |
package com.css.wam.portlet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.TimerTask;
import javax.servlet.ServletContext; 字串2
import org.apache.jetspeed.security.SecurityException; 字串9
import com.css.wam.service.WorkService; 字串1
@SuppressWarnings("unused")
class SampleTask extends TimerTask{ 字串2
private static final int C_SCHEDULE_HOUR = 23;//讄指定旉
private WorkService workService;
private List users;
private List teams;
private WorkPortlet work;
public void setWorkService(WorkService workService) {
this.workService = workService;
} 字串7
public void setWork(WorkPortlet work) {
this.work = work;
} 字串4
public SampleTask(){
}
@SuppressWarnings("unchecked")
public void run() {
Calendar cal = Calendar.getInstance();
try {
users = work.getUsers();
teams = new ArrayList();
for(Iterator it = users.iterator(); it.hasNext();)
{
String teamname = work.getGroupsByUser((String)it.next());
teams.add(teamname);
}
//查看当前旉与指定是否一_(d)一致则执行d
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) ) 字串6
workService.autoWorkOff(users, teams); 字串8
} catch (SecurityException e) {
e.printStackTrace();
}
}
}