框架 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
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 {
//將 文件保存硬盤中 -- 將課表的內容保存硬盤,文件名隨機,沒有擴大
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