框架 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
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)