Hibernate+struts代码优化(五)

本文介绍了如何优化Hibernate+Struts应用的数据访问层和控制器层。在DAO层,通过创建公共类减少代码重复,将方法参数改为Object,利用String传递SQL。在业务逻辑层,新增包来封装业务逻辑,连接DAO和控制器。而在控制器层,通过定义公共控制器基类,封装常用功能,如注解、响应转换为Json,实现代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据访问层代码优化

这里写图片描述

entity包中的类叫业务模型,从图中可以看出每一个业务模型在dao层中都有一个对应的类,其中的方法基本相同,为了减少代码的重复,将dao层改为一个公用的类,主要需要修改的是:更改参数,将之前传入对象参数的方法的参数类型改为Object;方法中需要写查询语句的方法,将语句通过String的参数传递;将返回值为list中的泛型更改为?;返回值为对象的方法的返回值改为Object类型。

package com.hibernate.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import com.hibernate.entity.User;
import com.hibernate.until.HibernateUntil;
public class BaseDao {
    @SuppressWarnings("unchecked")
    public static List<?> findAll(String HQL){
        Session session =HibernateUntil.getSession();
        List<?> list=null;
        try {
            list=session.createQuery(HQL).list();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            HibernateUntil.closeSession(session);
        }
        return list;    
    }
    public void delUser(Object object){
        Session session=HibernateUntil.getSession();
        try {
            session.beginTransaction().begin();
            session.delete(object);
            session.beginTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.beginTransaction().rollback();
        }finally{
            HibernateUntil.closeSession(session);
        }
    }
    public static void saveOrUpdate(Object object){
        Session session=HibernateUntil.getSession();
        try {
            session.beginTransaction().begin();
            session.saveOrUpdate(object);
            session.beginTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.beginTransaction().rollback();
        }finally{
            HibernateUntil.closeSession(session);
        }       
    }
    public static Object getUser(String HQL){
        Session session=HibernateUntil.getSession();
        Query query=session.createQuery(HQL);
        Object obj=(User) query.uniqueResult();
        HibernateUntil.closeSession(session);
        return obj;
    }
}

控制器中调用含有sql语句的的方法时,因控制层要与前台进行交互,在其中直接写sql语句有点不方便,因此新建一个包里面主要负责业务逻辑专门连接dao和控制器,对于每一个类创建与之对应的业务逻辑类。
该类中包含的内容:与公用dao层方法相对应的方法,并在方法中调用dao层的方法。

package com.hibernate.service;
import java.util.List;
import com.hibernate.dao.BaseDao;
import com.hibernate.entity.Garde;
public class GardeService {
    @SuppressWarnings("unchecked")
    public static List<Garde> findGarde() {
        return (List<Garde>) BaseDao.findAll("from Garde");
    }
}

控制器层中通过业务逻辑层的类调用对应的方法。

List<Garde> garde=GardeService.findGarde();

控制器层代码优化

每一个控制器层的类都有一些相同部分:一个注解、获取response、转换为Json。因此可以通过在工具包下定义一个公用的控制器,写同样的注解将相同代码封装为一个方法,让其他的控制器继承该类。主要包括以下几个方法:获取response、获取session、获取request、将数据转换为Json格式。

package com.hibernate.until;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.ParentPackage;
import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage("struts-default")
public class CommAction  extends ActionSupport{
    private static final long serialVersionUID = 1L;
    public HttpServletRequest getRequest(){
        return ServletActionContext.getRequest();
    }
    public HttpServletResponse getResponse(){
        return ServletActionContext.getResponse();
    }
    public HttpSession getSession(){
        return getRequest().getSession();
    }
    public void toJSON(Object obj) throws Exception{
        getResponse().setCharacterEncoding("utf-8");
        getResponse().getWriter().print(new Gson().toJson(obj));
        getResponse().getWriter().flush();
        getResponse().getWriter().close();  
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值