JavaWeb各層次設(shè)計(jì)

JavaWeb 各個(gè)層次簡(jiǎn)化設(shè)計(jì)

UML類圖

UML類圖

Dao層

BaseDao接口

package cn.zzuli.oa.base;

import java.util.List;

/**
 * Dao層的基類
 * @author LZH
 * @date 2017年2月25日
 * @param <T> 泛型 獲取實(shí)體類
 */
public interface BaseDao<T> {
    
    /**
     * 保存實(shí)體
     * @param entity
     */
    void save(T entity);
    
    /**
     * 刪除實(shí)體
     * @param id
     */
    void delete(Long id);
    
    /**
     * 更新實(shí)體
     * @param entity
     */
    void update(T entity);
    
    /**
     * 
     * @param id
     * @return
     */
    T getById(Long id);
    
    /**
     * 查詢實(shí)體
     * @param ids id的集合
     * @return
     */
    List<T> listByIds(Long[] ids);
    
    /**
     * 查詢所有
     * @return
     */
    List<T> listAll();
    
}

BaseDao實(shí)現(xiàn)類BaseDaoImpl

package cn.zzuli.oa.base.impl;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import cn.zzuli.oa.base.BaseDao;

/**
 * dao層的實(shí)現(xiàn)類
 * 
 * @author LZH
 * @date 2017年2月25日
 * @param <T>
 *            泛型 用于獲取實(shí)體類
 */
