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

日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 框架 day39-42 SSH整合練習項目CRM(配置文件,增刪改查,ajax,上傳/下載,分頁,BaseDao/Action)

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

來源:程序員人生   發布時間:2016-06-21 11:31:48 閱讀次數:2744次

1     配置文件

1.1   spring配置

1.1.1       介紹

?    加載properties

?    配置數據源DataSource

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

?    hibernate事務管理

?    使用 所有的模塊都使用單獨配置文件

        

1.1.2       使用源碼包

?    使用config源碼,將源碼和配置文件分開寄存,方便程序的保護。

        


1.1.3       spring核心

1.1.3.0束縛




1.1.3.1    加載properties



1.1.3.2    配置數據源



1.1.3.3    配置hibernate sessionFactory


org.hibernate.dialect.MySQL5Dialecttruetrue


1.1.3.4    配置 hibernate 事務管理




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     用戶登錄


?    編寫PO類(已實現)

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

       繼承 HibernateDaoSupport,需要spring注入SessionFactory

?    service事務管理(已實現)

       注意:dao和service實現,需要配置到 applicationContext_staff.xml

?    action

       1取得數據

              屬性驅動--action屬性 (  --> action 類  setUsername(String username) )

              屬性驅動--javabean (  --> action類  setUesr(User user))

              模型驅動 ModelDriven  (1.實現接口  2編寫javabean實例(new) 3 實現getModel方法并返回實例)

       2.使用service 進行登錄

       3.處理信息

              登錄成功: session作用域記錄登錄狀態,重定向登錄成功頁

              不成功:當前要求記錄毛病信息(request作用域),使用要求轉發,在登錄頁面顯示

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


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


2.1   dao

