所有的模塊都使用單獨(dú)配置文件 1.1.2 使用源碼包 使用config源">

多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > 框架 day39-42 SSH整合練習(xí)項(xiàng)目CRM(配置文件,增刪改查,ajax,上傳/下載,分頁(yè),BaseDao/Action)

框架 day39-42 SSH整合練習(xí)項(xiàng)目CRM(配置文件,增刪改查,ajax,上傳/下載,分頁(yè),BaseDao/Action)

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-06-21 11:31:48 閱讀次數(shù):2737次

1     配置文件

1.1   spring配置

1.1.1       介紹

?    加載properties

?    配置數(shù)據(jù)源DataSource

?    配置SessionFactory , 加載所有hbm.xml

?    hibernate事務(wù)管理

?    使用 所有的模塊都使用單獨(dú)配置文件

        

1.1.2       使用源碼包

?    使用config源碼,將源碼和配置文件分開(kāi)寄存,方便程序的保護(hù)。

        


1.1.3       spring核心

1.1.3.0束縛




1.1.3.1    加載properties



1.1.3.2    配置數(shù)據(jù)源



1.1.3.3    配置hibernate sessionFactory


org.hibernate.dialect.MySQL5Dialecttruetrue


1.1.3.4    配置 hibernate 事務(wù)管理




1.2   struts配置

?    在struts.xml 配置“公共模塊”,使用include包括子模塊,所有的子模塊都繼承“公共模塊”

struts.xml



struts-staff.xml


1.3   web.xml配置


contextConfigLocationclasspath:spring/applicationContext.xmlorg.springframework.web.context.ContextLoaderListenerstruts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*



2     用戶登錄


?    編寫(xiě)PO類(已實(shí)現(xiàn))

?    dao履行用戶查詢(用戶名和密碼)

       繼承 HibernateDaoSupport,需要spring注入SessionFactory

?    service事務(wù)管理(已實(shí)現(xiàn))

       注意:dao和service實(shí)現(xiàn),需要配置到 applicationContext_staff.xml

?    action

       1取得數(shù)據(jù)

              屬性驅(qū)動(dòng)--action屬性 (  --> action 類  setUsername(String username) )

              屬性驅(qū)動(dòng)--javabean (  --> action類  setUesr(User user))

              模型驅(qū)動(dòng) ModelDriven  (1.實(shí)現(xiàn)接口  2編寫(xiě)javabean實(shí)例(new) 3 實(shí)現(xiàn)getModel方法并返回實(shí)例)

       2.使用service 進(jìn)行登錄

       3.處理信息

              登錄成功: session作用域記錄登錄狀態(tài),重定向登錄成功頁(yè)

              不成功:當(dāng)前要求記錄毛病信息(request作用域),使用要求轉(zhuǎn)發(fā),在登錄頁(yè)面顯示

       注意:action 需要配置到 struts-staff.xml


?    規(guī)定:所有的jsp頁(yè)面(除登錄頁(yè))存在WEB-INF下,javaee規(guī)范規(guī)定,閱讀器端不能直接訪問(wèn)WEB-INF目錄下的內(nèi)容(tomcat直接過(guò)濾掉了),使用要求轉(zhuǎn)發(fā)()在服務(wù)器內(nèi)部完成使用java程序讀取內(nèi)容,沒(méi)有限制。


2.1   dao

?    dao實(shí)現(xiàn) 必須繼承 HibernateDaoSupport

?    使用HibernateTemplate 提供find查詢所有


public class StaffDaoImpl extends HibernateDaoSupport implements StaffDao { @Override public CrmStaff find(CrmStaff staff) { Listlist = this.getHibernateTemplate() .find("from CrmStaff where loginName = ? and loginPwd = ?" , staff.getLoginName(),staff.getLoginPwd()); if(list != null && list.size() > 0){ return list.get(0); } return null; } @Override public ListfindAll(String condition, Object[] params) { String hql = "from CrmStaff where 1=1 " + condition; return this.getHibernateTemplate().find(hql , params); } }



2.2   service(MD5加密)

?    登錄員工密碼需要使用MD5加密


