




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
{管理信息化SCM供應(yīng)鏈管理}SCM項(xiàng)目手把手開(kāi)發(fā)文檔1SCM項(xiàng)目手把手開(kāi)發(fā)文檔作者:劉長(zhǎng)炯日期:2008-9-16版本:1.01SCM項(xiàng)目手把手開(kāi)發(fā)文檔11編寫(xiě)目的32搭建基本開(kāi)發(fā)環(huán)境32.1安裝JDK和MyEclipse5.5/6.0/6.532.2下載和安裝Tomcat32.3安裝MySQL5.0/6.0數(shù)據(jù)庫(kù)42.4安裝MySQL客戶端管理軟件NavicatLite(可選)42.5安裝和配置郵件服務(wù)器(可選)52.6創(chuàng)建數(shù)據(jù)庫(kù)和表62.6.1創(chuàng)建數(shù)據(jù)庫(kù)62.6.2創(chuàng)建數(shù)據(jù)庫(kù)表62.7準(zhǔn)備必要的類(lèi)庫(kù)文件63開(kāi)發(fā)項(xiàng)目73.1創(chuàng)建myscm2Web項(xiàng)目73.2加入必要的JAR類(lèi)庫(kù)83.3導(dǎo)入JSP頁(yè)面文件93.4修改加入Struts2過(guò)濾器93.5設(shè)置Hibernate全局配置文件103.6創(chuàng)建項(xiàng)目包結(jié)構(gòu)113.7開(kāi)發(fā)通用工具類(lèi)123.7.15Bean123.7.2.MailSender123.7.3133.8開(kāi)發(fā)實(shí)體類(lèi)和HBM文件133.9開(kāi)發(fā)DAO層153.9.1HibernateSessionFactory153.9.2BaseDAO163.9.3OpenSessionInViewFilter163.10開(kāi)發(fā)用戶模塊173.10.1BaseActionSupport(可選)173.10.2UserAction類(lèi)摘要設(shè)計(jì)193.10.3Struts2通配符方式配置203.10.4用戶列表功能203.10.5刪除213.10.6表單AJAX驗(yàn)證功能213.10.7注冊(cè)213.10.8激活233.10.9用戶登錄233.10.10用戶注銷(xiāo)233.10.11修改用戶自己資料243.10.12取回密碼243.10.13修改個(gè)人密碼25
3.10.14根據(jù)ID查看用戶信息253.11開(kāi)發(fā)安全過(guò)濾器模塊253.12開(kāi)發(fā)后臺(tái)管理模塊(此模塊建議作為練習(xí))26
3.12.1前臺(tái)設(shè)計(jì)263.12.2用戶管理概要設(shè)計(jì)27
用戶搜索2添加新用戶2瀏覽所有用戶2刪除用戶283.13站點(diǎn)全局配置及加載28
加載2修改283.14安全中心303.14.1頁(yè)面設(shè)計(jì)303.14.2添加新角色303.14.3瀏覽所有角色303.14.4添加資源訪問(wèn)許可303.14.5瀏覽所有資源訪問(wèn)許可304供應(yīng)商和商品模塊304.1商店首頁(yè)面304.2供應(yīng)商模塊324.2.1類(lèi)設(shè)計(jì)324.2.2注冊(cè)供應(yīng)商用戶324.2.3添加供應(yīng)商(TODO供應(yīng)商審批,隸屬于交易員模塊)324.2.4查看我的供應(yīng)商列表324.2.5查看所有供應(yīng)商列表334.2.6查看分成總額334.3商品模塊334.3.1類(lèi)設(shè)計(jì)334.3.2頁(yè)面設(shè)計(jì)344.3.3添加商品354.3.4瀏覽商品信息354.3.5瀏覽我的商品列表354.3.6瀏覽商品列表354.3.7修改商品信息354.3.8商品搜索355購(gòu)物車(chē)模塊355.1頁(yè)面設(shè)計(jì)356程序開(kāi)發(fā)調(diào)試交流366.1NoresultdefinedforactionXXXandresultsuccess(input)的真正錯(cuò)誤原因366.2排除法376.2.1排除瀏覽器及瀏覽器版本的因素376.2.2排除多余屬性的干擾376.2.3JDK運(yùn)行版本和開(kāi)發(fā)工具編譯器版本是否匹配?386.2.4重新發(fā)布Web應(yīng)用或者復(fù)制新的JAR/Class文件了嘛?396.2.5Hibernate的包加完整了嘛?396.2.6別的類(lèi)似項(xiàng)目是否能正常運(yùn)行?406.2.7perties是我們的好朋友406.2.8人不如新,衣不如舊416.2.9把能正確運(yùn)行的項(xiàng)目的jar包集中起來(lái),分門(mén)別類(lèi)放置416.3關(guān)聯(lián)程序源碼426.4JDK6和Struts2沖突的問(wèn)題真實(shí)原因及解決辦法426.5使用UTF-8或者GBK編碼的MySQL實(shí)例486.6另外一個(gè)HibernateSessionFactory事務(wù)的異常506.7MySQL安裝版停止運(yùn)行506.8MyEclipse不會(huì)自動(dòng)刪除項(xiàng)目里面已經(jīng)去掉的JAR506.9MySQL導(dǎo)出完整的建表語(yǔ)句516.10Struts2不要加所有的JAR文件,否則項(xiàng)目會(huì)報(bào)錯(cuò)511編寫(xiě)目的時(shí)參考。開(kāi)發(fā)時(shí)遵循的原則為盡量簡(jiǎn)單并提高代碼復(fù)用,減少重復(fù)的代碼。2搭建基本開(kāi)發(fā)環(huán)境2.1安裝JDK和MyEclipse5.5/6.0/6.5本項(xiàng)目需要JDK1.5(不要使用JDK1.6,因?yàn)榘l(fā)現(xiàn)可能會(huì)導(dǎo)致BUG發(fā)生而無(wú)法載入Struts2MyEclipse5.5或者更高版本開(kāi)發(fā),用其他工具例如EclipseJavaEE版本也可,主要用到JSP編輯器及Web項(xiàng)目發(fā)布功能。2.2下載和安裝Tomcat安裝好Tomcat6.0(或者5.5及更高版本)注意:由于Struts2和Tomcat5.0有沖突,因此不能用Tomcat5.Tomcat是一款開(kāi)源免費(fèi)的JSP服務(wù)器,可以在.org/下載并安裝。建議下載壓縮包版本(文件名是apache-tomcat-6.x.WindowsServiceInstaller的EXEc:\apache-tomcat-6.0.14,和JDK的安裝一樣,為了避免日后產(chǎn)生問(wèn)題錯(cuò)誤,解壓縮的路徑不要帶有空格,如c:\ProgramFiles。2.3安裝MySQL5.0/6.0數(shù)據(jù)庫(kù)可以訪問(wèn)MySQL官方網(wǎng)站下載原版安裝程序和JDBC驅(qū)動(dòng),請(qǐng)?jiān)L問(wèn):6.0.#win32,下載安裝包(如文件mysql-essential-6.0.5-alpha-win32.msi)雙擊進(jìn)行安裝,在最后一個(gè)屏幕點(diǎn)擊啟動(dòng)ConfiguretheMySQLServernow啟動(dòng)實(shí)例配置工具即可,如下圖所示。配置過(guò)程請(qǐng)參考視頻mysql_server_。此向?qū)б部梢酝ㄟ^(guò)選擇菜單開(kāi)始>所有程序>MySQL>MySQLServer6.0>MySQLServerInstanceConfigWizard來(lái)打開(kāi)。2.4安裝MySQL客戶端管理軟件NavicatLite(可選)MySQL管理工具,導(dǎo)航貓免費(fèi)版(NavicatLite),可獲得不低于SQLServer的易用度,例如可視化建表,修改表結(jié)構(gòu),創(chuàng)建外鍵,修改數(shù)據(jù),執(zhí)行查詢等功能,此軟件的中文版可以在下載*非商業(yè)-免費(fèi)精簡(jiǎn)版。2.5安裝和配置郵件服務(wù)器(可選)我們使用的本機(jī)測(cè)試郵件服務(wù)器為ForwardMailServer,啟動(dòng)后的郵箱登錄頁(yè)面是。在開(kāi)始菜單中可啟動(dòng)郵件服務(wù)器配置工具,然后添加一個(gè)itcast的域名,之后再點(diǎn)擊左側(cè)導(dǎo)航中的本地郵箱,添加必要的測(cè)試用郵箱地址。2.6創(chuàng)建數(shù)據(jù)庫(kù)和表2.6.1創(chuàng)建數(shù)據(jù)庫(kù)使用任意軟件連接至MySQL服務(wù)器,然后創(chuàng)建數(shù)據(jù)庫(kù)myscm。2.6.2創(chuàng)建數(shù)據(jù)庫(kù)表執(zhí)行文件來(lái)創(chuàng)建應(yīng)用程序運(yùn)行所需的表和基本數(shù)據(jù)。2.7準(zhǔn)備必要的類(lèi)庫(kù)文件系統(tǒng)基于Struts2+Hibernate+MySQLJava和Web層類(lèi)庫(kù):Struts2*Hibernate3MySQLJDBC驅(qū)動(dòng)JavaMail+JAF(Java激活框架JavaActivationFramework,Java對(duì)象變成字符串形式來(lái)傳播)*JSTL類(lèi)庫(kù)(可從apache-tomcat-6.0.14\webapps\examples\WEB-INF\lib下找到)Commons-(以及Commons-IO)注:加*的包可使用MyEclipse自帶的類(lèi)庫(kù)。Web框架(跨瀏覽器)FckEditor可視化編輯HTMLXLoadTree動(dòng)態(tài)加載XML生成JavaScript樹(shù)組件jQueryAJAX框架-查詢DOM對(duì)象,簡(jiǎn)潔,現(xiàn)成控件較少ExtJS比較全面的AJAX框架樹(shù),菜單,表格編輯器(Grid)學(xué)習(xí)比較困難-->顯示公告(頁(yè)面內(nèi)彈出窗口)1.導(dǎo)入CSS和EXT的JS2.寫(xiě)3.寫(xiě)入功能代碼EasyValidation表單驗(yàn)證框架3開(kāi)發(fā)項(xiàng)目3.1創(chuàng)建myscm2Web項(xiàng)目選擇菜單File>New>WebProject,輸入項(xiàng)目名myscm2,選擇J2EE1.4。注意:不要選擇JavaEE5,因?yàn)闀?huì)導(dǎo)致JavaMail類(lèi)庫(kù)沖突。3.2加入必要的JAR類(lèi)庫(kù)將必須的JAR包復(fù)制到WEB-INF/lib下。Hibernate的類(lèi)庫(kù)可以通過(guò)點(diǎn)擊菜單MyEclipse>AddHibernateCapabilities..來(lái)添Hibernate全局配置文件。struts2-blank-.war->5個(gè)基本的Struts2JARstruts2-showcase-.war->和IOJSTL從tomcat下找webapps\examples\WEB-INF\libMYSQL驅(qū)動(dòng)Hibernate的包3.3導(dǎo)入JSP頁(yè)面文件為了節(jié)約時(shí)間,JSP文件我們將不再一一從頭開(kāi)發(fā)。將項(xiàng)目所需的頁(yè)面和相關(guān)資源從myscm項(xiàng)目中復(fù)制到本項(xiàng)目的WebRoot帶了CVS版本控制信息,可在項(xiàng)目上選擇上下文菜單Team>Disconnect...來(lái)解決此問(wèn)題。CVS版本控制,后面會(huì)介紹。3.4修改加入Struts2過(guò)濾器<!--Struts2過(guò)濾器--><filter><filter-name>struts2</filter-name><filter-class>.struts2.</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.5設(shè)置Hibernate全局配置文件創(chuàng)建文件src\.xml,修改文件中的數(shù)據(jù)庫(kù)連接信息:<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-/HibernateConfigurationDTD3.0//EN"""><hibernate-configuration><session-factory><propertyname="dialect">.</property><propertyname="">jdbc:mysql://localhost:3306/beanscm?useUnicode=true&characterEncoding=GBK</property><propertyname="">root</property><propertyname="">1234</property><propertyname="_class">.</property><propertyname="show_sql">true</property><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/></session-factory></hibernate-configuration>請(qǐng)將代碼中紅色內(nèi)容修改為您自己的數(shù)據(jù)庫(kù)連接IP,用戶名和密碼。自動(dòng)建表,INDEX不推薦。手工建表。3.6創(chuàng)建項(xiàng)目包結(jié)構(gòu)建議的包命名的規(guī)則是:公司域名.模塊名.子模塊名3.7開(kāi)發(fā)通用工具類(lèi)這些類(lèi)和具體的業(yè)務(wù)無(wú)關(guān),因此我們要單獨(dú)開(kāi)發(fā)以下的幾個(gè)類(lèi)。3.7.15BeanMD5摘要計(jì)算難點(diǎn):獲取MD5算法和轉(zhuǎn)16進(jìn)制字符串顯示。3.7.2.MailSender郵件發(fā)送難點(diǎn):(.TO,InternetAddress.parse(getTo()));if(isHtmlFormat()){(getBody(),"text/;charset=GBK");}else{(getBody());}發(fā)附件-->發(fā)一個(gè)動(dòng)態(tài)的保單JPG過(guò)程:創(chuàng)建連接屬性對(duì)象Propertiesprops=newProperties();(".protocol","smtp");//協(xié)議,必須設(shè)置后邊的屬性是可選的//(".host","localhost");//服務(wù)器地址(".port","25");//SMTP服務(wù)器端口("","true");//是否為調(diào)試模式創(chuàng)建Session對(duì)象(props)創(chuàng)建MimeMessage對(duì)象newMimeMessage(session)設(shè)置郵件相關(guān)信息使用Transport對(duì)象發(fā)送消息();connect();send();用來(lái)解決Tomcat表單提交亂碼問(wèn)題(GET方法提交亂碼)難點(diǎn):HttpServletRequestWrapper和字符串編碼轉(zhuǎn)換加入到并編寫(xiě)一個(gè)JSP頁(yè)面進(jìn)行測(cè)試。3.8開(kāi)發(fā)實(shí)體類(lèi)和HBM文件實(shí)體類(lèi)和HBM文件可用MyEclipse生成,具體方法參考本人所著的免費(fèi)電子書(shū)《MyEclipse6Java開(kāi)發(fā)中文教程》的7.4.5使用反向工程快速生成JavaPOJO類(lèi),映射文件和DAO一節(jié)。當(dāng)然作為學(xué)習(xí)者來(lái)說(shuō),推薦嘗試自己來(lái)手寫(xiě)HBM文件和Entity類(lèi),但是實(shí)際開(kāi)發(fā)時(shí)一般都是用工具生成。難點(diǎn)(一對(duì)多和多對(duì)一):.xml<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-/HibernateMappingDTD3.0//EN"""><hibernate-mapping><classname="..Role"table="scm_role"catalog="myscm"><idname="id"type=".Integer"><columnname="ID"/><generatorclass="native"></generator></id><propertyname="roleName"type=".String"><columnname="role_name"length="200"/></property><setname="scmResources"inverse="true"><key><columnname="role_id"/></key><one-to-manyclass="..Resource"/></set></class></hibernate-mapping>.xml<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-/HibernateMappingDTD3.0//EN"""><hibernate-mapping><classname="..Resource"table="scm_resource"catalog="myscm"><idname="id"type=".Integer"><columnname="ID"/><generatorclass="native"></generator></id><many-to-onename="scmRole"class="..Role"fetch="select"><!—抓取策略,join,lazy--><columnname="role_id"/></many-to-one><propertyname="uri"type=".String"><columnname="uri"length="200"/></property><propertyname="addDate"type=".Date"><columnname="add_date"length="19"not-null="true"/></property><propertyname="note"type=".String"><columnname="note"length="200"/></property>
</class></hibernate-mapping>您應(yīng)該了解下列內(nèi)容:實(shí)體類(lèi)都有什么限制?為什么?JavaBean:無(wú)參數(shù)的構(gòu)造器。要有g(shù)etter和setter,屬性應(yīng)為private。實(shí)體類(lèi)extendsJavaBean:必須實(shí)現(xiàn).SerializablefinalID屬性和至少一個(gè)屬性,推薦實(shí)現(xiàn)hashCode()和equals()方法。把HBM文件加入到.xml中。3.9開(kāi)發(fā)DAO層3.9.1HibernateSessionFactory跨線程的對(duì)Session進(jìn)行統(tǒng)一打開(kāi)和關(guān)閉,可配合Filter實(shí)現(xiàn)同一次訪問(wèn)實(shí)現(xiàn)自動(dòng)管理Session和事務(wù).DAO:load()->openSession()讀取數(shù)據(jù)->closeSession()-->JSP-->ThreadLocal+Filter解決Spring提供了方案OpenSessionInViewFilterlazy=false//不推薦fetch=”join”//不推薦(entity);query有個(gè)關(guān)鍵字fetch,fromUserfetch...???1.創(chuàng)建SessionFactory2.創(chuàng)建staticThreadLocal<Session>變量3.編寫(xiě)獲取Session和關(guān)閉Session的方法4.編寫(xiě)事務(wù)處理的方法:開(kāi)始,提交,回滾3.9.2BaseDAO小延伸:Hibernate中分頁(yè)相關(guān)的對(duì)象和方法是哪些?一萬(wàn)條記錄,從第200條開(kāi)始讀到第20條.publicQuerysetFirstResult(intfirstResult);設(shè)置開(kāi)始讀取的行數(shù)publicQuerysetMaxResults(intmaxResults);設(shè)置最多讀取的記錄數(shù)Queryq=s.createQuery(“fromUser”);returnq.setFirstResult(200).setMaxResults(20).list();200=每頁(yè)顯示20條*當(dāng)前頁(yè)10,每頁(yè)顯示幾條練習(xí):寫(xiě)一個(gè)支持分頁(yè)的查詢方法ListpagedQuery(Stringhql,intcurrentPage,intpageSize,Object...params)SQL:列別名selectsum(login_count)as'登錄總次數(shù)'fromscm_user3.9.3OpenSessionInViewFilter實(shí)現(xiàn)的功能:執(zhí)行后續(xù)的Filter和Servlet/JSP時(shí),首先打開(kāi)事務(wù),然后提交事務(wù),如果出現(xiàn)異常則回滾事務(wù),還解決了JSP頁(yè)面lazy載入數(shù)據(jù)時(shí)發(fā)現(xiàn)session被關(guān)閉的問(wèn)題.注意:此Filter必須加在所有的Filter之前,包括Struts2Filter,否則可能出現(xiàn)無(wú)法正常提交事務(wù)的問(wèn)題(已經(jīng)有人遇到過(guò)此問(wèn)題導(dǎo)致無(wú)法正常注冊(cè)).try{1.打開(kāi)session并開(kāi)始事務(wù)2.向后執(zhí)行ServletChain,包括后續(xù)DAO和Action等(request,response);3.提交事務(wù)}catch(Exceptione){4.回滾事務(wù)5.顯示出錯(cuò)信息}finally{6.關(guān)閉session}注冊(cè)到.3.10開(kāi)發(fā)用戶模塊3.10.1BaseActionSupport(可選)此類(lèi)提供一些通用的功能,包括獲取Request對(duì)象,獲取參數(shù),獲取屬性,DAO等,這個(gè)類(lèi)完全是可選的.屬性列表:baseDAO基本的DAO對(duì)象;title,標(biāo)題;message屬性;resetMessages()-->重置title標(biāo)題和message需要注意的方法:mergeParamsAsURI()/***將所有URL參數(shù)合并成一個(gè)URL字符串(page參數(shù)除外),提供分頁(yè)時(shí)顯示.?page=3¶1=11¶2=bb==>?page=3¶1=11¶2=bb&page=3+1下一頁(yè)*@return字符串,如:para1=11¶2=bb*/publicStringmergeParamsAsURI(){Map<String,String[]>params=getRequest().getParameterMap();for(Stringvalue:values){.println("value="+value);(.(key,"UTF-8")+"=");(.(value,"UTF-8")+"&");}//刪除末尾多余的&字符if(().endsWith("&")){(()-1);}/***獲取當(dāng)前會(huì)話的登錄用戶信息*@returnUser*/publicUsergetSessionLoginedUser(){UsercurrentUser=(User)getSession("loginedUser");returncurrentUser;}3.10.2UserAction類(lèi)摘要設(shè)計(jì)文件上傳相關(guān)的屬性:,Stringphoto;photo是表單域的名字.1.JDK版本2.JAR包沖突XML解析器Hibernate前臺(tái):<formmethod="post"enctype="multipart/form-data">頭像:<inputtype="file"id=”photo”name="photo"class="validate-"onchange=”=;”><br>如何預(yù)覽頭像?!(IE瀏覽器比較容易實(shí)現(xiàn),其他的沒(méi)保證,安全I(xiàn)E6可以,IE7和其他瀏覽器可以通過(guò)降低安全級(jí)來(lái)實(shí)現(xiàn))<imgid=”uploadPreview”src=”空?qǐng)D->logo”>=;3.10.3Struts2通配符方式配置采用此配置可以大大減少代碼量,Struts1中沒(méi)有對(duì)等的內(nèi)容.<actionname=”*”class=”UserAction”method=”{1}”><resultname=”message”>/</result><resultname=”listUser”></result>的寫(xiě)法可以從Struts2完整包struts2-blank-.wardelete>list<resulttype=”dispatcher”></result>重定向到另一個(gè)Action<resulttype=”redirectAction”>list(Action的name)</result>Result重定向到另一個(gè)地址<resulttype=”redirect”>/</result>3.10.4用戶列表功能user/>()>list(){1.查詢記錄得到數(shù)據(jù)集合results2.setAttribute(‘屬性名’,results)3.return結(jié)果名}<c:forEachitems=‘屬性名’var=’user’>${}刪除user/?id=${}修改user/?id=${}</c:forEach>3.10.5刪除user/?id=3>()>/1.findById()->Useruser;2.(user);3.10.6表單AJAX驗(yàn)證功能前臺(tái)寫(xiě)法:用戶名:<inputname=""class="requiredvalidate-ajax-user/"><br>后臺(tái)寫(xiě)法:StringajaxValidate1.用戶名敏感詞禁止注冊(cè)BadWordsFilter2.用戶名唯一3.Email唯一4.圖片驗(yàn)證碼合法Action配置:<resultname=’ajaxResponse’>/ajax_</result>/ajax_${message}3.10.7注冊(cè)/+/+EasyValidation>reg()>/(可用Servlet代替)生成驗(yàn)證碼1.設(shè)置頁(yè)面內(nèi)容類(lèi)型為圖片2.清空以前緩沖區(qū)3.創(chuàng)建彩色緩沖圖4.獲取圖形(畫(huà)筆)對(duì)象5.填充白色的背景6.隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到(可選)7.繪制顏色為紅色8.生成隨機(jī)數(shù)字驗(yàn)證碼并存入session,然后輸出到圖片中9.設(shè)定字體10.繪制驗(yàn)證碼到圖片上11.關(guān)閉對(duì)象,釋放內(nèi)存,刷新到圖形對(duì)象12.使用ImageIO把內(nèi)存的圖片編碼到輸出流,參數(shù)依次為:圖片對(duì)象,格式(png,jpg),輸出流難點(diǎn)(可復(fù)制粘貼):<%!ColorgetRandColor(intfc,intbc){//給定范圍獲得隨機(jī)顏色Randomrandom=newRandom();if(fc>255)fc=255;if(bc>255)bc=255;intr=fc+(bc-fc);intg=fc+(bc-fc);intb=fc+(bc-fc);returnnewColor(r,g,b);}%>//隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到g.setColor(getRandColor(160,200));for(inti=0;i<155;i++){intx=(100);inty=(20);intxl=(12);intyl=(12);g.drawLine(x,y,x+xl,y+yl);}reg()–注冊(cè)方法1.檢查session驗(yàn)證碼和表單參數(shù)中是否一致2.檢查輸入的驗(yàn)證碼3.用戶名敏感詞禁止注冊(cè)4.密碼MD5保存5.保存注冊(cè)日期6.設(shè)置激活狀態(tài)為false7.生成一個(gè)激活碼activeCode并存入數(shù)據(jù)庫(kù)UUID8.重命名文件并保存上傳的圖片到/upload9.獲取/upload真實(shí)路徑10.重命名為uuid.擴(kuò)展名11.()快速?gòu)?fù)制文件12.更新頭像的存儲(chǔ)路徑到實(shí)體類(lèi)13.發(fā)送激活郵件StringactiveURL="myscm2?code="+activeCode;Stringmessage="<><body>您注冊(cè)了新用戶,激活碼是:"+activeCode+",可點(diǎn)擊此地址激活賬戶:"+"<ahref='"+activeURL+"'>"+activeURL+"</a>"+"</body></>";返回注冊(cè)結(jié)果頁(yè)面3.10.8激活activation()>從表單參數(shù)讀取激活碼根據(jù)UUID激活碼找到當(dāng)前用戶fromUserwheretempcode=?檢查激活狀態(tài),如果已經(jīng)激活,就提示他無(wú)需重復(fù)激活更新激活標(biāo)志位(active)到數(shù)據(jù)庫(kù)返回成功激活/失敗信息3.10.9用戶登錄>login()>1.對(duì)密碼進(jìn)行MD5摘要計(jì)算2.是否存在給定用戶(根據(jù)用戶名查找)檢查是否激活!3.如果用戶存在,比較用戶名,密碼和用戶類(lèi)型4.登錄成功用戶信息存入Session-->loginedUser更新登錄次數(shù)5.顯示登錄結(jié)果6.根據(jù)用戶類(lèi)型轉(zhuǎn)向不同的功能頁(yè)面1.管理員轉(zhuǎn)向2.其他用戶轉(zhuǎn)向/3.10.10用戶注銷(xiāo)清空session或者invalidatesession3.10.11修改用戶自己資料user/>update()>如果是后臺(tái)管理,需要根據(jù)ID查出用戶的信息修改的步驟:1.從Action查出用戶的信息editUI()1.findById()->Useruser;2.setAttribute(‘user’,user)3.返回到2.顯示修改表單頁(yè)面user/<formaction=‘user/’>-->根據(jù)ID修改用戶(后臺(tái)),修改自己的就不需要<inputtype=”hidden”name=””value=”${}”>...只修改了一部分字段3.提交到Action來(lái)更新數(shù)據(jù)update(){1.數(shù)據(jù)庫(kù)找findById()->Useruser;老記錄(根據(jù)ID改才需要)2.先設(shè)置user部分字段的新信息,再u(mài)pdate()如果頭像不為空,需要先刪掉老頭像,再保存新頭像并更新到數(shù)據(jù)庫(kù)3.轉(zhuǎn)向message/}4.顯示修改結(jié)果(成功/失敗)3.10.12取回密碼>()+發(fā)郵件給用戶>Email有效性檢查根據(jù)Email找到用戶信息生成一個(gè)隨機(jī)的密碼并MD5摘要后更新到數(shù)據(jù)庫(kù)發(fā)送取回密碼通知郵件+提示用戶去檢查郵箱3.10.13修改個(gè)人密碼user/>()>檢查舊密碼不能為空,新舊密碼必須一致,長(zhǎng)度限制1.確保用戶登錄2.取出已登錄用戶信息3.檢查用戶輸入的舊密碼(MD5)是否正確4.新密碼MD5存入數(shù)據(jù)庫(kù)5.更新下session里面的loginedUser對(duì)象6.提示更新成功+用戶通知郵件(TODO)3.10.14根據(jù)ID查看用戶信息findById()>user/fromUserwhereid=?用戶信息存入request的attribute:setUser(u);轉(zhuǎn)向前臺(tái)頁(yè)面用EL顯示3.11開(kāi)發(fā)安全過(guò)濾器模塊自底而上的控制方式/目錄/文件名ROLE,/目錄/文件名ROLE,/目錄/*四個(gè)路徑變量,四個(gè)HQL,四個(gè)boolean值分別對(duì)應(yīng)HQL的執(zhí)行結(jié)果,有記錄就是true四個(gè)路徑變量1.請(qǐng)求上下文路徑contextPath/myscm22.請(qǐng)求路徑requestPathadmin/3.資源相對(duì)路徑resourceUri=(())-->4.目錄通配符路徑folderUri->*取到RoleID四個(gè)HQL資源訪問(wèn)檢查的順序是(以訪問(wèn)為例):1.檢查是否存在允許訪問(wèn)的角色à條件1;àtrueselectcount(*)fromresourcewhereuri=''2.檢查是否存在允許訪問(wèn)*的角色à條件2;àtrueselectcount(*)fromresourcewhereuri='*'3.如果條件1和條件2都不存在,則允許任何角色訪問(wèn)此URL;4.如果條件1或條件2之一存在,那么只有允許的角色才可訪問(wèn)此URL,進(jìn)入5;5.檢查是否存在允許當(dāng)前角色訪問(wèn)的記錄,是則運(yùn)行訪問(wèn),否則進(jìn)入下一步;selectcount(*)fromresourcewhereuri=''androleId=-16.檢查是否存在允許當(dāng)前角色訪問(wèn)*的記錄,是則允許訪問(wèn),否則禁止用戶訪問(wèn)并顯示出錯(cuò)信息.selectcount(*)fromresourcewhereuri='*'androleId=-13.12開(kāi)發(fā)后臺(tái)管理模塊(此模塊建議作為練習(xí))3.12.1前臺(tái)設(shè)計(jì)技術(shù)細(xì)節(jié):XLoadTree實(shí)現(xiàn)樹(shù)狀組件text標(biāo)簽src指向另一個(gè)xml樹(shù)定義action超鏈接地址icon目錄/節(jié)點(diǎn)展開(kāi)前的圖片openIcon目錄展開(kāi)后的圖片target超鏈接的目標(biāo)框架(文檔中沒(méi)有)可視化HTML編輯器:FckEditor<metahttp-equiv="Content-Type"content="text/;charset=utf-8"/><scripttype="text/javascript"src="fckeditor/"></script><scripttype="text/javascript">=function(){varsBasePath="fckeditor/";//指向fckeditor的存放目錄varoFCKeditor=newFCKeditor('要替換的文本區(qū)表單域的名字');='500px';//高度,可以用100%//='400px';//寬度=sBasePath;//設(shè)置基礎(chǔ)路徑['SkinPath']='.office2003/';//換膚,查看fckeditor\editor\skins下的皮膚目錄名//='Default';//切換工具條配置,默認(rèn)為完全,Basic是簡(jiǎn)潔模式,可以用來(lái)發(fā)評(píng)論時(shí)['FullPage']=true;//指定編輯的HTML代碼是否包括<>完整標(biāo)記,可用來(lái)做內(nèi)容管理時(shí)發(fā)布完整HTML頁(yè)面();//替換文本區(qū)為可視化網(wǎng)頁(yè)編輯器}</script>3.12.2用戶管理概要設(shè)計(jì)備注:為了復(fù)用一些方法,此類(lèi)應(yīng)繼承自UserAction.用戶搜索admin/user_>()>admin/user_添加新用戶admin/user_>()>/瀏覽所有用戶()>admin/user_此模塊已實(shí)現(xiàn),但應(yīng)用戶列表頁(yè)面應(yīng)稍作修改,不顯示刪除管理員的鏈接,可復(fù)用父類(lèi)UserAction中的方法刪除用戶?id=[編號(hào)]>deleteUser()不能刪除管理員自己3.13站點(diǎn)全局配置及加載加載可用Listener;或者load-on-startup為0的servlet實(shí)現(xiàn);Filter的init()方法來(lái)啟動(dòng)時(shí)載入.1.讀取第一條AppConfig實(shí)體類(lèi)2.信息存入application:("appConfig",appConfig)3.分析敏感詞列表并存入BadWordsFilter對(duì)象((“\r\n”))最后注冊(cè)到頁(yè)面的頭文件中:${}-${title}修改頁(yè)面設(shè)計(jì):直接提交到JSP進(jìn)行更新即可.admin/app_>appconfig_1.更新數(shù)據(jù)庫(kù)2.更新Application中的對(duì)象(可直接調(diào)用Listener中的現(xiàn)成方法)3.重新解析并設(shè)置敏感詞列表4.轉(zhuǎn)向修改頁(yè)面3.14安全中心3.14.1頁(yè)面設(shè)計(jì)3.14.2添加新角色3.14.3瀏覽所有角色3.14.4添加資源訪問(wèn)許可3.14.5瀏覽所有資源訪問(wèn)許可4供應(yīng)商和商品模塊4.1實(shí)體關(guān)系SCM_USER用戶表,N個(gè)Vendor,OrderVendor供應(yīng)商表,N個(gè)ProductProduct商品表SCM_Order訂單表,N個(gè)OrderItemSCM_Order_Item訂單項(xiàng)表,N個(gè)ProductApp_Config全局設(shè)置表SCM_Role角色表,對(duì)應(yīng)N個(gè)ResourceSCM_Resource資源訪問(wèn)權(quán)限表4.2功能分析4.3商店首頁(yè)面用到的技術(shù):跨瀏覽器純CSS菜單4.4供應(yīng)商模塊4.4.1類(lèi)設(shè)計(jì)此類(lèi)基本類(lèi)同于UserAction.4.4.2建表,編寫(xiě)實(shí)體和HBM文件并注冊(cè)到.xmlVendor,Product,Order,OrderItemHBM文件沒(méi)改catalog.4.4.3添加Struts2Action配置4.4.4注冊(cè)供應(yīng)商用戶注冊(cè)時(shí)選擇供應(yīng)商用戶即可,參見(jiàn)用戶模塊.4.4.5添加供應(yīng)商(TODO供應(yīng)商審批,隸屬于交易員模塊)輸入供應(yīng)商信息vendor/>()>頁(yè)面設(shè)計(jì):4.4.6查看我的供應(yīng)商列表myList()>vendor/1.fromVendorwhere=當(dāng)前登錄用戶的ID2.查詢結(jié)果放入setAttribute(“vendors”,result);3.轉(zhuǎn)向”list”4.4.7查看所有供應(yīng)商列表list()>vendor/限制條件:只顯示審批過(guò)的供應(yīng)商列表1.fromVendorwhereaudited=true2.查詢結(jié)果放入setAttribute(“vendors”,result);3.頁(yè)面用<c:forEach4.4.8查看供應(yīng)商詳細(xì)信息vendor/?id=[編號(hào)]>findById()>vendor/1.findById(,ID)->Vendorv2.查詢結(jié)果放入setVendor(v)3.轉(zhuǎn)向”findById”4.4.9修改供應(yīng)商信息限制:可以修改,但是修改后自動(dòng)變成未審批狀態(tài),最后修改日期我的供應(yīng)商列表vendor/?id=${}>editUI()>vendor/>update()>日志表:功能,操作對(duì)象,日期,操作人,操作結(jié)果管理員日志表editUI()類(lèi)似于findById()-->result不一樣1.數(shù)據(jù)有效驗(yàn)證2.無(wú)權(quán)修改不屬于自己的供應(yīng)商信息update()1.DAO的update()2.TODO如果有頭像,刪除老的,再存入新的頭像!!設(shè)置狀態(tài)為未審批!!3.return“message”修改成功4.4.10根據(jù)名字查找供應(yīng)商列表頁(yè)面:快速通道下方?vend_name=microsoft>findListByName()>vendor/需求:模糊查找"fromVendorwherenamelike'%"+name+"%'"單個(gè)字符是select*fromscm_userwherenamelike'__a%'第三個(gè)字符是a的記錄如果記錄名有單引號(hào),查詢語(yǔ)句:select*fromscm_userwherenamelike'a''dmin'Stringname=(“’”,“’’”);1.去參數(shù)2.過(guò)濾單引號(hào)3.生成HQL并查詢4.查詢結(jié)果放入request5.轉(zhuǎn)向list4.4.11查看分成總額viewDenductSum()>"selectsum(o.deduct)fromOrderItemo..id="+userId此模塊要在商品模塊完成后再做4.4.12修改分成合并到修改商品信息功能即可同交易員功能模塊的商品打折分成調(diào)整,留作練習(xí).不同點(diǎn):修改之后商品應(yīng)進(jìn)入未審批狀態(tài).4.5商品模塊商品模塊主要包括:1.添加2.修改-->修改定價(jià),打折和分成;修改商品基本信息3.刪除4.模糊查找5.精確查找6.查看商品的詳細(xì)信息7.列出所有商品4.5.1類(lèi)設(shè)計(jì)Vendor可以用交易員可以用4.5.2頁(yè)面設(shè)計(jì)4.5.3添加商品toadd()>product/>add()>message三級(jí)級(jí)聯(lián)菜單省市縣1.JS把值事先都讀出來(lái),然后onchange來(lái)觸發(fā)選擇2.AJAX異步加載(推薦)需要預(yù)先讀出我的Vendor列表信息,顯示添加頁(yè)面,添加完成顯示添加結(jié)果toadd()1.生成查詢語(yǔ)句,得到我的供應(yīng)商列表select*fromVendorvwherev.=${}setAttribute(“vendors”,result)2.轉(zhuǎn)向add顯示一個(gè)供應(yīng)商下拉列表add()1.保存()2.狀態(tài)設(shè)置為未審批轉(zhuǎn)向添加結(jié)果頁(yè)面2008-09-2110:54:14,937ERROR[.]-Table''doesn'texist表格沒(méi)創(chuàng)建業(yè)務(wù)邏輯:后面這些就屬于.思考:照片-->商品相冊(cè)表1商品對(duì)應(yīng)0~*圖片一對(duì)多1.縮略圖2.詳細(xì)圖-->三視圖正面,側(cè)面,背面商品描述信息:多個(gè)屬性1.屬性表編號(hào)屬性名屬性度量單位1顏色2重量KG3長(zhǎng)度CM2.商品信息表編號(hào)商品編號(hào)屬性編號(hào)屬性取值111red2123313100網(wǎng)頁(yè)顯示:筆記本顏色:red重量:3KG長(zhǎng)度:100CM4.5.4瀏覽單個(gè)商品信息product/?id=商品編號(hào)>findById()>product/4.5.5瀏覽我提交的商品列表顯示所有的商品,不論審批與否product/>myList()>product/fromProductwhere.=${}4.5.6瀏覽所有商品列表(給購(gòu)物者)product/>list()>product/list()要點(diǎn):不能列出未審批的商品fromProductwhereaudited=truereturn“l(fā)ist”4.5.7修改商品信息修改:一定是當(dāng)前用戶提交的商品<c:iftest=”${.==”>修改鏈接</c:if>商品列表頁(yè)面>?id=商品編號(hào)>toedit()>>update()>message4.5.8高級(jí)商品搜索模糊查詢商品,并根據(jù)是否有庫(kù)存進(jìn)行查找?keyword=aaa>findByName()>product/[X]inc_Name名字包含__光盤(pán)__name[X]inc_Amount庫(kù)存包含_Y/N__amout[X]inc_Catalog分類(lèi)包含_操作系統(tǒng)_catalog一旦選中條件,后面值不能為空<inputtype=checkboxvalue=”inName”>(“inName”)沒(méi)選中這個(gè)值是多少?“”還是null?1)復(fù)合查詢提交到后臺(tái),然后寫(xiě)一串if-else來(lái)判斷Stringhql=“fromProduct”;Stringcondition=””;if(inc_Name!=null){condition+=“namelike‘%”+getParameter(“name”)+“%’and“;}if(inc_Amount!=null){condition+=“namelike‘%”+getParameter(“inc_Amount”)+“%’and“;}if(inc_Catalog!=null){condition+=“cataloglike‘%”+getParameter(“catalog”)+“%’and“;}//把語(yǔ)句最后的and去掉condition=(0,(“and”));if(condition不是空){hql+=“where”+condition;}fromProductwherenamelike‘%abc%’if(有庫(kù)存選項(xiàng)){+“andamount>0”;}2.用JavaScript在前臺(tái)把查詢條件拼出來(lái)成一條condition現(xiàn)成框架4.5.9查看庫(kù)存頁(yè)面流程:在左側(cè)輸入模糊的商品名,然后查看其庫(kù)存,在新頁(yè)面彈出查詢結(jié)果.>findByNameShowAmount()>product/list_findByNameShowAmount(){findByName();return“l(fā)istAmout”;}前后都可以MVC切換View層即可實(shí)現(xiàn),C保持不變<actionname=”findByNameShowAmount”class=”P(pán)roductAction”method=”findByName”><resultname=”list”>list_</result></action><actionname=”*”...//顯示Excel格式的商品列表-->方便打印,做報(bào)表HTML顯示為Excel:4.5.10銷(xiāo)量排行TOP10product/>listOrderByTotalSold()>listMVC重用V層,切換CHQL:fromProductwhereaudited=trueorderbytotalSolddesclist()每個(gè)字段都要排序列表的每個(gè)列名加排序鏈接:<ahref=”?column=name&order=desc”>商品名</a>上或者下兩個(gè)圖4.5.11商品列表輸出為Excel格式()>listExcel切換視圖層contentType=”application/-excel”頁(yè)面必須顯示一個(gè)Table,Excel會(huì)自動(dòng)作為單元格顯示JXL生成/解析ApachePOI4.5.12按供應(yīng)商瀏覽商品product/>()>product/list_by_<actionname=”listByVendor”class=”VendorAction”method=”list”><resultname=”list”>list_by_</result></action>顯示供應(yīng)商列表<ahref=”?id=供應(yīng)商ID”>微軟</a>>ProductAction.findByVendor()>listfromProductwhereaudited=trueand=ID參數(shù)點(diǎn)擊單個(gè)供應(yīng)商>顯示該供應(yīng)商提交的所有商品5購(gòu)物車(chē)模塊5.1頁(yè)面設(shè)計(jì)5.2類(lèi)設(shè)計(jì)屬性說(shuō)明://Map<商品主鍵,訂單項(xiàng)>privateMap<Long,OrderItem>items=newHashMap<Long,OrderItem>();privatedoublecost;//購(gòu)物車(chē)物品總價(jià)功能說(shuō)明:方法名說(shuō)明addItem()添加訂單項(xiàng)empty()清空購(gòu)物車(chē)getCost()物品總價(jià)格getItem()根據(jù)商品編號(hào)獲取訂單項(xiàng)getItemCount()商品件數(shù)(不是商品總個(gè)數(shù))getItems()獲得購(gòu)物車(chē)項(xiàng)目的Map列表getOrderItems()獲得購(gòu)物車(chē)中的所有訂單項(xiàng)(物品列表)isEmpty()購(gòu)物車(chē)是否為空modifyItemNumber()更改商品數(shù)目removeItemByProductId()根據(jù)編號(hào)刪除商品setItems(Map<Long,OrderItem>)設(shè)置新的列表5.3CartAction5.3.1獲取Cart對(duì)象的方法,來(lái)從session取出購(gòu)物車(chē)CartgetCart(){Cartc=getSession(“cart”);//已有購(gòu)物車(chē)對(duì)象,直接返回if(c!=null){returnc;}else{//沒(méi)有,初始化新的放入session,并返回c=newCart();setSession(“cart”,c);returnc;}}5.3.2購(gòu)物車(chē)物品列表cart/<c:forEachitems="${}"var="item">顯示購(gòu)物車(chē)訂單項(xiàng)列表用到了()5.3.3清空購(gòu)物車(chē)()>list5.3.4添加訂單項(xiàng)cart/?product_id=商品編號(hào)>()>list//如果沒(méi)有訂單項(xiàng),就創(chuàng)建新的if(cart.根據(jù)商品編號(hào)獲取訂單項(xiàng)getOrderItem(product_id)==null){找到商品創(chuàng)建新訂單項(xiàng)并設(shè)置件數(shù)}else{如果有,就更新訂單項(xiàng)的商品件數(shù)+1}return“l(fā)ist”;返回添加結(jié)果和當(dāng)前商品有幾件AJAXreturn“ajax_response”;${message}//使用AJAX方式從后臺(tái)更新商品購(gòu)買(mǎi)數(shù)量functionajaxAddItem(product_id){//異步執(zhí)行更改購(gòu)買(mǎi)數(shù)量操作("cart/?product_id="+product_id+"×tamp="+newDate().getTime(),function(data){alert(data);});}5.3.5jQuery異步加載(“url”,function(返回的HTML代碼){});-->functiondisplayTime(){("",function(data){alert("當(dāng)前服務(wù)器時(shí)間是:"+data);});}jQuery("#頁(yè)面元素ID").load("URL地址");<!--jquery,注意加載順序--><scriptsrc="..jquery-1.2.6."></script><scripttype=”text/javascript”>varjQuery=$;</script><script>functiondisplayTime(){("",function(data){alert("當(dāng)前服務(wù)器時(shí)間是:"+data);});jQuery("#time").load("");}</script></head><body><inputtype="button"onclick="displayTime()"value="查看時(shí)間">顯示時(shí)間:<divid="time"></div></body></>5.3.6購(gòu)物車(chē)移出商品?product_id=商品編號(hào)>()>重定向到cart/防止用戶重復(fù)通過(guò)GET方式刪除購(gòu)物車(chē)訂單項(xiàng)5.3.7定時(shí)刷新購(gòu)物車(chē)件數(shù)(所有頁(yè)面和)1.分一個(gè)頁(yè)面元素cartItemCount-->inc_<spanid=”cartItemCount”>${}</span>件2.JavaScript定時(shí)setInterval(“表達(dá)式”或者function(),定時(shí)毫秒數(shù))-->周期性的定時(shí)setTimeout(“表達(dá)式”或者function(),超時(shí)毫秒數(shù))-->過(guò)一定時(shí)間后,只執(zhí)行一次表達(dá)式j(luò)Query("#頁(yè)面元素ID").load("URL地址");前臺(tái)代碼://緩慢定時(shí)更新購(gòu)物車(chē)物品數(shù)functionajaxSlowUpdateCartItemCount(){//確保存在頁(yè)面元素塊if($("cartItemCount")){(function(){jQuery("#cartItemCount").load("cart/?timestamp="+newDate().getTime());},10000);}}調(diào)用此方法ajaxSlowUpdateCartItemCount()-->inc_后臺(tái):()setMessage(getCart().getItemCount());return“ajax_response”;5.3.8修改購(gòu)物車(chē)訂單項(xiàng)物品數(shù)表單:<formclass='required-validate'action="cart/"><inputtype="hidden"name="product_id"value="${.id}"><inputname="amount"value="${}"size="5"oldValue="${}"maxCount="${.amount}"class="requiredint-range-0-${.amount}"><inputtype="submit"value="修改"></form>?product_id=商品編號(hào)&amout=物品數(shù)>updateProductAmout()>重定向到cart///獲取訂單項(xiàng)OrderItemitem=getCart().getOrderItem(getParameterLong("product_id"));if(item==null){return"list_redirect";}//設(shè)置新的物品數(shù)(getParameterInt("amount"));//如果物品數(shù)不合理,就清空此訂單項(xiàng)if(()<=0){getCart().removeItemByProductId(getParameterLong("product_id"));}5.3.9***重點(diǎn)創(chuàng)建訂單項(xiàng)createOrder()>1.創(chuàng)建訂單商品賣(mài)出去了,更新下庫(kù)存和已銷(xiāo)售數(shù)字//為了防止總數(shù)字為nullif(getSessionLoginedUser().getBuyCount()==null){getSessionLoginedUser().setBuyCount(0);}//關(guān)聯(lián)Item和Order不關(guān)聯(lián),將導(dǎo)致OrderItem出現(xiàn)壞數(shù)據(jù)(order);//設(shè)置訂單的狀態(tài)為未支付(0);如果不寫(xiě),status數(shù)據(jù)庫(kù)存為null,導(dǎo)致數(shù)據(jù)庫(kù)查詢條件失敗.2.清空購(gòu)物車(chē)3.轉(zhuǎn)向message6訂單模塊6.1我的訂單order/[?payed=true]>()>order/參數(shù):payed=true/false是否已支付1.拼出我的訂單列表的HQLStringhql="fromOrderowhereo.="+;2.加入是否支付參數(shù)條件+"ando.status";if(payed){hql+=">0";}else{hql+="=0";}3.數(shù)據(jù)放入視圖層setAttribute(“orders”,執(zhí)行HQL得到List<Order>);return“l(fā)ist”;order/<c:forEachvar=”order”items=”orders”>加入一個(gè)鏈接,顯示給定訂單的訂單項(xiàng)詳情?id=訂單ID</c:forEach>6.2查看訂單詳情?id=訂單ID>()>viewOrder1.根據(jù)ID取到訂單longorderId=getParameterLong("id");Orderorder=(Order)getBaseDAO().findById(,orderId);2.檢查此訂單是否為當(dāng)前用戶所有!保護(hù)用戶隱私().()不是,給用戶一個(gè)警告,然后轉(zhuǎn)向3.將order信息帶回前臺(tái)setAttribute("order",order);關(guān)聯(lián),不需要單獨(dú)寫(xiě)HQL查詢OrderItem前臺(tái):order/<c:forEachitems=””var=”item”></c:forEach>6.3購(gòu)物總數(shù)和支出金額從用戶信息獲取即可.order/${}${}6.4未支付/已支付訂單列表(顯示支付鏈接)功能同本模塊第一個(gè),只是加入了payed參數(shù).已支付order/?payed=true未支付order/?payed=false7交易員模塊7.1供應(yīng)商審核1.顯示未審核的供應(yīng)商列表operator/?audited=false>OperatorAction.findVendorListByAudited()>operator/vendor_2.點(diǎn)擊列表上的審核鏈接operator/?id=供應(yīng)商的編號(hào)//1.根據(jù)ID拿到Vendor//2.設(shè)置審批狀態(tài)和審核人編號(hào)//3.更新//4.轉(zhuǎn)向findVendorListByAuditedAction3.再回到列表頁(yè)面redirectAction到findVendorListByAudited7.2商品審核operator/?audited=falseoperator/product_基本步驟同供應(yīng)商審核.7.3商品打折和分成調(diào)整調(diào)整后應(yīng)該給供應(yīng)商用戶發(fā)送通知郵件.1.顯示商品列表operator/operator/讀取商品列表>operator/product_fromProduct不需要限制是否為審批2.從商品列表跳向修改表單頁(yè)operator/根據(jù)ID找到Product單個(gè)product屬性放入request轉(zhuǎn)向修改頁(yè)面:operator/product_只能修改打折和分成信息3.更新打折和分成信息并發(fā)送郵件通知vendoroperator/>8安全配置給各個(gè)資源加入相關(guān)的安全URL限制,防止非法修改和訪問(wèn).例如供應(yīng)商不能訪問(wèn)操作員下面的功能.1.過(guò)濾器2.頁(yè)面不要顯示多余的功能鏈接擴(kuò)展:如果要用數(shù)據(jù)庫(kù)來(lái)動(dòng)態(tài)配置功能菜單,表的設(shè)計(jì):菜單表編號(hào)標(biāo)題roleIdMenuSet<MenuItem>items;introleId;子菜單項(xiàng)表:編號(hào)菜單ID標(biāo)題URLfromMenu<c:forEachitems=”menus”var=”menu”><c:iftest="${==}">${}<c:forEachitems=””var=”item”><ahref=”${}”>${}</a></c:forEach></c:if></c:forEach>CMSContentManagementSystem內(nèi)容管理系統(tǒng)9支付1.做一個(gè)支付請(qǐng)求確認(rèn)頁(yè)面1.1選何種支付(財(cái)付通,支付寶,網(wǎng)銀)order/?id=訂單號(hào)>order/1.2列出有幾件商品,準(zhǔn)備提交支付請(qǐng)求的表單提交到?id=訂單號(hào)>order/根據(jù)ID查出訂單信息即可對(duì)應(yīng)tenpay_2.做一個(gè)支付通知處理頁(yè)面對(duì)應(yīng)notify_3.做一個(gè)支付結(jié)果客戶通知頁(yè)面對(duì)應(yīng)tenpay_10程序開(kāi)發(fā)調(diào)試交流10.1日期解析和格式化SimpleDateFormat我有個(gè)字符串:2008年9月25日11點(diǎn)25分30秒星期四讓你轉(zhuǎn)成日期:或者從Date對(duì)象轉(zhuǎn)成如上的日期字符串.SimpleDateFormat能夠解析和格式化字符串/****/packagetest;import.ParseException;import.Calendar;/***日期格式化和解析.*@authorBeanSoft**/publicclassSimpleDateFormatTest{publicstaticvoidmain(String[]args){//2008年9月25日11點(diǎn)25分30秒星期四.SimpleDateFormatdf=new.SimpleDateFormat("yyyy年MM月dd日HH點(diǎn)mm分ss秒EEE");.println((new.Date()));StringbirthDay="19802";.SimpleDateFormatdf1=new.SimpleDateFormat("yyyydd");try{.Dated=df1.parse(birthDay);intweek=d.getDay();.println((d));}catch(ParseExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}Calendarcalendar=();(new.Date());(,1000);//向前算.add(,-2)過(guò)了一千天(,100);//一百小時(shí)之后.println((()));}}10.2SQL日期精度問(wèn)題.Date-->時(shí)分秒年月日都有SQL三類(lèi)表示時(shí)間的字段類(lèi)型:date,只存年月日,時(shí)分秒自動(dòng)丟棄,變成0time,只存時(shí)分秒,不存年月日datetime,時(shí)分秒年月日毫秒timestampXXX一更新自動(dòng),取值自動(dòng)修改為當(dāng)前時(shí)間Hibernate實(shí)體:DateregDate;SQL:regDatedatenotnull;存入日期,但是取出來(lái)發(fā)現(xiàn)時(shí)分秒全是0.10.3Hibernate對(duì)基本類(lèi)型的處理如果數(shù)據(jù)庫(kù)存的INT類(lèi)型的字段值是NULL,()Integer>null()+1-->nullpointerEntityintcount;不能把NULL轉(zhuǎn)成int.查詢就會(huì)報(bào)錯(cuò).如果實(shí)體的整數(shù)屬性值是null,插入數(shù)據(jù)庫(kù)后存的值也是null.會(huì)影響SQL條件的判斷準(zhǔn)確與否.10.4Hibernate一對(duì)多保存時(shí)發(fā)現(xiàn)一的一方未關(guān)聯(lián)上OrderSet<OrderItems>items;OrderItemOrderorder;Orderorder=newOrder();OrderItemitem=newOrderItem();將item和order關(guān)聯(lián)起來(lái):(order);save(order);10.5嘗試對(duì)字符串做forEach循環(huán)出錯(cuò)(EL)Causedby:.PropertyNotFoundException:Property'product'notfoundontype.String<c:forEachitems=""var="item"><tr><td><ahref="product/?id=${.id}".()==><c:forEachitems="${}"10.6IE8Beta丟失問(wèn)題<ahref=”action”target=”_blank”>再新窗口打開(kāi)頁(yè)面后,Session就丟了.去掉target即可,保持為同一頁(yè)面.新窗口到底是不是保存會(huì)話,HTML沒(méi)有規(guī)定.以實(shí)際運(yùn)行時(shí)為準(zhǔn).10.7各種有效的contentType從哪里找?$tomcat_home10.8IE6下面看不到CSS菜單臨時(shí)解決辦法:換IE7或者Firefox/Opera.IE6.原系統(tǒng)已經(jīng)帶有解決辦法,似乎是IE6CSS解析的BUG.CSS菜單IE6問(wèn)題解決:導(dǎo)入并在IE6下調(diào)用代碼:<!--[iflteIE6]><scripttype="text/javascript">addWindowEvent("onload",parseStylesheets);</script><![endif]--><!—[iflteIE6]>表示什么意思呢?這是一個(gè)CSS條件判斷語(yǔ)句,lte表示lowerthanorequal<=,小于等于IE6.參見(jiàn)資料:CSS-Conditional.常用來(lái)做不同瀏覽器IE下的頁(yè)面適配.測(cè)試可以使用免費(fèi)軟件IETester來(lái)完成,此軟件可以仿真各個(gè)版本的IE瀏覽器內(nèi)核,這也是實(shí)際開(kāi)發(fā)經(jīng)常要進(jìn)行的工作.此問(wèn)題的解決方法為:排除法,先刪除不相干的內(nèi)容,然后將頁(yè)面剩余部分的元素和腳本一一刪除.10.9NoresultdefinedforactionXXXandresultsuccess(input)的真正錯(cuò)誤原因return的resultname無(wú)法在配置文件中找到.解決辦法在文件中加入即可.10.10排除法在瀏覽器點(diǎn)提交(POST),總是不能轉(zhuǎn)向action里面的reg方法,但是在地址欄敲入地址,這時(shí)候可以執(zhí)行reg().10.10.1排除瀏覽器及瀏覽器版本的因素?fù)Q用不同的瀏覽器,重置瀏覽器設(shè)置,發(fā)現(xiàn)問(wèn)題依然存在,但有一個(gè)小進(jìn)步,發(fā)現(xiàn)Opera瀏覽器正常提交且顯示了錯(cuò)誤信息;10.10.2排除多余屬性的干擾另一個(gè)例子:某同學(xué)發(fā)現(xiàn)fromUser查詢總報(bào)錯(cuò),可嘗試將.xml中的屬性先除了ID全部刪掉,然后一一加上,看何時(shí)出錯(cuò)再做修改.10.10.3JDK運(yùn)行版本和開(kāi)發(fā)工具編譯器版本是否匹配?在項(xiàng)目上點(diǎn)擊鼠標(biāo)右鍵菜單選擇Properties.J2EE1.4項(xiàng)目創(chuàng)建時(shí)有可能將項(xiàng)目編譯基本給設(shè)置成了1.4.開(kāi)發(fā)和運(yùn)行時(shí)候的JDK版本以及編譯版本必須一致.JDK6>1.6,1.5,1.4三種輸出CompilerVersionJDK6支持JDK5只支持1.51.4JDK1.41.4EclispeJDK1.5/1.6CompilerVersion1.4沒(méi)法用EclipseJDK1.5編譯級(jí)別是6,導(dǎo)致JVM不認(rèn)識(shí)..UnsupportedClassVersionError:Badversionnumberin.classfile1.先看兩個(gè)JDK(Eclispe項(xiàng)目JDK和Tomcat的JDK)版本是不是一致2.再看編譯級(jí)別是不是和TomcatJDK版本一致10.10.4重新發(fā)布Web應(yīng)用或者復(fù)制新的JAR/Class文件了嘛?典型錯(cuò)誤信息:.NoClassDefFoundError10.10.5Hibernate的包加完整了嘛?.ServletException:Filterexecutionthrewanexception$$M$9fe7f479.doFilter(:39)$$A$9fe7f479.doFilter(<generated>).doFilter(<generated>)rootcause.NoClassDefFoundError$$M$282703a.doFilter(:59)$$A$282703a.doFilter(<generated>).doFilter(<generated>)$$M$9fe7f479.doFilter(:39)$$A$9fe7f479.doFilter(<generated>).doFilter(<generated>)10.10.6別的類(lèi)似項(xiàng)目是否能正常運(yùn)行?如果能,則說(shuō)明是本項(xiàng)目JAR包或者配置文件有問(wèn)題.10.10.7perties是我們的好朋友日志的控制文件,Strus1/2,Spring,Hibernate都用LOG4J做日志.log4j.rootLogger=WARN,stdoutlog4j.=.log4j.ConsoleAppenderlog4j..layout=.log4j.PatternLayoutlog4j..=%d%p[%c]-%m%nSLF4J:Failedtoloadclass"4j.".SLF4J:Seeforfurtherdetails.2008-9-1823:54:17..StandardWrapperValveinvoke嚴(yán)重:()forservletjspthrewexception.NoClassDefFoundErrorat.doFilter(:59)at..(:235)at..(:206)at.doFilter(:39)at..(:235)at..(:206)at..(:233)at..(:175)at..(:128)at..(:102)at..(:109)at..(:263)at.11.Http11(Http11:852)at.11.Http11AprProtocol$Http11(Http11:584)at..$(:1508)at.(:595)10.10.8人不如新,衣不如舊Java中的類(lèi)庫(kù),老版本的比新版本的穩(wěn)定可靠.JDK也是如此,實(shí)際運(yùn)行不要下載最新版和beta版的軟件包.Hibernate3.3加入JAR包后出現(xiàn)問(wèn)題很多.參見(jiàn)上一小節(jié),因此用Hibernate3.2保險(xiǎn)一些.10.10.9把能正確
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中語(yǔ)文第五單元英雄悲歌自讀文本伍員之死學(xué)案魯人版選修史記蚜
- 2024-2025學(xué)年高中歷史專題三近代中國(guó)思想解放的潮流一“順乎世界之潮流”課后篇鞏固探究人民版必修3
- 屋頂光伏發(fā)電項(xiàng)目可行性研究報(bào)告
- 錐盤(pán)壓榨過(guò)濾機(jī)項(xiàng)目建議書(shū)寫(xiě)作參考范文
- 四氟鮑爾環(huán)行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 隧道烘干機(jī)行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年熱軋無(wú)紡布漿點(diǎn)布項(xiàng)目可行性研究報(bào)告
- 2025年直針項(xiàng)目可行性研究報(bào)告
- 2025年有紡?fù)凉げ夹袠I(yè)深度研究分析報(bào)告
- 人民醫(yī)院CT大型醫(yī)用設(shè)備配置可靠可行性研究報(bào)告
- 城市自來(lái)水廠課程設(shè)計(jì)
- 重慶市2024年小升初語(yǔ)文模擬考試試卷(含答案)
- 2024智慧城市數(shù)據(jù)采集標(biāo)準(zhǔn)規(guī)范
- 【人教版】《勞動(dòng)教育》七上 勞動(dòng)項(xiàng)目一 疏通廚房下水管道 課件
- 2024特斯拉的自動(dòng)駕駛系統(tǒng)FSD發(fā)展歷程、技術(shù)原理及未來(lái)展望分析報(bào)告
- 2024-2030年中國(guó)銀行人工智能行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資前景研究報(bào)告
- 五屆全國(guó)智能制造應(yīng)用技術(shù)技能大賽數(shù)字孿生應(yīng)用技術(shù)員(智能制造控制技術(shù)方向)賽項(xiàng)實(shí)操樣題
- 中國(guó)銀行中銀數(shù)字服務(wù)(南寧)有限公司招聘筆試真題2023
- 2024七年級(jí)英語(yǔ)下冊(cè) Module 1 Lost and found教案(新版)外研版
- 2024年公共衛(wèi)生基本知識(shí)考試題庫(kù)(附含答案)
- 如何正確運(yùn)用邏輯推理和論證方法撰寫(xiě)文章
評(píng)論
0/150
提交評(píng)論