Jeecms開發(fā)學(xué)習(xí)筆記.doc_第1頁
Jeecms開發(fā)學(xué)習(xí)筆記.doc_第2頁
Jeecms開發(fā)學(xué)習(xí)筆記.doc_第3頁
Jeecms開發(fā)學(xué)習(xí)筆記.doc_第4頁
Jeecms開發(fā)學(xué)習(xí)筆記.doc_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Jeecms開發(fā)學(xué)習(xí)筆記青島海爾軟件有限公司帶吳鉤目錄1.文檔說明32. 關(guān)鍵詞32.1MVC32.2實體32.3實現(xiàn)類33. 從Act到Mng到Dao43.1Act43.1.1什么是Act?43.1.2Act實現(xiàn)從html到j(luò)spx43.1.3從Act到Mng53.2Mng和MngImpl73.2.1什么是Mng和MngImpl?73.2.2Mng73.2.3從MngImpl到Dao83.3Dao和DaoImpl93.3.1什么是Dao和DaoImpl?94. 實體類94.1為什么使用實體類?94.2id的作用105配置文件115.1數(shù)據(jù)庫配置文件115.2國際化121.文檔說明 本文檔來源一個現(xiàn)實項目的學(xué)習(xí),筆者須在Jeecms框架內(nèi)實現(xiàn)前臺提交簡歷,后臺查看簡歷的過程。而筆者毫無java web開發(fā)經(jīng)驗。 因此本文檔適用于毫無java web開發(fā)經(jīng)驗人群,將以Jeecms的spring MVC + spring + hibernate框架為結(jié)構(gòu)進行介紹。建立一個實體,從數(shù)據(jù)的寫入到查找為流程,進行一個詳細的描述。2. 關(guān)鍵詞2.1MVCMVC全名是Model View Controller,是模型(model)視圖(view)控制器(controller)的縮寫,一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面 顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。MVC被獨特的發(fā)展起來用于 映射傳統(tǒng)的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中。2.2實體實體類主要是作為數(shù)據(jù)管理和業(yè)務(wù)邏輯處理層面上存在的類別; 它們主要在分析階段區(qū)分 。實體類的主要職責(zé)是存儲和管理系統(tǒng)內(nèi)部的信息,它也可以有行為,甚至很復(fù)雜的行為,但這些行為必須與它所代表的實體對象密切相關(guān)。2.3實現(xiàn)類 就是接口的實現(xiàn)類,實現(xiàn)了接口中那些方法的方法體。3. 從Act到Mng到Dao3.1Act3.1.1什么是Act?在我的理解,Act就是接受請求然后執(zhí)行方法的類,是前臺頁面和后臺處理銜接的類,是重要的類。一般地,注釋掉Act下的內(nèi)容,就失去了銜接的類,我們不需要重新編譯實體,Mng,Dao,也不會影響其他的類。這時候,新編譯的Act實現(xiàn)與前臺的銜接后,就會走到它所注入的Mng,Dao,最后進入表。3.1.2Act實現(xiàn)從html到j(luò)spx 在參照guestbook的時候,你會發(fā)現(xiàn)并沒有g(shù)uestbook.jspx這個文件,那么它是怎么來的呢?我們看GuestbookAct.java中下面這段代碼:RequestMapping(value = /guestbook*.jspx, method = RequestMethod.GET)public String index(Integer ctgId, HttpServletRequest request,HttpServletResponse response, ModelMap model) CmsSite site = CmsUtils.getSite(request);FrontUtils.frontData(request, model, site);FrontUtils.frontPageData(request, model);CmsGuestbookCtg ctg = null;if (ctgId != null) ctg = cmsGuestbookCtgMng.findById(ctgId);if (ctg = null) / 留言板首頁return FrontUtils.getTplPath(request, site.getSolutionPath(),TPLDIR_SPECIAL, GUESTBOOK_INDEX); else / 留言板類別頁model.addAttribute(ctg, ctg);return FrontUtils.getTplPath(request, site.getSolutionPath(),TPLDIR_SPECIAL, GUESTBOOK_CTG);這段代碼是一個攔截,用于判斷進入哪個guestbook頁面(是未登錄的guestbook_index或者guestbook_detail)。RequestMapping注解中value的值表示一個請求,guestbook*.jspx表示的是形如guestbookXXX(XXX可以為空).jspx的請求,我們輸入一個./guestbook.jspx的url就相當(dāng)于發(fā)送了這個請求,然后進入由RequestMapping注解的一個方法。我們假設(shè)這個時候沒有留言類別,也就是說ctg=null為true,這時就會return FrontUtils.getTplPath(request, site.getSolutionPath(),TPLDIR_SPECIAL, GUESTBOOK_INDEX)在這里site是你設(shè)置的site一般與project名一致,TPLDIR_SPECIAL已經(jīng)配置好了,指的是t文件夾下的special文件,重點說一下GUESTBOOK_INDEX,在Act中,有一個定義代碼:public static final String GUESTBOOK_INDEX =tpl.guestbookIndex;那么tpl.guestbookIndex又是什么呢,這個需要在國際化文件中進行配置,兩個國際化文件分別是messages_en_US.properties和messages_zh_CN.properties,這里顯然已經(jīng)配置好了,當(dāng)你要寫自己的Act時就需要自行配置了。于是,我們輸入./guestbook.jspx時,就會走到GuestbookAct這個類,進入這個方法,最后return到這個guestbook_index頁面,于是就從html變成了jspx,代碼就是這樣實現(xiàn)的。從jspx進行ajax提交我們不多提,只需要稍看guestbook_index就能就能了解。 3.1.3從Act到Mng依然是參考guestbook,我們看guestbookAct中這樣一段代碼:RequestMapping(value = /guestbook.jspx, method = RequestMethod.POST)public void submit(Integer siteId, Integer ctgId, String title,String content, String email, String phone, String qq,String captcha, HttpServletRequest request,HttpServletResponse response, ModelMap model) throws JSONException CmsSite site = CmsUtils.getSite(request);CmsUser member = CmsUtils.getUser(request);if (siteId = null) siteId = site.getId();JSONObject json = new JSONObject();try if (!imageCaptchaService.validateResponseForID(session.getSessionId(request, response), captcha) json.put(success, false);json.put(status, 1);ResponseUtils.renderJson(response, json.toString();return; catch (CaptchaServiceException e) json.put(success, false);json.put(status, 1);ResponseUtils.renderJson(response, json.toString();log.warn(, e);return;String ip = RequestUtils.getIpAddr(request);cmsGuestbookMng.save(member, siteId, ctgId, ip, title, content, email,phone, qq);json.put(success, true);json.put(status, 0);ResponseUtils.renderJson(response, json.toString(); Autowiredprivate CmsGuestbookCtgMng cmsGuestbookCtgMng;Autowiredprivate CmsGuestbookMng cmsGuestbookMng;Autowiredprivate SessionProvider session;Autowiredprivate ImageCaptchaService imageCaptchaService;Json我們不多做介紹,在Jeecms框架下,想要處理帶有驗證碼提交的數(shù)據(jù)時,我們可以復(fù)制之后稍作修改,方法是平凡的,重點看紅色框的部分。第一個紅色框框中用到了cmsGuestbookMng的save方法,下面的json.put(success, true);json.put(status, 0);是關(guān)于驗證碼的信息,在html中的ajax提交方法有如下的判斷:if(data.status=0) alert(留言成功); location.href=location.href; else if(data.status=1) alert(驗證碼錯誤); $(#guestbookCaptcha).click(); 顯然地,status=0,提交就成功了。第二個紅色框框中用到了Autowired注解,作用是數(shù)據(jù)在走Mng接口時bytype自動注入,與Resource注解的byname形成對照。這就實現(xiàn)了從Act到Mng,注入后可以使用Mng的save方法。3.2Mng和MngImpl3.2.1什么是Mng和MngImpl?也就是manager接口和實現(xiàn)類,是業(yè)務(wù)邏輯層的重要的類。在Jeecms中,guestbook是特殊的,他有前端guestbook_index.html存入,有后端guestbook文件夾下3個頁面的查詢。這就意味著有兩個Act會走這個Mng接口,相對的,guestbook的業(yè)務(wù)邏輯也會比較復(fù)雜。3.2.2Mng仍然是guestbook,看它的代碼:public interface CmsGuestbookMng public Pagination getPage(Integer siteId, Integer ctgId,Integer userId, Boolean recommend,Boolean checked, boolean desc, boolean cacheable, int pageNo,int pageSize);Transactional(readOnly = true)public List getList(Integer siteId, Integer ctgId,Boolean recommend, Boolean checked, boolean desc,boolean cacheable, int first, int max);public CmsGuestbook findById(Integer id);public CmsGuestbook save(CmsGuestbook bean, CmsGuestbookExt ext,Integer ctgId, String ip);public CmsGuestbook save(CmsUser member, Integer siteId, Integer ctgId,String ip, String title, String content, String email,String phone, String qq);public CmsGuestbook update(CmsGuestbook bean, CmsGuestbookExt ext,Integer ctgId);public CmsGuestbook deleteById(Integer id);public CmsGuestbook deleteByIds(Integer ids);public CmsGuestbook checkByIds(Integer ids,CmsUser checkUser,Boolean checkStatus);這里沒什么好說的,就是接口而已,我們不多看重點是下面的實現(xiàn)類。3.2.3從MngImpl到DaoMng紅色框框內(nèi)對應(yīng)的實現(xiàn)代碼如下:public CmsGuestbook save(CmsGuestbook bean, CmsGuestbookExt ext,Integer ctgId, String ip) bean.setCtg(cmsGuestbookCtgMng.findById(ctgId);bean.setIp(ip);bean.setCreateTime(new Timestamp(System.currentTimeMillis();bean.init();dao.save(bean);cmsGuestbookExtMng.save(ext, bean);return bean;public CmsGuestbook save(CmsUser member, Integer siteId, Integer ctgId,String ip, String title, String content, String email,String phone, String qq) CmsGuestbook guestbook = new CmsGuestbook();guestbook.setMember(member);guestbook.setSite(cmsSiteMng.findById(siteId);guestbook.setIp(ip);CmsGuestbookExt ext = new CmsGuestbookExt();ext.setTitle(title);ext.setContent(content);ext.setEmail(email);ext.setPhone(phone);ext.setQq(qq);return save(guestbook, ext, ctgId, ip);這里必須知道的是,title,content,email,phone,qq是封裝進CmsGuestbookExt里的,ctgId是在CmsGuestbookCtg里的,所以在這個實現(xiàn)類中還會有:private CmsGuestbookCtgMng cmsGuestbookCtgMng;private CmsGuestbookExtMng cmsGuestbookExtMng;Autowiredpublic void setCmsGuestbookExtMng(CmsGuestbookExtMng cmsGuestbookExtMng) this.cmsGuestbookExtMng = cmsGuestbookExtMng;Autowiredpublic void setCmsGuestbookCtgMng(CmsGuestbookCtgMng cmsGuestbookCtgMng) this.cmsGuestbookCtgMng = cmsGuestbookCtgMng;封裝進不同實體有很大的好處,可以防止在字段很多的情況下不會出現(xiàn)因為方法字段不是一一對應(yīng)的,而出現(xiàn)映射混亂的問題(一般表現(xiàn)為有些字段儲存入其他字段,而本身字段為Null)。當(dāng)然代碼也不會繁瑣,隱藏bug少,便于數(shù)據(jù)管理。當(dāng)然也有其壞處,會使得存儲和查詢效率降低,但是一般門戶流量小,數(shù)據(jù)少,這些壞處可以忽略。第二個紅色框框標(biāo)記的部分,是return上一個方法,封裝到一個bean,MngImpl這一實現(xiàn)類,存儲過程一般最后都要封裝進一個bean的。第一個紅色框框走了dao接口,注意下面的代碼聲明了dao的注入:Autowiredpublic void setDao(CmsGuestbookDao dao) this.dao = dao;3.3Dao和DaoImpl3.3.1什么是Dao和DaoImpl?也就是dao接口和實現(xiàn)類,是數(shù)據(jù)訪問層的重要的類。因為Jeecms使用hibernate技術(shù),且映射關(guān)系并不復(fù)雜(針對guestbook來說,包括one to one的guestbookext,many to one的guestbookctg,但是并不難理解),而且并不需要多么復(fù)雜的數(shù)據(jù)處理。對于小型門戶,hibernate就夠用了。Dao和DaoImpl與Mng和MngImpl的理解是相似的,不詳細介紹了。4. 實體類4.1為什么使用實體類?我們找一個簡單的例子:import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;EntityTable(name=T_USER)public class User IdGeneratedValue(generator=system-uuid)GenericGenerator(name = system-uuid,strategy=uuid)Column(length=32)private String id;Column(length=32)private String userName;public String getId() return id;public void setId(String id) this.id = id;public String getUserName() return userName;public void setUserName(String userName) this.userName = userName;注意到username都是private,而他的get和set方法都是public,這意味這什么呢?外面的方法是無法訪問到username的,只有使用get和set方法訪問,這樣保證了username的安全性,不會因為代碼誤編而導(dǎo)致錯誤。Java就是面向?qū)ο缶幊蹋@句話大家都是知道的,裝進一個實體里,這樣就很容編譯了,

溫馨提示

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

評論

0/150

提交評論