@Transactional // @Transactional可以被繼承,即對(duì)子類也有效
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {

    @Resource
    private SessionFactory sessionFactory;

    protected Class<T> clazz;

    public BaseDaoImpl() {
        // 通過反射得到T的真實(shí)類型
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 獲取T的類型
    }

    @Override
    public void save(T entity) {
        getSession().save(entity);
    }

    @Override
    public void delete(Long id) {
        Object obj = getSession().get(clazz, id);
        getSession().delete(obj);
    }

    @Override
    public void update(T entity) {
        getSession().update(entity);
    }

    @Override
    public T getById(Long id) {
        return (T) getSession().get(clazz, id);
    }

    @Override
    public List<T> listByIds(Long[] ids) {
        if (ids == null || ids.length == 0) {
            return Collections.EMPTY_LIST;
        }
        return getSession().createQuery("FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")
                .setParameterList("ids", ids).list();
    }

    @Override
    public List<T> listAll() {
        return getSession().createQuery("FROM " + clazz.getSimpleName()).list();
    }

    /**
     * 獲取當(dāng)前可用的Session
     * 
     * @return 當(dāng)前可用的Session
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

}

Service業(yè)務(wù)層設(shè)計(jì)

各個(gè)模塊接口延赌,在每個(gè)接口中背零,可以寫每個(gè)模塊所特有的方法党瓮,以供調(diào)用實(shí)現(xiàn)丢间。這里面由于繼承了BaseDaoImpl可是直接調(diào)用Session來執(zhí)行操作數(shù)據(jù),這樣就可以寫一些每個(gè)模塊里面所獨(dú)有的方法倡勇。

RoleService

package cn.zzuli.oa.service;

import cn.zzuli.oa.base.BaseDao;
import cn.zzuli.oa.domain.Role;

/**
 * 崗位業(yè)務(wù)層接口
 *   可以寫自己模塊所特有的方法
 * @author LZH
 * @date 2017年2月25日
 */
public interface RoleService extends BaseDao<Role>{

}

UserService

package cn.zzuli.oa.service;

import cn.zzuli.oa.base.BaseDao;
import cn.zzuli.oa.domain.User;

public interface UserService extends BaseDao<User>{

}

RoleService實(shí)現(xiàn)類RoleServiceImpl

package cn.zzuli.oa.service.impl;

import org.springframework.stereotype.Service;

import cn.zzuli.oa.base.impl.BaseDaoImpl;
import cn.zzuli.oa.domain.Role;
import cn.zzuli.oa.service.RoleService;

/**
 * 崗位業(yè)務(wù)層實(shí)現(xiàn)類
 * 
 * @author LZH
 * @date 2017年2月25日
 */
@Service
public class RoleServiceImpl extends BaseDaoImpl<Role> implements RoleService {

}

UserService實(shí)現(xiàn)類UserServiceImpl

package cn.zzuli.oa.service.impl;

import org.springframework.stereotype.Service;

import cn.zzuli.oa.base.impl.BaseDaoImpl;
import cn.zzuli.oa.domain.User;
import cn.zzuli.oa.service.UserService;

/**
 * 用戶業(yè)務(wù)層
 * 
 * @author LZH
 * @date 2017年2月26日
 */
@Service
public class UserServiceImpl extends BaseDaoImpl<User> implements UserService {
    
}

Action層設(shè)計(jì)

BaseAction基類

package cn.zzuli.oa.base;

import java.lang.reflect.ParameterizedType;

import javax.annotation.Resource;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import cn.zzuli.oa.service.DepartmentService;
import cn.zzuli.oa.service.RoleService;
import cn.zzuli.oa.service.UserService;

public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {

    private static final long serialVersionUID = 1L;

    //填寫各個(gè)Service的實(shí)現(xiàn)類著觉,方便在控制層中調(diào)用各個(gè)不同之間的使用
    @Resource
    protected RoleService roleService;
    @Resource
    protected DepartmentService departmentService;
    @Resource
    protected UserService userSercice;
    //.....

    protected T model;

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public BaseAction() {
        try {
            // 得到model的類型信息
            ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
            Class clazz = (Class) pt.getActualTypeArguments()[0];
            
            // 生成model的實(shí)例 通過反射實(shí)例
            model = (T) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public T getModel() {
        return model;
    }

}

RoleAction

package cn.zzuli.oa.view.action;

import java.util.List;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;

import cn.zzuli.oa.base.BaseAction;
import cn.zzuli.oa.domain.Role;

/**
 * 崗位控制層
 *  @Controller
    @Scope("prototype") 這兩個(gè)注解不能寫到父類中村生,否則就失效了
 * @author LZH
 * @date 2017年2月25日
 */
@Controller
@Scope("prototype")
public class RoleAction extends BaseAction<Role> {

    private static final long serialVersionUID = 1L;

    /**
     * 列表
     * 
     * @return
     * @throws Exception
     */
    public String list() throws Exception {
        List<Role> roleList = roleService.listAll();
        ActionContext.getContext().put("roleList", roleList);
        return "list";
    }

    /**
     * 添加
     * 
     * @return
     * @throws Exception
     */
    public String add() throws Exception {
        roleService.save(model);
        return "toList";
    }

    /**
     * 刪除
     * 
     * @return
     * @throws Exception
     */
    public String delete() throws Exception {
        roleService.delete(model.getId());
        return "toList";
    }

    /**
     * 修改
     * 
     * @return
     * @throws Exception
     */
    public String edit() throws Exception {
        Role role = roleService.getById(model.getId());
        role.setName(model.getName());
        role.setDescription(model.getDescription());
        roleService.update(role);
        return "toList";
    }

    /**
     * 添加頁面
     * 
     * @return
     * @throws Exception
     */
    public String addUI() throws Exception {
        return "addUI";
    }

    /**
     * 修改頁面
     * 
     * @return
     * @throws Exception
     */
    public String editUI() throws Exception {
        Role role = roleService.getById(model.getId());
        model.setName(role.getName());
        model.setDescription(role.getDescription());

        // ActionContext.getContext().getValueStack().push(role);//放到對(duì)象棧的棧頂
        return "editUI";
    }

}

UserAction

package cn.zzuli.oa.view.action;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cn.zzuli.oa.base.BaseAction;
import cn.zzuli.oa.domain.User;

/**
 * 用戶控制層
 * 
 * @author LZH
 * @date 2017年2月26日
 */
@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User> {

    private static final long serialVersionUID = 1L;

    /**
     * 列表
     * 
     * @return
     * @throws Exception
     */
    public String list() throws Exception {
        return "list";
    }

    /**
     * 添加
     * 
     * @return
     * @throws Exception
     */
    public String add() throws Exception {
        return "toList";
    }

    /**
     * 添加頁面
     * 
     * @return
     * @throws Exception
     */
    public String addUI() throws Exception {
        return "addUI";
    }

    /**
     * 刪除
     * 
     * @return
     * @throws Exception
     */
    public String delete() throws Exception {
        return "toList";
    }

    /**
     * 修改
     * 
     * @return
     * @throws Exception
     */
    public String edit() throws Exception {
        return "toList";
    }

    /**
     * 修改頁面
     * 
     * @return
     * @throws Exception
     */
    public String editUI() throws Exception {
        return "editUI";
    }

    /**
     * 初始化密碼為1234
     * 
     * @return
     * @throws Exception
     */
    public String initPassword() throws Exception {
        return "toList";
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饼丘,隨后出現(xiàn)的幾起案子趁桃,更是在濱河造成了極大的恐慌,老刑警劉巖肄鸽,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卫病,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡典徘,警方通過查閱死者的電腦和手機(jī)蟀苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逮诲,“玉大人屹逛,你說我怎么就攤上這事⊙绰睿” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵评腺,是天一觀的道長(zhǎng)帘瞭。 經(jīng)常有香客問我,道長(zhǎng)蒿讥,這世上最難降的妖魔是什么蝶念? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮芋绸,結(jié)果婚禮上媒殉,老公的妹妹穿的比我還像新娘。我一直安慰自己摔敛,他們只是感情好廷蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著马昙,像睡著了一般桃犬。 火紅的嫁衣襯著肌膚如雪刹悴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天攒暇,我揣著相機(jī)與錄音土匀,去河邊找鬼。 笑死形用,一個(gè)胖子當(dāng)著我的面吹牛就轧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播田度,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妒御,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了每币?” 一聲冷哼從身側(cè)響起携丁,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兰怠,沒想到半個(gè)月后梦鉴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揭保,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肥橙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秸侣。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡存筏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出味榛,到底是詐尸還是另有隱情椭坚,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布搏色,位于F島的核電站善茎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏频轿。R本人自食惡果不足惜垂涯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望航邢。 院中可真熱鬧耕赘,春花似錦、人聲如沸膳殷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至当娱,卻和暖如春吃既,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跨细。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工鹦倚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冀惭。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓震叙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親散休。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媒楼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容