SpringSide3開發(fā)Web項(xiàng)目的全過程_第1頁
SpringSide3開發(fā)Web項(xiàng)目的全過程_第2頁
SpringSide3開發(fā)Web項(xiàng)目的全過程_第3頁
SpringSide3開發(fā)Web項(xiàng)目的全過程_第4頁
SpringSide3開發(fā)Web項(xiàng)目的全過程_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .歡迎下載支持使用 SpringSide2009 年 09 月 24 日 來源: BlogJava 作者:海邊沫沫 收藏本文SpringSide ,也是完成度比較高的一個(gè)版本,用來做實(shí)際項(xiàng)目的開發(fā)應(yīng)該絲毫不成問 題。這里寫一下使用該版本開發(fā)一個(gè)簡(jiǎn)單 Web 項(xiàng)目的全過程,當(dāng)然,最重要的是我自己的 一些心得體會(huì)。我的文章很長(zhǎng),只有耐下性子細(xì)看,才能體會(huì)個(gè)中三味。第一步、下載 SpringSide all-in-one 版。這個(gè)過程太簡(jiǎn)單了, SpringSide 的官方網(wǎng)站 是,去那里就可以下載了, all-in-one 版當(dāng)然是懶人們的不二

2、選擇。這里有一點(diǎn)很搞笑,該 版本標(biāo)的是 SpringSide ,但是下載后解壓縮,解壓縮出來的文件是 springside- ,這可能是 江南白衣的一點(diǎn)小小的失誤, 據(jù)我猜測(cè), ,希望白衣這次不要為了更改這個(gè)版本號(hào)上的失誤 而再推出一個(gè)新版本, 如果真要推出新版本, 怎么樣也應(yīng)該把我最近研究出來的多數(shù)據(jù)庫(kù)的 配置加進(jìn)去。第二步、安裝 SpringSide 。如果安裝過 SpringSide 以前的版本, 最好把用戶目錄下的 .m2 文件夾刪掉, 這個(gè)文件夾是 Maven 的本地倉(cāng)庫(kù)所在地, 雖說 Maven 可以有效保證庫(kù)文件不 會(huì)發(fā)生版本沖突,但是刪除這個(gè)文件夾會(huì)使安裝過程加快,否則, Sp

3、ringSide 的安裝過程 會(huì)不停詢問你是否覆蓋某某文件。刪除 .m2 文件夾后,運(yùn)行 springside- ,如果你的電腦中 連 JDK 都沒有,就別來趟 SpringSide 的渾水了)。 等待這個(gè)文件運(yùn)行完,就可以看到 SpringSide 3 提供的三個(gè)示例項(xiàng)目 mini-web 、mini-service 、 showcase 都運(yùn)行起來了,這 時(shí)你可以細(xì)細(xì)體會(huì)一下 SpringSide 實(shí)現(xiàn)的各種特性。仔細(xì)察看 SpringSide 的 bin 目錄,發(fā)現(xiàn)該版本提供的腳本更加明確和有用,如 start-db.bat 可以用來啟動(dòng) Derby 數(shù)據(jù)庫(kù), start-seleniu

4、m.bat 用來啟動(dòng) selenium server ,而 start-tomcat.bat 那就別說了,地球人都知道。如果要想使用 SpringSide 來生成項(xiàng)目,還有一點(diǎn)點(diǎn)小工作要做,就是把 Maven 的 bin 目錄 加入到 PATH 環(huán)境變量中,如下圖:第三步, 使用 SpringSide 生成項(xiàng)目。 運(yùn)行 bin 目錄下的 new-project.bat 即可, 如下圖:圖片看不清楚?請(qǐng)點(diǎn)擊這里查看原圖(大圖)。在創(chuàng)建項(xiàng)目的過程中,該腳本會(huì)提出一些問題,其中 groupId 指的是你的組織的名稱, 由于該項(xiàng)目由我私人貢獻(xiàn),純屬示范用,所以我填了 youxia.personal ,