public class StaffServiceImpl implements StaffService { private StaffDao staffDao; public void setStaffDao(StaffDao staffDao) { this.staffDao = staffDao; } @Override public CrmStaff login(CrmStaff staff) { //登錄密碼需要加密 staff.setLoginPwd(MyStringUtils.getMD5Value(staff.getLoginPwd())); return staffDao.find(staff); } }
MD5加密Utils
public class MyStringUtils { /** * 將提供的數(shù)據(jù)進(jìn)行md5加密 * * 理論上不可逆的 * * JDK提供工具進(jìn)行 消息摘要算法(加密) * @param value * @return */ public static String getMD5Value(String value){ try { //1 取得工具類 MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //2 加密,加密結(jié)果為10進(jìn)制 byte[] md5ValueByteArray = messageDigest.digest(value.getBytes()); //3 將10機(jī)制轉(zhuǎn)換成16進(jìn)制 BigInteger bigInteger = new BigInteger(1 , md5ValueByteArray); //4 轉(zhuǎn)換 return bigInteger.toString(16); } catch (Exception e) { //如果有異常,不加密 return value; } } }



2.3   配置spring




2.4   登錄頁(yè)面

?    首頁(yè):使用forward包括登錄頁(yè)

?    登錄頁(yè),將html表單,使用struts標(biāo)簽進(jìn)行修改

 

2.5   action編寫(xiě)

2.5.1       封裝數(shù)據(jù)

?    實(shí)現(xiàn)Model接口


//1 封裝數(shù)據(jù) private CrmStaff staff = new CrmStaff(); //1.2 提供javabean實(shí)例(1定要new) @Override public CrmStaff getModel() { //1.3 實(shí)現(xiàn)方法 return staff; }



2.5.2       提供service setter方法

?    action提供service屬性名,必須與spring配置 service名稱1致的


//2 spring 自動(dòng)依照名稱進(jìn)行注入 // 2.1 員工service // 2.1 員工service private StaffService staffService; public void setStaffService(StaffService staffService) { this.staffService = staffService; } // 2.2部門service private DepartmentService departmentService; public void setDepartmentService(DepartmentService departmentService) { this.departmentService = departmentService; } // 2.3 職務(wù) private PostService postService; public void setPostService(PostService postService) { this.postService = postService; }


2.5.3       登錄

?    getSession().put() 相當(dāng)于添加session作用域

?    addFieldError給指定的標(biāo)簽設(shè)置毛病提示信息,標(biāo)簽的主題為simple,信息將不顯示,需要使用在jsp顯示所有

?    this.addActionMessage()  jsp 顯示 (可選)


public String login(){ // 登錄 CrmStaff loginStaff = staffService.login(staff); // 處理 if(loginStaff != null){ //登錄成功 -- session作用域數(shù)據(jù),重定向首頁(yè) ActionContext.getContext().getSession().put("loginStaff", loginStaff); return "success"; } else { //不成功 -- 登錄頁(yè)給出提示 this.addFieldError("", "登錄用戶和密碼不匹配"); return "login"; } }



2.5.4       登錄成功

?    顯示W(wǎng)EB-INF目錄下頁(yè)面


/** * 登錄成功頁(yè)面 * @return */ public String home(){ return "home"; }



2.6   action配置


staffAction_home /WEB-INF/pages/frame.jsp/WEB-INF/pages/login.jsp/WEB-INF/pages/staff/listStaff.jsp



2.7   UIAction

?    思想:如何統(tǒng)1顯示W(wǎng)EB-INF目錄下的jsp頁(yè)面?

?    在struts.xml 編寫(xiě)共有內(nèi)容


/WEB-INF/pages/{1}/{2}.jsp



3     攔截器


?    編寫(xiě)登錄攔截器,除登錄功能,其他的頁(yè)面必須登錄才能訪問(wèn)

?    攔截器編寫(xiě):

       1.編寫(xiě)實(shí)現(xiàn)類

              功能:判斷session是不是保存登錄用戶信息,如果沒(méi)有攔截,如果有放行。

       2.配置攔截器

              2.1將自定義攔截器注冊(cè)給struts

              2.2使用自定義攔截器,排除登錄功能。

?    實(shí)現(xiàn)類回顧

        

       Interceptor接口規(guī)定攔截器(1初始化、2攔截、3燒毀),必須編寫(xiě)3個(gè)方法

       AbstractInterceptor攔截器抽象實(shí)現(xiàn)類,只需要編寫(xiě)“攔截”方法便可

       MethodFilterInterceptor方法過(guò)濾攔截器,使用此攔截器,在配置攔截器可以設(shè)置不需要攔截的方法。


?    http://localhost:8080/crm/index.jsp  當(dāng)訪問(wèn)首頁(yè)時(shí),不使用自定義攔截器棧。

       緣由:struts 攔截器 值攔截action,不攔截jsp。


3.1   實(shí)現(xiàn)類

?    繼承 MethodFiledInterceptor 可以在配置文件中設(shè)置需要過(guò)濾的方法,多個(gè)方法使用逗號(hào)分隔。


//登錄攔截器 public class LoginInterceptor extends MethodFilterInterceptor { /* private String methodName; public void setMethodName(String methodName) { this.methodName = methodName; } */ @Override protected String doIntercept(ActionInvocation invocation) throws Exception { /* String method = invocation.getProxy().getMethod(); if(methodName.equals(method)){ //放行 return invocation.invoke(); } */ //判斷用戶登錄狀態(tài) Object loginStaff = ActionContext.getContext().getSession().get("loginStaff"); if(loginStaff == null){ /**友好提示 start*/ Object action = invocation.getAction(); if(action instanceof ActionSupport){ ActionSupport actionSupport = (ActionSupport) action; actionSupport.addFieldError("", "請(qǐng)登錄"); } /**友好提示 end*/ //沒(méi)有登錄 return "login"; } //放行 return invocation.invoke(); } }


3.2   配置攔截器

?    將自定義攔截器,與struts 默許攔截器棧 組合成1個(gè)新的棧

?    將自定義攔截器棧,配置自定義默許攔截器棧


login


3.3   擴(kuò)大

手動(dòng)編寫(xiě)攔截器疏忽方法見(jiàn)實(shí)現(xiàn)類代碼/**/注釋內(nèi)容


3.4   配置全局結(jié)果

?    登錄攔截器,將攔截所有內(nèi)容,如果沒(méi)有登陸,大家共用1個(gè)result,需要配置全局結(jié)果。


/WEB-INF/pages/login.jsp



4     校驗(yàn)器


?    編程式:在action 編寫(xiě)

       所有方法:必須實(shí)現(xiàn)接口Validateable ,實(shí)現(xiàn)方法 invalidate()方法,校驗(yàn)所有的方法

       單個(gè)方法:必須實(shí)現(xiàn)接口Validateable ,編寫(xiě)特殊的方法 invalidateAdd() 方法,表示值校驗(yàn)add方法

?    聲明式:使用xml配置的

       所有方法:

              文件名稱:action類名-validation.xml

       單個(gè)方法:

              1)文件名稱:action類名-action配置名稱-validation.xml

