博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.5 Hibernate与Struts2整合应用
阅读量:7013 次
发布时间:2019-06-28

本文共 19566 字,大约阅读时间需要 65 分钟。

hot3.png

1.DAO模式

    DAO是Data Access Object数据访问接口,既然是对数据的访问,顾名思义就是与数据库打交道。

    为了建立一个健壮的Java EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储,这就是DAO模式。

2.Hibernate与Struts2整合应用实例——开发学生选课系统

    该系统就是为了实现这样一些功能,学生登录系统后,可以查看、修改个人信息,查看个人选课情况,选定课程及退选课程。其登录界面如图4.25所示。

164258_Ql23_220508.png

图4.25  登录界面

  

登录成功后进入主界面,如图4.26所示。

164258_eixJ_220508.png

图4.26  主界面

单击【查询个人信息】超链接,可以查看当前用户的个人信息,如图4.27所示。

164258_eNMW_220508.png

图4.27  查询个人信息界面

单击【个人选课情况】超链接,可以列举出当前用户的个人选课情况,如图4.28所示。

164258_B9uT_220508.png

图4.28  个人选课情况界面

单击表格右边的【退选】超链接就可退选该课程。

单击【所有课程信息】超链接,可显示所有课程的信息,如图4.29所示。 

164258_jLMt_220508.png

图4.29  所有课程信息界面

 

1)建立数据库及表结构

    根据上面所述功能,该系统需要建立登录表、学生表、专业表、课程表,以及学生课程表即连接表。(表结构参见《》)

 

2)在MyEclipse中创建对SQL Server 的连接

    步骤见。

 

3)创建Web项目

    打开MyEclipse,创建Web项目,命名为“Struts_Hibernate”。D:\my\Documents\java\JavaEE\Struts_Hibernate

 

4)添加Hibernate开发能力

    步骤见。

 

5)生成数据库表对应的Java类对象和映射文件

下面列举需要修改的代码,修改后的代码如下。

Xsb.java代码如下:

package org.model;import java.util.Date;import java.util.HashSet;import java.util.Set;public class Xsb implements java.io.Serializable {    private String xh;    private Zyb zyb;    private String xm;    private Byte xb;    private Date cssj;    private Integer zxf;    private String bz;    private byte[] zp;    private Set kcs=new HashSet();    // 省略上述各属性的getter和setter方法}

 

Xsb.hbm.xml文件代码。

    
        
            
            
                
        
            
                
            
                
            
                
            
                
            
                
            
                
            
                
        
                
                
            

   

Kcb.java代码如下:

package org.model;import java.util.HashSet;import java.util.Set;public class Kcb implements java.io.Serializable {  private String kch;  private String kcm;  private Short kxxq;  private int xs;  private int xf;  private Set xss=new HashSet();  //省略上述各属性的setter和getter方法}

 

Kcb.hbm.xml代码。

  
    
      
      
        
      
        
      
        
      
        
      
        
    
      
      
      

 

类及映射文件修改完成后要在hibernated.cfg.xml文件中进行注册,代码修改。

  
    
liuyanbo    
jdbc:sqlserver://localhost:1433;databaseName=XSCJ    
org.hibernate.dialect.SQLServerDialect    
HibernateConn    
123456    
com.microsoft.sqlserver.jdbc.SQLServerDriver    
true    
    
    
    
  

 

6)Dao层组件实现

下面是这几个实体类的Dao层组件的实现。首先要建立它们的接口Dao。

DlDao.java接口代码如下:

package org.dao;import org.model.Dlb;public interface DlDao {  //根据学号和密码查询  public Dlb validate(String xh,String kl);}

 

对应实现类DlDaoImp.java代码。

package org.dao.imp;import org.dao.DlDao;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.model.Dlb;public class DlDaoImp implements DlDao {    public Dlb validate(String xh, String kl) {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            Query query=session.createQuery("from Dlb where xh=? and kl=?");            query.setParameter(0, xh);            query.setParameter(1, kl);            query.setMaxResults(1);            Dlb dlb=(Dlb) query.uniqueResult();            if(dlb!=null){                return dlb;            }else{                return null;            }        }catch(Exception e){            e.printStackTrace();            return null;        }    }}

 

XsDao.java接口代码如下:

package org.dao;import java.util.List;import org.model.Xsb;public interface XsDao {    //根据学号查询学生信息    public Xsb getOneXs(String xh);    //修改学生信息    public void update(Xsb xs);}

 

对应实现类XsDaoImp.java代码。

package org.dao.imp; import java.util.List;import org.dao.XsDao;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.model.Xsb; public class XsDaoImp implements XsDao{    public Xsb getOneXs(String xh) {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            Query query=session.createQuery("from Xsb where xh=?");            query.setParameter(0, xh);            query.setMaxResults(1);            Xsb xs=(Xsb) query.uniqueResult();            ts.commit();            session.clear();            return xs;        }catch(Exception e){            e.printStackTrace();            return null;        }    }    public void update(Xsb xs) {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            session.update(xs);            ts.commit();            org.util.HibernateSessionFactory.closeSession();        }catch(Exception e){            e.printStackTrace();        }    }}

 