5、因此,在第 5 個(gè)問 題上,我選擇了 personal.you 作為我項(xiàng)目中的 package 的名字,這也是符合國(guó)際慣例的; artifactId 指的是項(xiàng)目的名字,這里為 MultiDatasourceExample ,名字有點(diǎn)長(zhǎng),從名字就可 以看出來我要示范多個(gè)數(shù)據(jù)源的配置。第四步、啟動(dòng) Eclipse ,導(dǎo)入項(xiàng)目。 生成的項(xiàng)目位于 SpringSide 目錄下的 toolsgeneratorgenerated-project 目錄下,下面是 Eclipse 的截圖:項(xiàng)目導(dǎo)入成功后, Eclispe 資源管理器的截圖:可以看到, 該項(xiàng)目一經(jīng)導(dǎo)入,立即可用, 一個(gè)煩人的紅叉都沒有, 這也正

6、說明了該版本 是 SpringSide 3 的一個(gè)革命性版本,從該版本開始, SpringSide 3 的易用性提高了不止一 個(gè)檔次。Eclipse 推薦使用 3.4 及以上版本,因?yàn)樵谠摪姹局校瑢?duì) Tomcat 服務(wù)器的管理更加方 便,只需要在項(xiàng)目的快捷菜單中選擇 Run On Server ,即可自動(dòng)打開 Tomcat 服務(wù)器并部署 項(xiàng)目,如下圖:圖片看不清楚?請(qǐng)點(diǎn)擊這里查看原圖(大圖)。這里有一點(diǎn)一定要注意,由于 SpringSide 生成的項(xiàng)目默認(rèn)使用的是 Derby 數(shù)據(jù)庫(kù),所 以要想成功運(yùn)行項(xiàng)目,必須先啟動(dòng) Derby 數(shù)據(jù)庫(kù),還記得前面提到的 start-db.bat 嗎?運(yùn)行

7、它!然后運(yùn)行該項(xiàng)目的 bin 目錄下的 init-db.jar ,在數(shù)據(jù)庫(kù)中放入該項(xiàng)目的初始化數(shù)據(jù)。然后就可以點(diǎn) Run On Server 來啟動(dòng)項(xiàng)目了, 讓大家見識(shí)一下 Eclipse 的嵌入式瀏覽器、 Tomcat 服務(wù)器視圖、 Console 視圖。真的是太方便了:第五步、將數(shù)據(jù)庫(kù)遷移到 MySQL 中。在項(xiàng)目中,創(chuàng)建數(shù)據(jù)庫(kù)和初始化數(shù)據(jù)庫(kù)的語句都是以SQL 文件存在的,如下圖:2文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .歡迎下載支持但是該語句都是針對(duì) Derby的,如果要應(yīng)用于 MySQL,還必須得要做一些修改才行,先修改schema.sql,如下:drop table