?    dao實現 必須繼承 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 { /** * 將提供的數據進行md5加密 * * 理論上不可逆的 * * JDK提供工具進行 消息摘要算法(加密) * @param value * @return */ public static String getMD5Value(String value){ try { //1 取得工具類 MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //2 加密,加密結果為10進制 byte[] md5ValueByteArray = messageDigest.digest(value.getBytes()); //3 將10機制轉換成16進制 BigInteger bigInteger = new BigInteger(1 , md5ValueByteArray); //4 轉換 return bigInteger.toString(16); } catch (Exception e) { //如果有異常,不加密 return value; } } }



2.3   配置spring




2.4   登錄頁面

?    首頁:使用forward包括登錄頁

?    登錄頁,將html表單,使用struts標簽進行修改

 

2.5   action編寫

2.5.1       封裝數據

?    實現Model接口


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



2.5.2       提供service setter方法

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


//2 spring 自動依照名稱進行注入 // 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 職務 private PostService postService; public void setPostService(PostService postService) { this.postService = postService; }


2.5.3       登錄

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

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

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


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



2.5.4       登錄成功

?    顯示WEB-INF目錄下頁面


/** * 登錄成功頁面 * @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

?    思想:如何統1顯示WEB-INF目錄下的jsp頁面?

?    在struts.xml 編寫共有內容


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



3     攔截器


?    編寫登錄攔截器,除登錄功能,其他的頁面必須登錄才能訪問

?    攔截器編寫:

       1.編寫實現類

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

       2.配置攔截器

              2.1將自定義攔截器注冊給struts

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

?    實現類回顧

        

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

       AbstractInterceptor攔截器抽象實現類,只需要編寫“攔截”方法便可

       MethodFilterInterceptor方法過濾攔截器,使用此攔截器,在配置攔截器可以設置不需要攔截的方法。


?    http://localhost:8080/crm/index.jsp  當訪問首頁時,不使用自定義攔截器棧。

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


3.1   實現類

?    繼承 MethodFiledInterceptor 可以在配置文件中設置需要過濾的方法,多個方法使用逗號分隔。


//登錄攔截器 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(); } */ //判斷用戶登錄狀態 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("", "請登錄"); } /**友好提示 end*/ //沒有登錄 return "login"; } //放行 return invocation.invoke(); } }


3.2   配置攔截器

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

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


login


3.3   擴大

手動編寫攔截器疏忽方法見實現類代碼/**/注釋內容


3.4   配置全局結果

?    登錄攔截器,將攔截所有內容,如果沒有登陸,大家共用1個result,需要配置全局結果。


/WEB-INF/pages/login.jsp



4     校驗器


?    編程式:在action 編寫

       所有方法:必須實現接口Validateable ,實現方法 invalidate()方法,校驗所有的方法

       單個方法:必須實現接口Validateable ,編寫特殊的方法 invalidateAdd() 方法,表示值校驗add方法

?    聲明式:使用xml配置的

       所有方法:

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

       單個方法:

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

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

                                          action配置名稱 -->  staffAction_login

                     實例:對login方法校驗,StaffAction-staffAction_login-validation.xml

              2)文件束縛

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




              3)文件內容

                     類型: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實現及配置

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

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


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


配置結果


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


5.4   OpenSessionInViewFilter

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


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       通過部門id查詢職務

5.5.2.1    dao層

5.5.2.2    service層

5.5.2.3    spring 配置

5.5.3       優化

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

applicationContext*.xml  使用*通配符


contextConfigLocationclasspath:spring/applicationContext*.xml


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


5.5.4       發送ajax進行查詢職務

?    使用ajax發送部門的id,查詢對應的所有的職務

       /crm/post/postAction_findAllWithDepartment?crmDepartment.depId=

?    將查詢的結果轉成成json數據,使用javascript遍歷數據并展現。

       使用Jsonlib 將 List轉成字符串


5.5.4.1    發送ajax



5.5.4.2    action生成json數據

?    使用jsonlib 需要導入jar包

 

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



5.5.5       條件查詢實現

?    使用ognl表達式串連進行數據封裝,通過staff1個可以取得需要的所有數據。

?    根據staff進行條件查詢

?    staff被 ModelDriven攔截器已壓入到棧頂,struts標簽回顯時,從棧頂開始取得數據,如果有就回顯。


5.5.5.1    jsp表單

奇偶樣式


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

ajax雙select聯動顯示


 


5.5.5.2    action實現類

 

/** * 查詢所有 * @return */ public String findAll(){ // 1 查詢所有員工 // 查詢 ListallStaff = staffService.findAll(staff); // 將查詢結果寄存 值棧中 -- root --> jsp頁面獲得, key 或 屬性名 取得內容 // * 如果1組數據(List) ,使用root set方法 ,設置key // * 如果1個對象(javabean),使用root push方法 ,javabean屬性 ActionContext.getContext().getValueStack().set("allStaff", allStaff); //2 查詢所有的部門 ListallDepartment = this.departmentService.findAll(); // * 將數據寄存到context , jsp獲得 “#key” ActionContext.getContext().put("allDepartment", allDepartment); //3 如果選中部門,將查詢部門的所有的職務 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語句,條件中都是“ and  屬性 符號 ?” 在最后使用  “where 1=1 ”

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


@Override public ListfindAll(CrmStaff staff) { //拼湊條件 //* 條件 StringBuilder sqlBuilder = new StringBuilder(); //* 參數 ListparamsList = new ArrayList(); //有可能有條件 if(staff.getCrmPost() != null){ //2 選擇職務(有職務就不添加部門) 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()+"%"); } // 將轉成需要數據 String condition = sqlBuilder.toString(); Object[] params = paramsList.toArray(); return staffDao.findAll(condition , params); }



6     課程種別


6.1   dao層

?    所有的dao繼承 HibernateDaoSupport ,通過底層創建HibernateTemplate 進行PO操作。

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

?    find查詢所有,get |load 通過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 層 主要用于事務管理和業務處理。


6.3   配置spring


6.4   查詢所有

6.4.1       action實現


6.4.2       struts配置

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


6.4.3       jsp遍歷


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



6.5   添加和更新(saveOrUpdate)

?    hibernate提供saveOrUpdate 保存或更新。

       代理主鍵:(hibernate自動設置)

              如果沒有OID,將履行save

              如果有OID,將履行update

       自然主鍵:(手動設置)

              履行之前必須查詢select

              如果查詢沒有結果,將履行save

              如果查詢有結果,將履行update

?    添加 jsp頁面沒有id值,表達沒有數據

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


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顯示頁面,需要通過id查詢

 

/** * 添加或編輯 頁面顯示 * @return */ public String addOrUpdateUI(){ //如果有id表示更新 -- 通過id查詢種別 if(StringUtils.isNotBlank(courseType.getCourseTypeId())){ // 通過id查詢 CrmCourseType findCourseType = courseTypeService.findById(courseType.getCourseTypeId()); // 必須將對象壓入到指定 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表單

?    更新時,需要提供隱藏域,此處必須使用if語句。如果沒有添加 courseTypeId="" 不能添加成功


<%--提供隱藏域,更新時使用 --%>


6.6   分頁 + 條件

?    將使用自定義javabean封裝分頁的數據

PageBean


public class PageBean{ //必須 private int pageNum; //當前頁(第幾頁) private int pageSize; //每頁顯示數據 private int totalRecord; //總記錄數 //計算 private int startIndex; //開始索引 private int totalPage; //總頁數 //分頁結果 private Listdata; //分頁數據 // 動態顯示導航條 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 算法:開始索引 this.startIndex = (this.pageNum - 1) * this.pageSize; //2 算法:總頁數 this.totalPage = (this.totalRecord + this.pageSize - 1) / this.pageSize; //3 處理導航條 (顯示10個分頁) 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頁 if(this.start < 1){ this.start = 1; this.end = 10; } // 最后1頁 if(this.end > this.totalPage){ this.end = this.totalPage; this.start = this.totalPage - 9; } } } get set...............



PageHibernateCallBack hql 分頁查詢回調


public class PageHibernateCallBackimplements HibernateCallback{ private String hql; //hql語句 private Object[] params; //hql對應實際參數 private int firstResult; //開始索引 private int maxResults; //每頁顯示個數 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 創建Query對象 Query queryObject = session.createQuery(hql); //2 設置實際參數 if (params != null) { for (int i = 0; i < params.length; i++) { queryObject.setParameter(i, params[i]); } } //3 分頁 // 3.1 開始索引 if (firstResult >= 0) { queryObject.setFirstResult(firstResult); } // 3.2 每頁顯示個數 if (maxResults > 0) { queryObject.setMaxResults(maxResults); } return queryObject.list(); } }


6.6.1       分頁

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


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


6.6.2       條件查詢(拼湊條件)

?    查詢總記錄時,需要傳遞條件

?    查詢分頁數據時,也需要傳遞條件

?    在service拼湊條件便可。


@Override public PageBeanfindAll(CrmCourseType courseType, int pageNum, int pageSize) { //拼湊條件 //#1 準備對象 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 簡介 if(StringUtils.isNotBlank(courseType.getRemark())){ builder.append(" and remark like ? "); paramsList.add("%"+courseType.getRemark()+"%"); } //#2.3 總學時--條件都是字符串,需要的整形 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; //查詢條件中沒有交換 } // * 拼湊sql if(totalStart > 0){ builder.append(" and total >= ?"); paramsList.add(totalStart); } if(totalEnd > 0){ builder.append(" and total <= ?"); paramsList.add(totalEnd); } //#2.4 費用 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 轉換 String condition = builder.toString(); Object[] params = paramsList.toArray(); //1 總記錄數 int totalRecord = this.courseTypeDao.getTotalRecord(condition,params); //2 將查詢結果封裝 javabean PageBeanpageBean = new PageBean(pageNum, pageSize, totalRecord); //3 查詢分頁數 Listdata = this.courseTypeDao.findAll(condition,params, pageBean.getStartIndex(), pageSize); pageBean.setData(data); return pageBean; }



6.6.3       jsp處理

?    使用javascript,將分頁的數據,與表單中條件數據 1并發送給服務器

?    或分頁a標簽1并把條件發送過去

 


分頁jsp


第/頁
[首頁]  [上1頁]    [下1頁] [尾頁]



7     編寫BaseDao和BaseAction


?    泛型 + 反射

Dao層1般情況下,進行增刪改查(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   提供統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); /** * 通過id查詢 * @param t */ public T findById(String id); /** * 查詢所有 * @param t */ public ListfindAll(); /** * 查詢帶有條件所有 * @param t */ public ListfindAll(String hqlCondition,Object[] params); /** * 查詢總記錄數,帶有條件 * @param hqlCondition * @param hqlParams * @return */ int findTotalRecord(String hqlCondition, Object[] hqlParams); /** * 查詢帶有條件,分頁數據 * @param hqlCondition hql查詢條件 * @param hqlParams 對應的實際參數 * @param startIndex 開始索引 * @param pageSize 每頁顯示個數 * @return */ ListfindAll(String hqlCondition, Object[] hqlParams, int startIndex, int pageSize); }



7.2   提供實現BaseDaoImpl

?    BaseDao的實現,繼承HibernateDaoSupport

 

public class BaseDaoImplextends HibernateDaoSupport implements BaseDao{ //具體操作PO類Class對象 private ClassbeanClass; //具體操作PO類 全限定類名 private String className; public BaseDaoImpl() { //1 取得當前運行類的,具有泛型信息的父類, ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); //2 取得實際參數類型 beanClass = (Class)parameterizedType.getActualTypeArguments()[0]; //3 實際參數類型 全限定類名 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{ /** * 使用用戶名和密碼進行查詢/特有方法 * @param logonName * @param logonPwd 注意:密碼需要MD5加密 * @return */ public CrmUser findUser(String logonName,String logonPwd); }


7.3.2       實現類

 

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 使用反射,實例化 T public BaseAction() { try { //1 取得當前運行類,被參數化父類。例如:BaseActionParameterizedType parameterizedType = (ParameterizedType) this .getClass().getGenericSuperclass(); //2 取得具體類型, CrmClass ,取得第1個實際參數 // * 泛型可以有多個,所以提供的是數組取得。例如: AClass @SuppressWarnings("unchecked") ClasscrmClass = (Class) parameterizedType.getActualTypeArguments()[0]; //3 實例化 new CrmClass(); t = crmClass.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } //1 封裝數據 private T t; @Override public T getModel() { return t; } //2 注入使用到service(如果都寄存父類,以后將愈來愈多,可以采取放置在子類中) //2.1 private ClassesService classesService; // ** 交予spring注入 public void setClassesService(ClassesService classesService) { this.classesService = classesService; } // ** 提供給子類調用 //3 分頁數據 private int pageNum; private int pageSize = 2; //暫時固定的 public void setPageNum(int pageNum) { this.pageNum = pageNum; } //4 簡化 值棧操作 // 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頁面

?    提供 

?    表單



 

1.2   action提供屬性

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

       提供特定的屬性便可

       Filexxx; 內容

       StringxxxFileName; 名稱

       StringxxxContentType; 類型

?    action實例默許壓入到棧頂的,如果使用ModelDriven javabean再壓入

 

/** * 上傳頁面 * @return */ public String uploadUI(){ //通過id查詢班級 CrmClass findClass = this.getClassesService().findById(this.getModel().getClassId()); //壓入棧頂 this.push(findClass); return "uploadUI"; } private File schedule; //文件內容 private String scheduleFileName; //文件名稱 private String scheduleContentType; //文件類型(沒有用) 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") //如果不使用注解,方法出錯時,默許返回input public String upload(){ try { //將 文件保存硬盤中 -- 將課表的內容保存硬盤,文件名隨機,沒有擴大
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美 日韩 国产 成人 在线 91 | www.久久99 | 狠狠网| 亚洲综合视频 | 日韩精品久久久久久久电影99爱 | 亚洲视频在线播放 | 国产精品伦一区二区三级视频 | 国产精品美女久久久久aⅴ国产馆 | 日韩欧美专区 | 亚洲精品一区二区在线 | 久久99亚洲精品 | 精精国产xxxx视频在线野外 | 久久久精品亚洲 | 色成人亚洲 | 久久久国产精品x99av | 不卡一区| 欧美亚洲专区 | 国产在线小视频 | 久久国产精品99国产 | 国内精品一区二区三区 | 亚洲一区二区在线 | 日本视频一区二区 | 成人污污视频 | 少妇又紧又色又爽又刺激视频 | 性史性高校dvd毛片 亚洲综合色网 | 亚洲精区二区三区四区麻豆 | 国产欧美在线播放 | 成人激情av | 国产在线播 | 国产精品视频久久久 | 精品国产精品三级精品av网址 | 亚洲永久精品国产 | 一区免费视频 | 国产精品久久久久久妇女 | 亚洲一区欧美二区 | 久久艹人人 | 国产精品福利片 | 亚洲一一在线 | 激情a| 精品久久久久久久久久中出 | 欧美久久久久久久 |