ZyDao.java接口代码如下:

package org.dao;import java.util.List;import org.model.Zyb;public interface ZyDao {    //根据专业ID查询专业信息    public Zyb getOneZy(Integer zyId);    //查询所有专业信息    public List getAll();}

对应实现类ZyDaoImp.java代码。

package org.dao.imp; import java.util.List;import org.dao.ZyDao;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.model.Zyb; public class ZyDaoImp implements ZyDao{    public Zyb getOneZy(Integer zyId) {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            Query query=session.createQuery("from Zyb where id=?");            query.setParameter(0, zyId);            query.setMaxResults(1);            Zyb zy=(Zyb) query.uniqueResult();            ts.commit();            org.util.HibernateSessionFactory.closeSession();            return zy;        }catch(Exception e){            e.printStackTrace();            return null;        }    }     public List getAll() {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            List list=session.createQuery("from Zyb").list();            ts.commit();            org.util.HibernateSessionFactory.closeSession();            return list;        }catch(Exception e){            e.printStackTrace();            return null;        }    }}

 

KcDao.java接口代码如下:

package org.dao;import java.util.List;import org.model.Kcb;public interface KcDao {    public Kcb getOneKc(String kch);    public List getAll();}

 

对应实现类KcDaoImp.java代码。

package org.dao.imp; import java.util.List;import org.dao.KcDao;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.model.Kcb; public class KcDaoImp implements KcDao{    public Kcb getOneKc(String kch) {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            Query query=session.createQuery("from Kcb where kch=?");            query.setParameter(0, kch);            query.setMaxResults(1);            Kcb kc=(Kcb) query.uniqueResult();            ts.commit();            session.clear();       // 清除缓存            return kc;        }catch(Exception e){            e.printStackTrace();            return null;        }     }     public List getAll() {        try{            Session session=org.util.HibernateSessionFactory.getSession();            Transaction ts=session.beginTransaction();            List list=session.createQuery("from Kcb order by kch").list();            ts.commit();            return list;        }catch(Exception e){            e.printStackTrace();            return null;        }    }}

 

7)添加Struts 2的类库及编写struts.xml文件

    把复制到项目的WEB-INF/lib文件夹下。因为在添加学生信息中用到了照片上传,所以这里要把common-fileupload.jar、commin-io.jar也复制到项目的WEB-IFN/lib文件夹下。(也可以这样,由于Struts2与Hibernate需要的jar包部分是重复的,合并jar包然后去掉重复的,并把Jar包复制到项目的WEB-INF/lib文件夹下。)在项目的src文件夹下建立文件struts.xml。内容修改如下:

    
        //这里以后添加Action配置,后面配置的Action都要添加在这里    

 可参考

8)修改web.xml文件

    修改web.xml文件,代码如下:

  
Struts_Hibernate
     
    
login.jsp
  
  
    
struts2
    
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
    
struts2
    
*.action
  
  
    
struts2
    
*.jsp
  

 

9)功能实现

    首先看登录界面login.jsp。

<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%>      学生选课系统         
      
        
          
        
          
        
        
        
          
        
      
      

 

    从JSP文件中可以看出,该表单提交给login.action,所以在struts.xml中的Action配置如下:

    
/main.jsp        //成功后去主界面    
/login.jsp        //失败回到login.jsp

 

LoginAction.java就要应运而生了。代码。