8、if exists RESOURCES_AUTHORITIES;drop table if exists ROLES_AUTHORITIES;drop table if exists USERS_ROLES;drop table if exists RESOURCES;drop table if exists AUTHORITIES;drop table if exists USERS;drop table if exists ROLES;create table USERS (ID integer primary key auto_increment.LOGIN_NAME varchar(2

9、0) not null unique,PASSWORD varchar(20),NAME varchar(20),EMAIL varchar(30)uniqueindex USERS LOGIN NAME INDEXon USERS(LOGIN NAME);42create table ROLES (ID integer primary key auto_increment,NAME varchar(20) not null uniquecreate table USERS_ROLES (USER_IDintegernot null,MROLE_IDinteger not null,FOREI

10、GNKEY (ROLED)referencesROLES(ID),FOREIGNKEY (USER_ID)referencesUSERS(ID);CREATE TABLE AUTHORITIES (ID integer primary key auto_increment,NAME varchar(20) not null,DISPLAY_NAME varchar(20) not nullcreate table ROLES_AUTHORITIES (ROLE_ID integer not null,AUTHORITY_ID integer not null,FOREIGN KEY (ROLE

11、D)references ROLES(ID),FOREIGN KEY (AUTHORITY_ID) references AUTHORITIES(ID)CREATE TABLE RESOURCES (ID integer primary key auto_increment,RESOURCE_TYPE varchar(20) not null,VALUE varchar(255) not null,ORDER_NUM float not nullcreate table RESOURCES_AUTHORITIES (AUTHORITY。integer not null,RESOURCE_ID

12、integer not null,FOREIGN KEY (AUTHORITY。)references AUTHORITIES(ID),該修改主要包含兩個(gè)地方,一個(gè)是在drop table后面加上了 if exists,一個(gè)是把GENERATED ALWAYS as IDENTITY修改為 auto_ in creme nt。而 load-data.sql 不需要修 改。然后,啟動(dòng)MySQL,在MySQL中使用上面的兩個(gè) sql文件創(chuàng)建數(shù)據(jù)庫(kù)和添加初始化 數(shù)據(jù),如下圖:圖片看不清楚?請(qǐng)點(diǎn)擊這里查看原圖(大圖)。然后更改數(shù)據(jù)庫(kù)連接,修改項(xiàng)目的applicati on .properties 文件

13、,如下:#jdbcsettingsjdbc.url=jdbc:jdbc.username=youxiajdbc.password=*#hibernate settingshibernate.show_sql=falsehibernate.format_sql=falsehibernate.ehcache_config_file=/ehcache/ehcache-hibernate-local.xml修改項(xiàng)目的applicationContext.xml文件,這里要修改兩個(gè)地方,一個(gè)為DriverClassName ,個(gè)為 hibernate.dilect ,如下:Spring公共配置文件vbe

14、anclass=vproperty name=systemPropertiesModeNamevalue=SYSTEM_PROPERTIES_MODE_OVERRIDE/vpropertyname=ignoreResourceNotFoundvalue=true/vpropertyname=locationsclasspath*:/pertiesclasspath*:/!-使用annotation自動(dòng)注冊(cè)bean,并保證Required,Autowired的屬性被注入!- file:/var/myapp/-v!-數(shù)據(jù)源配置,使用應(yīng)用服務(wù)器的數(shù)據(jù)庫(kù)連接池-v!-vj

15、ee:jndi-lookupid=dataSourcejndi-name=java:comp/env/jdbc/ExampleDB/-v!-Hibernate配己置-vbeanid=sessionFactoryclass=vproperty name=dataSourceref=dataSource /vpropertyname=namingStrategyvbean class= /v/propertyvpropertyname=hibernatePropertiesvprop key=hibernate.dialectvpropkey=hibernate.show_sql$hibernat

16、e.show_sqlvpropkey=hibernate.format_sql$hibernate.format_sqlvprop key= vpropkey=$hibernate.ehcache_config_filev/propv/propsv/propertyvproperty name=packagesToScanvalue= /WebLogicJtaTransactionManager/由于SpringSide不提供Mysql的jdbc驅(qū)動(dòng),所以需要自己去 MySQL的官方網(wǎng)站下載,將下載到的mysql-connector-5.*.jar復(fù)制到項(xiàng)目的 WEB-INF中的lib目錄中。

17、然后運(yùn)行項(xiàng)目,成功。至此,成功將項(xiàng)目遷移到MySQL中。第六步、添加數(shù)據(jù)表、編寫Entity類、編寫Dao類、Manager類,并進(jìn)行單元測(cè)試。還是以前幾篇文章中提到的文章發(fā)布系統(tǒng)為例,每一篇文章對(duì)應(yīng)多篇評(píng)論,所以說據(jù)庫(kù)中需創(chuàng)建articles和comments兩個(gè)數(shù)據(jù)表,如下:createtable articles(id intprimarykey auto_increment.subject varchar (20) notnullcontent text );createtable comments(id intprimarykey auto_increment.content var

18、char (255),article_idintnotnull在編寫Java代碼之前,我還要做一點(diǎn)小工作,什么工作呢?那就是要為我自己的項(xiàng)目 創(chuàng)建一個(gè)單獨(dú)的源文件夾,因?yàn)閟rcmainjava這個(gè)文件夾已經(jīng)被江南白衣放入了太多的package,而且因?yàn)樯婕暗?security,所以層次也不明顯,操作起來不方便,找起代碼來也 不夠快。下面是我創(chuàng)建了自己的源文件夾后的截圖:這樣,在我自己的源文件夾中,只創(chuàng)建了四個(gè)package,剛好代表從底到上的四個(gè)層次,找起代碼來要方便得多。先來Entity層,Article.java的代碼如下:importimportimportimportimportimp

19、ortEntity/表名與類名不相同時(shí)重新定義表名.T able(name= articles)/默認(rèn)的緩存策略.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Article extends IdEntity |privateStringsubject;privateStringcontent;private Set comments = new LinkedHashSet();public String getSubject() return subject;public void setSubject(Stri

20、ng subject) this.subject= subject;public StringgetContent()return content;public void setContent(Stringcontent)this.content= content;OneToMany(cascade= CascadeType.ALL)JoinColumn(name= article_id)/ Fecth策略定義Cache(usage = CacheConcurrencyStrategy.READ_WRITE)publicvoid setComments(Setcomments)ments= c

21、omments;Comme nt.java 女口下:packageimportimportimportimportimportimport ;Entity/表名與類名不相同時(shí)重新定義表名.Table(name= comments)/默認(rèn)的緩存策略.Cache(usage = CacheConcurrencyStrategy.READ WRITE)public class Comment extends IdEntity privateString content;privateLong articleId;publicStringgetContent()returncontent;public

22、voidsetContent(Stringcontent)this.content= content;Column(name= article_id)public Long getArticleld()return articleld;public void setArticleId(LongarticleId)this.articleId= articleId;編寫Dao層代碼,ArticleDao.java 如下:package;1import;import;Comme ntDao.java 女口下:packageimportimport可以看出,以上代碼都從HibernateDao繼承,

23、得益于泛型支持,基本不需要編寫一行代碼。編寫B(tài)uss in ess層代碼,這一層,白衣使用的包名為service,而類名的后綴都是Manager,我就跟他學(xué)算了,懶得改了。ArticleMa nager.java 女口下:packageimportimportimportimportpublic class ArticleManager extends EntityManager AutowiredprivateArticleDaoarticleDao;public void setArticleDao(ArticleDaoarticleDao) this.articleDao= articl

24、eDao;Comme ntMa nager.java女口下:packagepublic class CommentManager extends EntityManager AutowiredprivateCommentDaocommentDao;public void setCommentDao(CommentDaocommentDao)mentDao= commentDao;OverrideprotectedHibernateDaovComment,Long getEntityDao()/ TODO Auto-generatedmethodstubreturncommentDao;以上代碼

25、大同小異,都是從EntityManager繼承,并使用Spring的IoC特性,將Dao類注入到Manager類之中,并重載getEntityDao方法來使用該注入的 Dao。這個(gè)時(shí)候,為了驗(yàn)證這些數(shù)據(jù)訪問相關(guān)的層能否正常運(yùn)行,可以編寫單元測(cè)試。代碼如下:public class DataAccessTest extends SpringTxTestCaseAutowiredprivate ArticleManager articleManager;Autowiredpublicvoid setArticleManager(ArticleManagerarticleManager)this.a

26、rticleManager= articleManager;Testpublicvoid addArticle()commentManager;private CommentManagerComment commentnew Comment();Article articlenew Article();article.setSubject(test);article.setContent(test);articleManager.save(article);comment.setArticleld(article.getld();commentManager.save(comment);單元測(cè)

27、試一運(yùn)行,發(fā)現(xiàn)了三個(gè)問題,先是出現(xiàn)Manager類沒有注入成功的錯(cuò)誤,經(jīng)檢查發(fā)現(xiàn)所有的 Manager類都應(yīng)該使用 Service注解,再出現(xiàn)的錯(cuò)誤是提示Dao類沒有注入成功,經(jīng)檢查發(fā)現(xiàn)所有的Dao類須使用Repository注解,最后出現(xiàn)的錯(cuò)誤是找不到Entity類的錯(cuò)誤,經(jīng)檢查發(fā)現(xiàn)Entity類不能位于,必須位于其子包中,這是由applicati on Co ntext.xml文件中的配置決定的,更改包名為,問題解決。下一步就應(yīng)該是編寫 Action和JSP 了,由于文章太長(zhǎng),在Blogjava的編輯器中編輯已 經(jīng)非常緩慢了,所以只有將該文章分為上中下三部分。且看下回分解!第七步、編寫 A

28、ction和JSP。在SpringSide ,使用的是 Struts 2 及其Convention 插件, 已經(jīng)不是前面使用的CodeBehind插件了,關(guān)于 Convention插件,這里要再說幾句,該插件的大部分功能和CodeBehi nd相同,唯一讓人有點(diǎn)迷惑的就是該插件到哪里尋找Actio n類的問題,它會(huì)根據(jù),在該項(xiàng)目中,其值為“web;之需要查閱一下 struts.xml文件即可知。 這說明,Convention會(huì)尋找所有包含 web這個(gè)單詞的包,并在該包及其子包中尋找Action類。這也正是 Action層的包名為關(guān)于SpringSide 3種的Struts的探討,大家可以看看我

29、之前寫的一篇文章SpringSide 3中的 Struts 2ArticleAction 的實(shí)現(xiàn)思路如下,修改index.jsp,使其重定向到article.action ,該Action默認(rèn)調(diào)用其list方法顯示所有文章,并返回 article.jsp作為其視圖。在該視圖上,有添加文章的連接,點(diǎn)擊該連接則訪問article!i nput.action ,這時(shí)會(huì)調(diào)用 ArticleActio n的in put方法,并返回article-input.jsp作為其視圖,在該視圖中輸入文章的內(nèi)容,點(diǎn)擊保存,調(diào)用article!save.action,這時(shí)會(huì)調(diào)用 ArticleAction的save方

30、法以保存數(shù)據(jù),如果要?jiǎng)h除文章,則調(diào)用 article!delete.action,這時(shí)會(huì)調(diào)用 ArticleAction 的delete方法。在調(diào)用以上方法的過程中,會(huì)自動(dòng)調(diào)用 prepare系列的方法。因此,該步驟涉及到三個(gè)JSP文件和一個(gè)Action類,它們分別是in dex.jsparticle.jsparticle-i nput.jspArticleActio n.javaindex.jsp的修改很簡(jiǎn)單,只是讓項(xiàng)目一啟動(dòng)后就去訪問ArticleAction,而不是默認(rèn)的UserAction。index.jsp 的代碼如下:這時(shí),重點(diǎn)進(jìn)入到ArticleAction中,創(chuàng)建該 Actio

31、n,其代碼的框架如下:packageimportpublic class ArticleAction extends CrudActionSupportOverride public String delete() throws Exception / TODO Auto-generated method stub return null;OverrideOverridepublic String list() throws Exception / TODO Auto-generatedmethodstubthrows Exception / TODO Auto-generatedmethod

32、 stub/ TODO Auto-generatedmethodstubprotected void prepareModel()Overridepublic String save() throws Exception 可以看到,該 Action從CrudActionSupport 類繼承,而 CrudActionSupport 又繼承自ActionSupport,并實(shí)現(xiàn)了 ModelDriven 和 Preparable 接口,這樣 Struts 2 的 ModelDriven 攔截器和Preparable攔截器就會(huì)對(duì)我們自己的 Action發(fā)生作用。CrudActionSupport 中

33、的excute方法默認(rèn)的實(shí)現(xiàn)是調(diào)用list方法,所以訪問 article.action就等于訪問 ArticleAction的list方法,該方法的目的是為了列出所有的文章,所以在該方法中使用了 ArticleDao的分頁查詢,查詢結(jié)果放在一個(gè) page對(duì)象中。在Struts 2中,已經(jīng)沒有了 ActionForm 的概念, 可以直接把Action對(duì)象傳遞到視圖中,為了能夠在視圖中訪問page對(duì)象,只需要把 page對(duì)象作為ArticleAction 的一個(gè)屬性即可。先在 ArticleAction.java 中加入幾行代碼:Autowiredprivate Pagepage = new Pa

34、ge(10);public Page getPage() return page;可以看到該代碼的作用是為了注入ArticleManager和初始化Page對(duì)象,此時(shí)list方法的代碼就非常簡(jiǎn)單,如下:Overridepublic Stringlist() throwsExceptionpage = articleManager.getAll(page);由于該方法只是簡(jiǎn)單獲取一個(gè)頁面的Acticle,所以代碼很簡(jiǎn)單,使用 articleMa nager.getAII方法即可。如果要實(shí)現(xiàn)復(fù)雜的條件查詢,就需要?jiǎng)?chuàng)建一個(gè)包含PropertyFilter對(duì)象的列表,然后使用articleManage

35、r.search方法進(jìn)行查詢,為了簡(jiǎn)化PropertyFilter 對(duì)象列表的創(chuàng)建,白衣提供了HibernateWebUtils.buildPropertyFilters() 靜態(tài)方法供大家使用。list方法返回的是 SUCCESS,因此返回給用戶的視圖頁面為article.jsp,該頁面應(yīng)該存放在 WEB-INF目錄的content目錄中,這也是 Convention 插件的一個(gè)特性,這樣用戶就 沒有辦法直接訪問到視圖頁面了。在該頁面中,可以通過訪問page對(duì)象來顯示數(shù)據(jù),如下:v% page language=java contentType=text/html;charset=UTF-8

36、pageEncoding=UTF-8%vmeta http-equiv=Content-Typecontent=text/html;charset=UTF-8Inserttitle here添加文章 v/av/tdv/trvtd$subjectv/tdvtdva href=article!delete.action?id=$id刪除v/av/tdv/trvtrvtd$contentv/tdv/trv/s:iteratorv/table如果數(shù)據(jù)庫(kù)中有初始數(shù)據(jù)的話,該項(xiàng)目運(yùn)行效果如下圖:到目前為止,還沒有涉及到getModel()、prepareModel()、以及prepare系列的方法,但是,

37、一旦需要添加或者刪除文章,這一系列的方法就有作用了。在Struts 2中,由于沒有了 ActionForm 的概念,所有的頁面?zhèn)魅雲(yún)?shù)都會(huì)被注入到Action中,如果不想在 Action中搞太多的getter和setter,最有效的方法就是提供一個(gè)Model對(duì)象,這時(shí)候攔截器會(huì)把頁面參數(shù)注入到 Model中,而在目前的項(xiàng)目中,沒有比Entity類更適合做 Model對(duì)象的了。 通過觀察CrudActio nSupport基類,可以發(fā)現(xiàn)只有在執(zhí)行save和in put方法之前,才會(huì)執(zhí)行prepareModel方法,該方法可以保證getModel方法返回的對(duì)象不是一個(gè)空指針,而調(diào)用delete方法

38、之前Model對(duì)象沒有初始化,但是delete方法只需要一個(gè)id作為參數(shù),因此,可以在Action中增加一個(gè)id屬性來滿足要求。這時(shí)候,有改動(dòng)的幾行代碼如下:private Long id;privateArticle article;public void setld(Long id) this.id= id;Overrideprotected void prepareModel() throws Exception if (id != null) article = articleManager.get(id); else article = new Article();public Ar

39、ticle getModel()returnarticle;Overridepublic Stringdelete()throwsExceptionarticleManager.delete(id);這里需要特別關(guān)注的是 delete方法返回的值,為 RELOAD,這是一個(gè)在基類中定義好了的字符串。返回該字符串的目的,是為了在delete方法執(zhí)行完之后,不返回任何視圖頁面,而是以redirect的方式再次調(diào)用article.action,以便顯示刪除文章后的結(jié)果。因此,需要在ArticleAction 中使用 Result 注解,如下:Results( Result (n ame= CrudA

40、ctio nSupport.RELOAD,location article.actio n, type = redirect) )經(jīng)過如上修改,這時(shí)候再運(yùn)行應(yīng)用,就發(fā)現(xiàn)能夠刪除文章了。再來實(shí)現(xiàn)添加文章的功能,從上面的article.jsp中可以看出,添加文章的鏈接為articled nput.acti on ,此時(shí),會(huì)運(yùn)行ArticleActio n 的in put方法,該方法只是簡(jiǎn)單返回article-i nput.jsp 視圖文件作為用戶輸入文章的接口,article- i nput.jsp的代碼如下: |Insert title herevform id=inputForm action

41、=article!save.actionmethod=postvtable class=inputView 主題:n 內(nèi)容:v/tdvinputtype=submitvalue=提交/ vinputtype=buttonvalue=取消onclick=history.back()/而ArticleAction中只需要修改如下幾行,由于ModelDriven攔截器已經(jīng)把網(wǎng)頁中傳入的數(shù)據(jù)注入到了article對(duì)象中,所以save方法中只需要執(zhí)行簡(jiǎn)單的保存操作即可:Overridepublic String input() throws Exception return INPUT;Ove

42、rride public String save() throws Exception articleManager.save(article);return RELOAD;至于實(shí)現(xiàn)文章的修改功能,那也是通過in put方法和save方法實(shí)現(xiàn)的,只不過此時(shí)網(wǎng)頁參數(shù)中會(huì)包含一個(gè)有效的 id,而prepare系列的方法會(huì)根據(jù)該id先從數(shù)據(jù)庫(kù)中提取數(shù)據(jù), 然后顯示在article-input.jsp中,用戶修改后,再調(diào)用 save方法保存到數(shù)據(jù)庫(kù)中。為減少本 博文長(zhǎng)度,該功能此處不做示范。通過上面的步驟可以發(fā)現(xiàn),使用SpringSide 3中推薦的CRUD 一體的模式,可以有效減少Action的數(shù)量

43、和JSP文件的數(shù)量,每實(shí)現(xiàn)一個(gè)增刪查改功能,只需要一個(gè)Action和兩個(gè)JSP,但是,程序員一定要對(duì)其中的數(shù)據(jù)流向有充足的認(rèn)識(shí),才能理清它們之間的關(guān)系, 不至于暈頭轉(zhuǎn)向。到這里大家會(huì)發(fā)現(xiàn),ArticleAction誰都可以訪問,一點(diǎn)都不安全,所以第八步我會(huì)探討 如何讓ArticleAction和SpringSecurity 一起工作,至于第九步,當(dāng)然是把項(xiàng)目從單數(shù)據(jù)庫(kù) 環(huán)境更改到多數(shù)據(jù)庫(kù)環(huán)境了。具體內(nèi)容,且看下回分解!第八步、使用 Spring Security 保護(hù) Web資源。在SpringSide 3 項(xiàng)目中,已經(jīng)整合進(jìn)了SpringSecurity,實(shí)現(xiàn)了符合RBAC規(guī)范的權(quán)限管理系統(tǒng)

44、,并把數(shù)據(jù)保存到了數(shù)據(jù)庫(kù)中。我 以前的博文SpringSide 3中的安全框架中對(duì)SpringSecurity有一個(gè)初步的探討,我認(rèn)為我寫的東西對(duì)入門來說是很有幫助的,入門以后再深入就簡(jiǎn)單了,在評(píng)論中我又補(bǔ)充了幾點(diǎn), 其中就提到如果要把資源權(quán)限配置內(nèi)容放到數(shù)據(jù)庫(kù)中,就要從objectDefinitionSource 著手。事實(shí)上,在最新的 Sprin gSide 3 版本中,就是通過定義一個(gè)databaseDefi nition Source來實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中讀取資源和權(quán)限之間的關(guān)系,而databaseDefi nitio nSource弓I用resourceDetailService ,而該S

45、ervice調(diào)用,但是最終只需要用戶實(shí)現(xiàn)3項(xiàng)目中,實(shí)現(xiàn)該Service的工作都可以省略,因?yàn)榻习滓乱呀?jīng)做好了。而我們要做的,就是在他提供的基 礎(chǔ)上進(jìn)行擴(kuò)展。在項(xiàng)目中,已經(jīng)定義好了 users、roles、authorities和resource,如果需要擴(kuò)展其中任意一項(xiàng),只需要向?qū)?yīng)的數(shù)據(jù)表添加記錄即可。預(yù)定義的role有管理員”和用戶種,我認(rèn)為在該示例中已經(jīng)沒有增加角色的必要了,而authorities是肯定要增加的,我想讓只有 用戶”能夠添加文章,只有 管理員能夠刪除文章,所以在 authorities表中增加如下兩行:除文章);建立authorities表和roles表的聯(lián)系,用戶可以添加文章,管理員當(dāng)然也能夠添加文章,而只有管理員能夠刪除文章,所以在數(shù)據(jù)庫(kù)中添加如下三行:insert into ROLES_AUTHORITIES values(1,5);insert into ROLES_AUTHORITIES values(1,6);insert intoROLES AUTHORITIESvalues(2,5);再來看看需要保護(hù)的資源,它們應(yīng)該分別為article.action、articlednput.action 、article!save.action 、article!delete.action ,其中只有后面三個(gè)需要保護(hù),因此在數(shù)據(jù)庫(kù)中添 加如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論