                     例如:http://localhost:8080/crm/staff/staffAction_login.action

                                          action配置名稱 -->  staffAction_login

                     實(shí)例:對(duì)login方法校驗(yàn),StaffAction-staffAction_login-validation.xml

              2)文件束縛

xwork-core⑵.3.15.3.jar/xwork-validator⑴.0.3.dtd




              3)文件內(nèi)容

                     類型:xwork-core⑵.3.15.3.jar/com/opensymphony/xwork2/validator/validators/default.xml


登錄用戶名不能為空142登錄用戶名必須在${minLength}-${maxLength}字符之間 登錄密碼不能為空164登錄密碼必須在${minLength}-${maxLength}字符之間



              4)文件位置,與action類同包


5     員工管理--查詢所有


5.1   dao層


@Override public ListfindAll() { return this.getHibernateTemplate().find("from CrmStaff"); }


5.2   service層


@Override public ListfindAll() { return staffDao.findAll(); }



5.3   action實(shí)現(xiàn)及配置

?    /crm/src/com/itheima/crm/staff/web/action/StaffAction.java

/WEB-INF/pages/staff/listStaff.jsp 


/** * 查詢所有 * @return */ public String findAll(){ // 查詢 ListallStaff = staffService.findAll(); // 將查詢結(jié)果寄存 值棧中 -- root --> jsp頁(yè)面獲得, key 或 屬性名 取得內(nèi)容 // * 如果1組數(shù)據(jù)(List) ,使用root set方法 ,設(shè)置key // * 如果1個(gè)對(duì)象(javabean),使用root push方法 ,javabean屬性 ActionContext.getContext().getValueStack().set("allStaff", allStaff); return "findAll"; }


配置結(jié)果


/WEB-INF/pages/staff/listStaff.jsp
 


5.4   OpenSessionInViewFilter

?    在web.xml 必須spring提供過(guò)濾器,必須放置struts過(guò)濾器之前


openSessionorg.springframework.orm.hibernate3.support.OpenSessionInViewFilteropenSession/*



5.5   員工管理--條件查詢

5.5.1       查詢所有部門

5.5.1.1    dao層

5.5.1.2    service層

5.5.1.3    配置spring


5.5.2       通過(guò)部門id查詢職務(wù)

5.5.2.1    dao層

5.5.2.2    service層

5.5.2.3    spring 配置

5.5.3       優(yōu)化

?    在web.xml中配置加載所有spring文件

applicationContext*.xml  使用*通配符


contextConfigLocationclasspath:spring/applicationContext*.xml


?    注意:applicationContext.xml 不需要配置


5.5.4       發(fā)送ajax進(jìn)行查詢職務(wù)

?    使用ajax發(fā)送部門的id,查詢對(duì)應(yīng)的所有的職務(wù)

       /crm/post/postAction_findAllWithDepartment?crmDepartment.depId=

?    將查詢的結(jié)果轉(zhuǎn)成成json數(shù)據(jù),使用javascript遍歷數(shù)據(jù)并展現(xiàn)。

       使用Jsonlib 將 List轉(zhuǎn)成字符串


5.5.4.1    發(fā)送ajax



5.5.4.2    action生成json數(shù)據(jù)

?    使用jsonlib 需要導(dǎo)入jar包

 

/** * ajax 通過(guò)部門id查詢職務(wù),發(fā)送json * @return * @throws IOException */ public String findAllWithDepartment() throws IOException{ //1 查詢 ListallPost = postService.findAll(post.getCrmDepartment().getDepId()); //2 jsonlib 將指定數(shù)據(jù)轉(zhuǎn)發(fā)json字符串 //JSONObject 處理java對(duì)象 (map、javabean) //JSONArray 處理java容器(數(shù)組、List、Set) // 2.1 排除不需要字段 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[] {"crmDepartment","crmStaffs"}); // 2.2 轉(zhuǎn)換 String jsonStr = JSONArray.fromObject(allPost,jsonConfig).toString(); // 2.3 將json數(shù)據(jù)發(fā)送給閱讀器 ServletActionContext.getResponse().setContentType("application/json;charset=UTF⑻"); ServletActionContext.getResponse().getWriter().print(jsonStr); return NONE; //表示沒(méi)有返回值 }



5.5.5       條件查詢實(shí)現(xiàn)

?    使用ognl表達(dá)式串連進(jìn)行數(shù)據(jù)封裝,通過(guò)staff1個(gè)可以取得需要的所有數(shù)據(jù)。

?    根據(jù)staff進(jìn)行條件查詢

?    staff被 ModelDriven攔截器已壓入到棧頂,struts標(biāo)簽回顯時(shí),從棧頂開(kāi)始取得數(shù)據(jù),如果有就回顯。


5.5.5.1    jsp表單

奇偶樣式


<%--遍歷數(shù)據(jù),奇偶行樣式不同 class="tabtd1" ,class="tabtd2" --%><%--將遍歷每項(xiàng)壓入到棧頂(root),可以通過(guò)javabean 屬性取得值 --%>

ajax雙select聯(lián)動(dòng)顯示


 


5.5.5.2    action實(shí)現(xiàn)類

 

/** * 查詢所有 * @return */ public String findAll(){ // 1 查詢所有員工 // 查詢 ListallStaff = staffService.findAll(staff); // 將查詢結(jié)果寄存 值棧中 -- root --> jsp頁(yè)面獲得, key 或 屬性名 取得內(nèi)容 // * 如果1組數(shù)據(jù)(List) ,使用root set方法 ,設(shè)置key // * 如果1個(gè)對(duì)象(javabean),使用root push方法 ,javabean屬性 ActionContext.getContext().getValueStack().set("allStaff", allStaff); //2 查詢所有的部門 ListallDepartment = this.departmentService.findAll(); // * 將數(shù)據(jù)寄存到context , jsp獲得 “#key” ActionContext.getContext().put("allDepartment", allDepartment); //3 如果選中部門,將查詢部門的所有的職務(wù) String depId = null; if(staff.getCrmPost() != null && staff.getCrmPost().getCrmDepartment() != null){ depId = staff.getCrmPost().getCrmDepartment().getDepId(); if(StringUtils.isNotBlank(depId)){ //選中部門 ListallPost = postService.findAll(depId); ActionContext.getContext().getValueStack().set("allPost", allPost); } } return "findAll"; }



5.5.5.3    service

?    使用 StringBuilder 拼湊 HQL語(yǔ)句,條件中都是“ and  屬性 符號(hào) ?” 在最后使用  “where 1=1 ”

?    List拼湊實(shí)際參數(shù),(有序,可重復(fù))


@Override public ListfindAll(CrmStaff staff) { //拼湊條件 //* 條件 StringBuilder sqlBuilder = new StringBuilder(); //* 參數(shù) ListparamsList = new ArrayList(); //有可能有條件 if(staff.getCrmPost() != null){ //2 選擇職務(wù)(有職務(wù)就不添加部門) if(StringUtils.isNotBlank(staff.getCrmPost().getPostId())){ sqlBuilder.append(" and crmPost = ?"); paramsList.add(staff.getCrmPost()); } else { //1 選中部門 CrmDepartment department = staff.getCrmPost().getCrmDepartment(); if(department != null && StringUtils.isNotBlank(department.getDepId())){ sqlBuilder.append(" and crmPost.crmDepartment = ?"); paramsList.add(staff.getCrmPost().getCrmDepartment()); } } } //3員工姓名 null "" if(StringUtils.isNotBlank(staff.getStaffName())){ sqlBuilder.append(" and staffName like ?"); paramsList.add("%"+staff.getStaffName()+"%"); } // 將轉(zhuǎn)成需要數(shù)據(jù) String condition = sqlBuilder.toString(); Object[] params = paramsList.toArray(); return staffDao.findAll(condition , params); }



6     課程種別


6.1   dao層

?    所有的dao繼承 HibernateDaoSupport ,通過(guò)底層創(chuàng)建HibernateTemplate 進(jìn)行PO操作。

?    save添加、update更新、delete刪除

?    find查詢所有,get |load 通過(guò)id查詢


public class CourseTypeDaoImpl extends HibernateDaoSupport implements CourseTypeDao { @Override public void save(CrmCourseType courseType) { this.getHibernateTemplate().save(courseType); } @Override public void update(CrmCourseType courseType) { this.getHibernateTemplate().update(courseType); } @Override public void delete(CrmCourseType courseType) { this.getHibernateTemplate().delete(courseType); } @Override public ListfindAll() { return this.getHibernateTemplate().find("from CrmCourseType"); } @Override public CrmCourseType findById(String id) { return this.getHibernateTemplate().get(CrmCourseType.class, id); } }



6.2   service層

?    提供 service 層 主要用于事務(wù)管理和業(yè)務(wù)處理。


6.3   配置spring


6.4   查詢所有

6.4.1       action實(shí)現(xiàn)


6.4.2       struts配置

?    注意:將單獨(dú)文件需要添加到 struts.xml中


6.4.3       jsp遍歷


<%--數(shù)據(jù)展現(xiàn),單行:tabtd1;雙行:tabtd2 --%> <%--如果使用var,將查詢結(jié)果寄存context key=var value=遍歷某1項(xiàng) ,標(biāo)簽體中獲得的方式 “#key” * 注意:如果使用var iterator迭代 在context寄存1份,也在root中也寄存1份。 --%>



6.5   添加和更新(saveOrUpdate)

?    hibernate提供saveOrUpdate 保存或更新。

       代理主鍵:(hibernate自動(dòng)設(shè)置)

              如果沒(méi)有OID,將履行save

              如果有OID,將履行update

       自然主鍵:(手動(dòng)設(shè)置)

              履行之前必須查詢select

              如果查詢沒(méi)有結(jié)果,將履行save

              如果查詢有結(jié)果,將履行update

?    添加 jsp頁(yè)面沒(méi)有id值,表達(dá)沒(méi)有數(shù)據(jù)

?    更新 jsp頁(yè)面需要id值,提供hidden 隱藏域寄存id值。需要通過(guò)id查詢標(biāo)簽回顯(struts標(biāo)簽)


6.5.1       dao


@Override public void saveOrUpdate(CrmCourseType courseType) { this.getHibernateTemplate().saveOrUpdate(courseType); }



6.5.2       service


@Override public void saveOrUpdateCourseType(CrmCourseType courseType) { this.courseTypeDao.saveOrUpdate(courseType); }


6.5.3       action

?    需要提供UI顯示頁(yè)面,需要通過(guò)id查詢

 

/** * 添加或編輯 頁(yè)面顯示 * @return */ public String addOrUpdateUI(){ //如果有id表示更新 -- 通過(guò)id查詢種別 if(StringUtils.isNotBlank(courseType.getCourseTypeId())){ // 通過(guò)id查詢 CrmCourseType findCourseType = courseTypeService.findById(courseType.getCourseTypeId()); // 必須將對(duì)象壓入到指定 ActionContext.getContext().getValueStack().push(findCourseType); } return "addOrUpdateUI"; }



/** * 添加或更新操作 * @return */ public String addOrUpdate(){ courseTypeService.saveOrUpdateCourseType(courseType); return "addOrUpdate"; }


6.5.4       struts配置


/courseTypecourseTypeAction_findAll


6.5.5       jsp表單

?    更新時(shí),需要提供隱藏域,此處必須使用if語(yǔ)句。如果沒(méi)有添加 courseTypeId="" 不能添加成功


<%--提供隱藏域,更新時(shí)使用 --%>


6.6   分頁(yè) + 條件

?    將使用自定義javabean封裝分頁(yè)的數(shù)據(jù)

PageBean


public class PageBean{ //必須 private int pageNum; //當(dāng)前頁(yè)(第幾頁(yè)) private int pageSize; //每頁(yè)顯示數(shù)據(jù) private int totalRecord; //總記錄數(shù) //計(jì)算 private int startIndex; //開(kāi)始索引 private int totalPage; //總頁(yè)數(shù) //分頁(yè)結(jié)果 private Listdata; //分頁(yè)數(shù)據(jù) // 動(dòng)態(tài)顯示導(dǎo)航條 private int start; private int end; public PageBean(int pageNum, int pageSize, int totalRecord) { super(); this.pageNum = pageNum; this.pageSize = pageSize; this.totalRecord = totalRecord; //1 算法:開(kāi)始索引 this.startIndex = (this.pageNum - 1) * this.pageSize; //2 算法:總頁(yè)數(shù) this.totalPage = (this.totalRecord + this.pageSize - 1) / this.pageSize; //3 處理導(dǎo)航條 (顯示10個(gè)分頁(yè)) this.start = 1; this.end = 10; // totalPage = 4; if(this.totalPage <= 10){ this.start = 1; this.end = this.totalPage; } else { // totalPage = 38 ,要求:前4后5 this.start = this.pageNum - 4; this.end = this.pageNum + 5; // 第1頁(yè) if(this.start < 1){ this.start = 1; this.end = 10; } // 最后1頁(yè) if(this.end > this.totalPage){ this.end = this.totalPage; this.start = this.totalPage - 9; } } } get set...............



PageHibernateCallBack hql 分頁(yè)查詢回調(diào)


public class PageHibernateCallBackimplements HibernateCallback{ private String hql; //hql語(yǔ)句 private Object[] params; //hql對(duì)應(yīng)實(shí)際參數(shù) private int firstResult; //開(kāi)始索引 private int maxResults; //每頁(yè)顯示個(gè)數(shù) public PageHibernateCallBack(String hql, Object[] params, int firstResult, int maxResults) { super(); this.hql = hql; this.params = params; this.firstResult = firstResult; this.maxResults = maxResults; } @Override public ListdoInHibernate(Session session) throws HibernateException, SQLException { //1 創(chuàng)建Query對(duì)象 Query queryObject = session.createQuery(hql); //2 設(shè)置實(shí)際參數(shù) if (params != null) { for (int i = 0; i < params.length; i++) { queryObject.setParameter(i, params[i]); } } //3 分頁(yè) // 3.1 開(kāi)始索引 if (firstResult >= 0) { queryObject.setFirstResult(firstResult); } // 3.2 每頁(yè)顯示個(gè)數(shù) if (maxResults > 0) { queryObject.setMaxResults(maxResults); } return queryObject.list(); } }


6.6.1       分頁(yè)

?    service層將 web層傳遞(pageNum,pageSize)進(jìn)行處理并封裝到PageBean中,需要查詢總記錄


//1 總記錄數(shù) int totalRecord = this.courseTypeDao.getTotalRecord(condition,params); //2 將查詢結(jié)果封裝 javabean PageBeanpageBean = new PageBean(pageNum, pageSize, totalRecord); //3 查詢分頁(yè)數(shù) Listdata = this.courseTypeDao.findAll(condition,params, pageBean.getStartIndex(), pageSize); pageBean.setData(data); return pageBean;


6.6.2       條件查詢(拼湊條件)

?    查詢總記錄時(shí),需要傳遞條件

?    查詢分頁(yè)數(shù)據(jù)時(shí),也需要傳遞條件

?    在service拼湊條件便可。


@Override public PageBeanfindAll(CrmCourseType courseType, int pageNum, int pageSize) { //拼湊條件 //#1 準(zhǔn)備對(duì)象 StringBuilder builder = new StringBuilder(); ListparamsList = new ArrayList(); //#2 拼湊 //#2.1 種別名稱 if(StringUtils.isNotBlank(courseType.getCourseName())){ builder.append(" and courseName like ? "); paramsList.add("%"+courseType.getCourseName()+"%"); } //#2.2 簡(jiǎn)介 if(StringUtils.isNotBlank(courseType.getRemark())){ builder.append(" and remark like ? "); paramsList.add("%"+courseType.getRemark()+"%"); } //#2.3 總學(xué)時(shí)--條件都是字符串,需要的整形 int totalStart = 0; int totalEnd = 0; if(StringUtils.isNotBlank(courseType.getTotalStart())){ //200 totalStart = Integer.parseInt(courseType.getTotalStart()); } if(StringUtils.isNotBlank(courseType.getTotalEnd())){ //100 totalEnd = Integer.parseInt(courseType.getTotalEnd()); } // * 處理start <= end int temp = 0; if(totalStart > totalEnd){ /* totalStart = totalStart + totalEnd; totalEnd = totalStart - totalEnd; totalStart = totalStart - totalEnd; */ temp = totalStart; totalStart = totalEnd; totalEnd = temp; //查詢條件中沒(méi)有交換 } // * 拼湊sql if(totalStart > 0){ builder.append(" and total >= ?"); paramsList.add(totalStart); } if(totalEnd > 0){ builder.append(" and total <= ?"); paramsList.add(totalEnd); } //#2.4 費(fèi)用 if(StringUtils.isNotBlank(courseType.getLessonCostStart())){ builder.append(" and courseCost >= ?"); paramsList.add(Double.parseDouble(courseType.getLessonCostStart())); } if(StringUtils.isNotBlank(courseType.getLessonCostEnd())){ builder.append(" and courseCost <= ?"); paramsList.add(Double.parseDouble(courseType.getLessonCostEnd())); } //#3 轉(zhuǎn)換 String condition = builder.toString(); Object[] params = paramsList.toArray(); //1 總記錄數(shù) int totalRecord = this.courseTypeDao.getTotalRecord(condition,params); //2 將查詢結(jié)果封裝 javabean PageBeanpageBean = new PageBean(pageNum, pageSize, totalRecord); //3 查詢分頁(yè)數(shù) Listdata = this.courseTypeDao.findAll(condition,params, pageBean.getStartIndex(), pageSize); pageBean.setData(data); return pageBean; }



6.6.3       jsp處理

?    使用javascript,將分頁(yè)的數(shù)據(jù),與表單中條件數(shù)據(jù) 1并發(fā)送給服務(wù)器

?    或分頁(yè)a標(biāo)簽1并把條件發(fā)送過(guò)去

 


分頁(yè)jsp


第/頁(yè)
[首頁(yè)]  [上1頁(yè)]    [下1頁(yè)] [尾頁(yè)]



7     編寫(xiě)B(tài)aseDao和BaseAction


?    泛型 + 反射

Dao層1般情況下,進(jìn)行增刪改查(CRUD)

添加:session.save(PO)

修改:session.update(PO)

刪除:session.delete(PO)

添加或更新:session.saveOrUpdate(PO)

OID查詢:session.get(Xxx.class,id)  / session.load(Xxx.class,id)

HQL查詢:session.createQuery(hql).list()


 分析:BaseDao 使用接口


7.1   提供統(tǒng)1接口BaseDao


public interface BaseDao{ /** * 保存 * @param t */ public void save(T t); /** * 更新 * @param t */ public void update(T t); /** * 刪除 * @param t */ public void delete(T t); /** * 保存或更新 * @param t */ public void saveOrUpdate(T t); /** * 通過(guò)id查詢 * @param t */ public T findById(String id); /** * 查詢所有 * @param t */ public ListfindAll(); /** * 查詢帶有條件所有 * @param t */ public ListfindAll(String hqlCondition,Object[] params); /** * 查詢總記錄數(shù),帶有條件 * @param hqlCondition * @param hqlParams * @return */ int findTotalRecord(String hqlCondition, Object[] hqlParams); /** * 查詢帶有條件,分頁(yè)數(shù)據(jù) * @param hqlCondition hql查詢條件 * @param hqlParams 對(duì)應(yīng)的實(shí)際參數(shù) * @param startIndex 開(kāi)始索引 * @param pageSize 每頁(yè)顯示個(gè)數(shù) * @return */ ListfindAll(String hqlCondition, Object[] hqlParams, int startIndex, int pageSize); }



7.2   提供實(shí)現(xiàn)BaseDaoImpl

?    BaseDao的實(shí)現(xiàn),繼承HibernateDaoSupport

 

public class BaseDaoImplextends HibernateDaoSupport implements BaseDao{ //具體操作PO類Class對(duì)象 private ClassbeanClass; //具體操作PO類 全限定類名 private String className; public BaseDaoImpl() { //1 取得當(dāng)前運(yùn)行類的,具有泛型信息的父類, ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); //2 取得實(shí)際參數(shù)類型 beanClass = (Class)parameterizedType.getActualTypeArguments()[0]; //3 實(shí)際參數(shù)類型 全限定類名 className = beanClass.getName(); } @Override public void save(T t) { this.getHibernateTemplate().save(t); } @Override public void update(T t) { this.getHibernateTemplate().update(t); } @Override public void delete(T t) { this.getHibernateTemplate().delete(t); } @Override public void saveOrUpdate(T t) { this.getHibernateTemplate().saveOrUpdate(t); } @Override public T findById(String id) { return this.getHibernateTemplate().get(beanClass, id); } @Override public ListfindAll() { return this.getHibernateTemplate().find("from " + className); } @Override public ListfindAll(String hqlCondition, Object[] params) { String hql = "from " +className + " where 1=1 " + hqlCondition; return this.getHibernateTemplate().find(hql, params); } @Override public int findTotalRecord(String hqlCondition, Object[] hqlParams) { String hql = "select count(*) from " + className + " where 1=1 " + hqlCondition; Listlist = this.getHibernateTemplate().find(hql, hqlParams); return list.size() == 1 ? list.get(0).intValue() : 0 ; } @Override public ListfindAll(String hqlCondition, Object[] hqlParams, int startIndex, int pageSize) { String hql = "from "+className+" where 1=1 " + hqlCondition; return this.getHibernateTemplate().execute(new PageHibernateCallback(hql, hqlParams, startIndex, pageSize)); } }



7.3   使用

7.3.1       接口

 

public interface UserDao extends BaseDao{ /** * 使用用戶名和密碼進(jìn)行查詢/特有方法 * @param logonName * @param logonPwd 注意:密碼需要MD5加密 * @return */ public CrmUser findUser(String logonName,String logonPwd); }


7.3.2       實(shí)現(xiàn)類

 

public class UserDaoImpl extends BaseDaoImplimplements UserDao { @Override @SuppressWarnings("unchecked") public CrmUser findUser(String logonName, String logonPwd) { ListallUser = this.getHibernateTemplate() .find("from CrmUser c where c.logonName = ? and c.logonPwd = ?" ,logonName,logonPwd); return allUser.size() == 1 ? allUser.get(0) : null ; } }


BaseAction


public class BaseActionextends ActionSupport implements ModelDriven{ // 0 使用反射,實(shí)例化 T public BaseAction() { try { //1 取得當(dāng)前運(yùn)行類,被參數(shù)化父類。例如:BaseActionParameterizedType parameterizedType = (ParameterizedType) this .getClass().getGenericSuperclass(); //2 取得具體類型, CrmClass ,取得第1個(gè)實(shí)際參數(shù) // * 泛型可以有多個(gè),所以提供的是數(shù)組取得。例如: AClass @SuppressWarnings("unchecked") ClasscrmClass = (Class) parameterizedType.getActualTypeArguments()[0]; //3 實(shí)例化 new CrmClass(); t = crmClass.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } //1 封裝數(shù)據(jù) private T t; @Override public T getModel() { return t; } //2 注入使用到service(如果都寄存父類,以后將愈來(lái)愈多,可以采取放置在子類中) //2.1 private ClassesService classesService; // ** 交予spring注入 public void setClassesService(ClassesService classesService) { this.classesService = classesService; } // ** 提供給子類調(diào)用 //3 分頁(yè)數(shù)據(jù) private int pageNum; private int pageSize = 2; //暫時(shí)固定的 public void setPageNum(int pageNum) { this.pageNum = pageNum; } //4 簡(jiǎn)化 值棧操作 // 4.1 root --set public void set(String key,Object o){ ActionContext.getContext().getValueStack().set(key, o); } // 4.2 root -- push public void push(Object o){ ActionContext.getContext().getValueStack().push(o); } // 4.3 context public void put(String key,Object value){ ActionContext.getContext().put(key, value); } // 4.4 context -- session public void putSession(String key,Object value){ ActionContext.getContext().getSession().put(key, value); } }



8文件上傳


1.1   jsp頁(yè)面

?    提供 

?    表單



 

1.2   action提供屬性

?    struts默許攔截器棧中 提供upload攔截器,完成文件上傳功能。

       提供特定的屬性便可

       Filexxx; 內(nèi)容

       StringxxxFileName; 名稱

       StringxxxContentType; 類型

?    action實(shí)例默許壓入到棧頂?shù)模绻褂肕odelDriven javabean再壓入

 

/** * 上傳頁(yè)面 * @return */ public String uploadUI(){ //通過(guò)id查詢班級(jí) CrmClass findClass = this.getClassesService().findById(this.getModel().getClassId()); //壓入棧頂 this.push(findClass); return "uploadUI"; } private File schedule; //文件內(nèi)容 private String scheduleFileName; //文件名稱 private String scheduleContentType; //文件類型(沒(méi)有用) public void setSchedule(File schedule) { this.schedule = schedule; } public void setScheduleFileName(String scheduleFileName) { this.scheduleFileName = scheduleFileName; } public void setScheduleContentType(String scheduleContentType) { this.scheduleContentType = scheduleContentType; } /** * 文件上傳 * @return */ @InputConfig(resultName="uploadInput") //如果不使用注解,方法出錯(cuò)時(shí),默許返回input public String upload(){ try { //將 文件保存硬盤(pán)中 -- 將課表的內(nèi)容保存硬盤(pán),文件名隨機(jī),沒(méi)有擴(kuò)大
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲欧洲日产国码二区在线 | 欧美亚洲国产另类 | 一级毛片高清大全免费观看 | 亚洲综合三区 | 亚洲高清综合 | 久久片| 欧美人与物videos另类3d | 夜夜嗨视频 | 最近最新手机中文字幕在线看 | 4虎1515hh永久免费 | 久久se精品一区二区影院 | 波多野结衣免费免费视频一区 | 亚洲精品国产啊女成拍色拍 | 一级爱一级做a性视频 | 欧美精品久久 | 亚洲国产日韩欧美一区二区三区 | 欧美性色黄大片www喷水 | 亚洲黄色在线观看视频 | 日本不卡网| 久久久久久久久久久久久久久久久久久久 | 久草在线观看福利视频 | 一二三四视频免费观看高清版在线 | v天堂在线 | 精品国产三级v | 欧美天天 | 国产精品福利社 | 亚洲一区第一页 | 国产精品一区高清在线观看 | 可以免费观看欧美一级毛片 | 一级做a爰片性色毛片2021 | 亚洲性生活 | 一区二区免费视频 | 午夜网站视频 | 免费一级做a爰片久久毛片潮喷 | 欧美videos粗暴 | 爱爱永久免费视频网站 | 人喾交性专区免费 | 在线观看麻豆 | 国产一国产一级毛片视频 | 亚洲日韩中文字幕天堂不卡 | 亚洲午夜久久久精品影院 |