package org.action; import java.util.Map;import org.dao.DlDao;import org.dao.imp.DlDaoImp;import org.model.Dlb;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{  // Dlb类对象,用于存取Dlb属性的值  private Dlb dlb;  // 生成其getter和setter方法  public Dlb getDlb() {    return dlb;  }   public void setDlb(Dlb dlb) {    this.dlb=dlb;  }   public String execute() throws Exception {    DlDao dlDao=new DlDaoImp();                                //得到Dao接口对象    Dlb user=dlDao.validate(dlb.getXh(), dlb.getKl());        //调用Dao中的方法    if(user!=null){      //如果不为空,保存到Session中      Map session=(Map)ActionContext.getContext().getSession();      session.put("user", user);      return SUCCESS;    }else{      return ERROR;    }  }}

 

mian.jsp是由head.jsp、left.jsp及rigth.jsp组合而成,所以它们的代码如下。

head.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>    
        
    

 

left.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>    
        
查询个人信息

        

修改个人信息

        

个人选课情况

        

所有课程信息

    

 

right.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>    
    

 

main.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@  taglib uri="/struts-tags" prefix="s" %>        学生选课系统    
    
    
      
      
      

 

进入主界面后,接下来是查看个人信息的实现。从left.jsp中可以发现,其提交给xsInfo.jsp,对应Action配置如下:

    
/xsInfo.jsp

 

由于学生的信息中有照片信息,这里的处理思路是把要处理照片的信息提交给Action类来读取,所以这里要加入getImage的Action。

XsAction.java的代码。

package org.action; import java.io.File;import java.io.FileInputStream;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import org.apache.struts 2.ServletActionContext;import org.dao.XsDao;import org.dao.ZyDao;import org.dao.imp.KcDaoImp;import org.dao.imp.XsDaoImp;import org.dao.imp.ZyDaoImp;import org.model.Dlb;import org.model.Kcb;import org.model.Xsb;import org.model.Zyb;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport; public class XsAction extends ActionSupport{  XsDao xsDao;  //定义学生对象  private Xsb xs;  //定义课程对象  private Kcb kcb;  //用于获取照片文件  private File zpFile;  //定义专业对象  private Zyb zyb;  //生成其getter和setter方法  public File getZpFile() {    return zpFile;  }   public void setZpFile(File zpFile) {    this.zpFile=zpFile;  }   public Kcb getKcb() {    return kcb;  }   public void setKcb(Kcb kcb) {    this.kcb=kcb;  }   public Zyb getZyb() {    return zyb;  }   public void setZyb(Zyb zyb) {    this.zyb=zyb;  }   public Xsb getXs() {    return xs;  }   public void setXs(Xsb xs) {    this.xs=xs;  }   //默认情况下,用该方法获得当前学生的个人信息  public String execute() throws Exception {    //获得Session对象    Map session=(Map)ActionContext.getContext().getSession();    //从Session中取出当前用户    Dlb user=(Dlb) session.get("user");    //创建XsDao接口对象    xsDao=new XsDaoImp();    //根据登录学号得到该学生信息    Xsb xs=xsDao.getOneXs(user.getXh());    Map request=(Map)ActionContext.getContext().get("request");    //保存    request.put("xs", xs);    return SUCCESS;  }   //读取照片信息  public String getImage() throws Exception{    xsDao=new XsDaoImp();    //得到照片的字节数组    byte[] zp=xsDao.getOneXs(xs.getXh()).getZp();    HttpServletResponse response=ServletActionContext.getResponse();    response.setContentType("image/jpeg");    //得到输出流    ServletOutputStream os=response.getOutputStream();    if(zp!=null&&zp.length>0){      for(int i=0;i

 

成功后跳转的页面xsInfo.jsp。

<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %>      学生选课系统    
    
      
      学号: 
        姓名:
                性别:                  
男          
                    专业:
        出生时间:
                                        总学分:
        备注:
                照片:                  
" width="150">                                           

 

    下面介绍修改学生信息。单击【修改学生信息】超链接,首先要跳转到修改学生信息的界面,供学生自己修改,但是学号是不能被修改的,专业必须是选择,而不是自己填写。从left.jsp中可以看出提交给了updateXsInfo.action,所以Action的配置为:

    
/updateXsInfo.jsp

 

所以就要在XsAction类中加入下面的方法。

//进入修改学生信息页面public String updateXsInfo() throws Exception{  //获取当前用户对象  Map session=(Map)ActionContext.getContext().getSession();  Dlb user=(Dlb) session.get("user");  xsDao=new XsDaoImp();  ZyDao zyDao=new ZyDaoImp();  //取出所有专业信息,因为在修改学生信息时,专业栏是下拉列表  //选择专业,而不是学生自己随便填写  List zys=zyDao.getAll();  //得到当前学生的信息  Xsb xs=xsDao.getOneXs(user.getXh());  Map request=(Map)ActionContext.getContext().get("request");  request.put("zys", zys);  request.put("xs", xs);  return SUCCESS;}

 

修改页面updateXsInfo.jsp的代码。

<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %>            学生选课系统         
        
        
        
            
                
                
                    
                    
                
                
                    
                    
                
                
                    
                
                    
                    
                
                
                    
                    
                
                 
                    
                    
                
                
                    
                    
                
                
                    
                    
                    
                
                
                  
                
            
学号:
" readOnly/>
姓名:
" />
专业:                     
                        
                            
                                
">                                
                                                                        
出生时间:
"/>
备注:
" />
总学分:
" />
照片:
 
            

 

当单击【修改】按钮后,就把学生自己填写的内容提交给了updateXs.action,对应Action的配置如下:

    
/updateXs_success.jsp

   

XsAction类中要加入下面的代码来处理请求。

//修改学生信息public String updateXs() throws Exception{    xsDao =new XsDaoImp();    ZyDao zyDao=new ZyDaoImp();    //创建一个学生对象,用于存放要修改的学生信息    Xsb stu=new Xsb();    //设置学生学号    stu.setXh(xs.getXh());    //由于没有修改学生对应的选修的课程,所以直接取出不用改变    //Hibernate级联到第三张表,所以要设置,    //如果不设置,会认为设置为空,会把连接表中有关内容删除    Set list=xsDao.getOneXs(xs.getXh()).getKcs();    //设置学生对应多项课程的Set    stu.setKcs(list);    //设置用户填写的姓名    stu.setXm(xs.getXm());    //性别    stu.setXb(xs.getXb());    //出生时间    stu.setCssj(xs.getCssj());    //总学分    stu.setZxf(xs.getZxf());    //备注    stu.setBz(xs.getBz());    Zyb zy=zyDao.getOneZy(zyb.getId());    //专业,这里要设置对象,所以下拉列表中传值是要传专业的ID    stu.setZyb(zy);    //处理照片信息    if(this.getZpFile()!=null){        //得到输入流        FileInputStream fis=new FileInputStream(this.getZpFile());        //创建大小为fis.available()的字节数组        byte[] buffer=new byte[fis.available()];        //把输入流读到字节数组中        fis.read(buffer);        stu.setZp(buffer);    }    //修改    xsDao.update(stu);    return SUCCESS;}

 

修改成功后跳转到updateXs_success.jsp页面,代码如下:

<%@ page language="java" pageEncoding="UTF-8"%>      
    恭喜你,修改成功!  

 

下面是Action配置代码:

    
/xsKcs.jsp

 

对应的XsAction类中的处理方法代码如下:

//得到学生选修的课程public String getXsKcs() throws Exception{    Map session=(Map)ActionContext.getContext().getSession();    Dlb user=(Dlb) session.get("user");    String xh=user.getXh();    //得到当前学生的信息    Xsb xsb=new XsDaoImp().getOneXs(xh);    //取出选修的课程Set    Set list=xsb.getKcs();    Map request=(Map) ActionContext.getContext().get("request");    //保存    request.put("list",list);    return SUCCESS;}

 

查询成功后的xsKcs.jsp页面代码。

<%@ page language="java" pageEncoding="UTF-8"%><%@ page language="java" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %>      学生选课系统    
    
      您选课信息如下:              课程号课程名开学学期学时学分操作            
                  
          
          
          
          
          
          
            
" onClick="if(!confirm('您确定退选该课程吗?'))return false;else return true;">退选                              

 

退选课程,只要把该学生的这个课程从Set中remove掉就行了。对应的Action配置如下:

    
/deleteKc_success.jsp

 

对应XsAction类中的处理方法。

//退选课程public String deleteKc() throws Exception{  Map session=(Map)ActionContext.getContext().getSession();  String xh=((Dlb)session.get("user")).getXh();  xsDao=new XsDaoImp();  Xsb xs2=xsDao.getOneXs(xh);  Set list=xs2.getKcs();  Iterator iter=list.iterator();  //取出所有选择的课程进行迭代  while(iter.hasNext()){    Kcb kc2=(Kcb)iter.next();    //如果遍历到退选的课程的课程号就从list中删除    if(kc2.getKch().trim().equals(kcb.getKch())){      iter.remove();    }  }  //设置课程的Set  xs2.setKcs(list);  xsDao.update(xs2);  return SUCCESS;}

 

退选课程成功界面deleteKc_success.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>    
            退选成功!    

   

在left.jsp中还有一个链接就是查询所有课程的,其实查询出所有课程也是为了让学生选课的,其Action配置如下:

    
/allKc.jsp

 

对应Action实现类,可以发现是一个新的Action类名为KcAction.java,代码如下:

package org.action; import java.util.List;import java.util.Map;import org.dao.KcDao;import org.dao.imp.KcDaoImp;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class KcAction extends ActionSupport{  public String execute()throws Exception{    KcDao kcDao=new KcDaoImp();    List list=kcDao.getAll();    Map request=(Map)ActionContext.getContext().get("request");    request.put("list", list);    return SUCCESS;  }}

 

成功页面allKc.jsp。

<%@ page language="java" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %>  
    
学生选课系统    
    
      所有课程信息              课程号课程名开学学期        学时学分操作            
                  
          
          
          
          
          
            
" onClick="if(!confirm('您确定选修该课程吗?')) return false;else return true;">选修                                                        

 

在每个课程的后面有【选修】超链接,提交给selectKc.action,Action的配置如下:

    
/selectKc_success.jsp    
/selectKc_fail.jsp

   

对应Action实现类的方法(由于是学生选课,所以该方法在XsAction中)。

//选定课程public String selectKc() throws Exception{  Map session=(Map)ActionContext.getContext().getSession();  String xh=((Dlb)session.get("user")).getXh();  xsDao=new XsDaoImp();  Xsb xs3=xsDao.getOneXs(xh);  Set list=xs3.getKcs();  Iterator iter=list.iterator();  //选修课程时先遍历已经选的课程,如果在已经选修的课程中找到就返回ERROR  while(iter.hasNext()){    Kcb kc3=(Kcb)iter.next();    if(kc3.getKch().equals(kcb.getKch())){      return ERROR;    }  }  //如果没找到,就添加到集合中  list.add(new KcDaoImp().getOneKc(kcb.getKch()));  xs3.setKcs(list);  xsDao.update(xs3);  return SUCCESS;}

 

成功页面selectKc_success.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>    
        你已经成功选择该课程!    

 

失败页面selectKc_fail.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>    
            你已经选择该课程,请不要重复选取!    

 

10)部署运行

    完成以后,部署项目,启动Tomcat,就可以运行项目。一个简易的学生选课系统就形成了。

附:目录

转载于:https://my.oschina.net/jerrypan/blog/628927

你可能感兴趣的文章
CentOS6使用第三方YUM源(EPEL、RPMForge和RPMFusion)
查看>>
Oracle dataGuard专题:Rman通过duplicate创建standby
查看>>
CCNA(Stand-ALONE)Lab2-Introduction to the Basic User Interface
查看>>
没有服务台,就没有ITSM
查看>>
加点自已内容的新内核下L7-FILTER的应用实例!
查看>>
FOSCommentBundle功能包:设置Doctrine ORM映射
查看>>
Eclipse下开发js
查看>>
Oracle RAC负载均衡和透明应用失败切换的配置和测试过程(一、测试名词解释)...
查看>>
linux 处理键盘 鼠标事件
查看>>
不要返回null之EmptyFactory
查看>>
Unity strip engine code 遇到執行不能之問題與解決
查看>>
关于Excle中的VLookUp的函数的使用
查看>>
Azure China (10) 使用Azure China SAS Token
查看>>
Spring-AOP实践 - 统计访问时间
查看>>
电子技术·笔记6(2013-05\06)
查看>>
Makefile简易模板
查看>>
Windows Azure Storage (23) 计算Azure VHD实际使用容量
查看>>
压力测试工具Siege介绍
查看>>
ASP.NET如何调用MySQL的存储过程
查看>>
Visual Studio 进行Excel相关开发,Microsoft.Office.Interop.Excel.dll库
查看>>