4.5 Hibernate与Struts2整合应用


1.DAO模式

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

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

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

    该系统就是为了实现这样一些功能,学生登陆系统后,能够查看、修改我的信息,查看我的选课状况,选定课程及退选课程。其登陆界面如图4.25所示。java

图4.25  登陆界面web

  

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

图4.26  主界面数据库

单击【查询我的信息】超连接,能够查看当前用户的我的信息,如图4.27所示。apache

图4.27  查询我的信息界面数组

单击【我的选课状况】超连接,能够列举出当前用户的我的选课状况,如图4.28所示。缓存

图4.28  我的选课状况界面session

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

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

图4.29  全部课程信息界面


 

1)创建数据库及表结构

    根据上面所述功能,该系统须要创建登陆表、学生表、专业表、课程表,以及学生课程表即链接表。(表结构参见《附录 学生成绩管理系统数据库)

 

2)在MyEclipse中建立对SQL Server 的链接

    步骤见4.2.1节的第2步

 

3)建立Web项目

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

 

4)添加Hibernate开发能力

    步骤见4.2.1节的第4步

 

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文件代码。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.model.Xsb" table="XSB" schema="dbo" catalog="XSCJ">
        <id name="xh" type="java.lang.String">
            <column name="XH" length="6" />
            <generator class="assigned" />
        </id>
        <!-- 与专业表是多对一关系 -->
        <many-to-one name="zyb" class="org.model.Zyb" fetch="select" cascade="all" lazy="false" >
            <column name="ZY_ID" />
        </many-to-one>
        <property name="xm" type="java.lang.String">
            <column name="XM" length="50" />
        </property>
        <property name="xb" type="java.lang.Byte">
            <column name="XB" />
        </property>
        <property name="cssj" type="java.util.Date">
            <column name="CSSJ" length="23" />
        </property>
        <property name="zxf" type="java.lang.Integer">
            <column name="ZXF" />
        </property>
        <property name="bz" type="java.lang.String">
            <column name="BZ" length="500" />
        </property>
        <property name="zp">
            <column name="ZP" />
        </property>
        <!-- 与课程表是多对多关系 -->
        <set name="kcs" table="XS_KCB" lazy="false" cascade="save-update">
                <key column="XH"></key>
                <many-to-many class="org.model.Kcb" column="KCH"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

   

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代码。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
  PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
  'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
<hibernate-mapping>
  <class catalog="XSCJ" name="org.model.Kcb" schema="dbo" table="KCB">
    <id name="kch" type="java.lang.String">
      <column length="3" name="KCH"/>
      <generator class="assigned"/>
    </id>
    <property name="kcm" type="java.lang.String">
      <column length="20" name="KCM"/>
    </property>
    <property name="kxxq" type="java.lang.Short">
      <column name="KXXQ"/>
    </property>
    <property name="xs" type="java.lang.Integer">
      <column name="XS"/>
    </property>
    <property name="xf" type="java.lang.Integer">
      <column name="XF"/>
    </property>
    <!-- 与学生表是多对多关系 -->
    <set inverse="true" lazy="true" name="xss" table="XS_KCB">
      <key column="KCH"/>
      <many-to-many class="org.model.Xsb" column="XH"/>
    </set>
  </class>
</hibernate-mapping>

 

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

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration
  PUBLIC '-//Hibernate/Hibernate Configuration DTD 3.0//EN'
  'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'>
<hibernate-configuration>
  <session-factory>
    <property name="connection.username">liuyanbo</property>
    <property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=XSCJ</property>
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="myeclipse.connection.profile">HibernateConn</property>
    <property name="connection.password">123456</property>
    <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="show_sql">true</property>
    <mapping resource="org/model/Xsb.hbm.xml"/>
    <mapping resource="org/model/Kcb.hbm.xml"/>
    <mapping resource="org/model/Zyb.hbm.xml"/>
    <mapping resource="org/model/Dlb.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

 

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文件

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" extends="struts-default" namespace="/">
        //这里之后添加Action配置,后面配置的Action都要添加在这里
    </package>
</struts>

 可参考3.6.1节的第6步

8)修改web.xml文件

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>Struts_Hibernate</display-name>  
   <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
</web-app>

 

9)功能实现

    首先看登陆界面login.jsp。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
  <head>
    <title>学生选课系统</title>
  </head>
 
  <body>
    <s:form action="login.action" method="post">
      <table>
        <tr>
          <td colspan="2"><img src="/Struts_Hibernate/image/head.jpg"></td>
        </tr>
        <tr><s:textfield name="dlb.xh" label="学号" size="20"></s:textfield></tr>
        <tr><s:password name="dlb.kl" label="口令" size="22"></s:password></tr>
        <tr>
          <td align="left"><input type="submit" value="登陆" /></td>
          <td><input type="reset" value="重置" /></td>
        </tr>
      </table>
    </s:form>
  </body>
</html>

 

    从JSP文件中能够看出,该表单提交给login.action,因此在struts.xml中的Action配置以下:

<action name="login" class="org.action.LoginAction">
    <result name="success">/main.jsp</result>        //成功后去主界面
    <result name="error">/login.jsp</result>        //失败回到login.jsp
</action>

 

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"%>
<html>
    <body bgcolor="#D9DFAA">
        <img src="/Struts_Hibernate/image/head.jpg">
    </body>
</html>

 

left.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
    <body bgcolor="#D9DFAA">
        <a href="xsInfo.action" target="right">查询我的信息</a><p>
        <a href="updateXsInfo.action" target="right">修改我的信息</a><p>
        <a href="getXsKcs.action" target="right">我的选课状况</a><p>
        <a href="getAllKc.action" target="right">全部课程信息</a><p>
    </body>
</html>

 

right.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
    <body bgcolor="#D9DFAA">
    </body>
</html>

 

main.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@  taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
      <title>学生选课系统</title>
  </head>
  <frameset rows="30%,*" border="0">
    <frame src="head.jsp">
    <frameset cols="15%,*" border="1">
      <frame src="left.jsp">
      <frame src="right.jsp" name="right">
    </frameset>
  </frameset>
</html>

 

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

<action name="xsInfo" class="org.action.XsAction">
    <result name="success">/xsInfo.jsp</result>
</action>
<action name="getImage" class="org.action.XsAction" method="getImage">
</action>

 

因为学生的信息中有照片信息,这里的处理思路是把要处理照片的信息提交给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<zp.length;i++){
        os.write(zp[i]);
      }
    }
    //不去任何页面
    return NONE;
  }
  //这里后面还要加入其余方法,这里先不列出,用到后会列出代码,要加入到这里
}

 

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

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
    <title>学生选课系统</title>
  </head>
  <body bgcolor="#D9DFAA">
    <table width="400">
      <s:set value="#request.xs" name="xs"/>
      <tr><td>学号:</td><td> <s:property value="#xs.xh" /> </td> </tr>
      <tr><td>姓名:</td><td><s:property value="#xs.xm"/> </td> </tr>
      <tr>
        <td>性别:</td>
        <td>
          <s:if test="#xs.xb==1">男</s:if>
          <s:else>女</s:else>
        </td>
      </tr>
      <tr><td>专业:</td><td><s:property value="#xs.zyb.zym"/> </td> </tr>
      <tr><td>出生时间:</td><td><s:date name="#xs.cssj" format="yyyy-MM-dd"/> </td>                                 </tr>
      <tr><td>总学分:</td><td><s:property value="#xs.zxf"/> </td> </tr>
      <tr><td>备注:</td><td><s:property value="#xs.bz"/> </td> </tr>
      <tr>
        <td>照片:</td>
        <td>
          <img src="getImage.action?xs.xh=<s:property value="#xs.xh"/>" width="150">
        </td>
      </tr>                       
    </table>
  </body>
</html>

 

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

<action name="updateXsInfo" class="org.action.XsAction" method="updateXsInfo">
    <result name="success">/updateXsInfo.jsp</result>
</action>

 

因此就要在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" %>
<html>
    <head>
        <title>学生选课系统</title>
    </head>
 
    <body bgcolor="#D9DFAA">
        <s:set name="xs" value="#request.xs"></s:set>
        <!-- 上传文件时要加入黑体部分 -->
        <s:form action="updateXs.action" method="post" enctype="multipart/form-data">
            <table>
                <tr>
                    <td>学号:</td>
                    <td><input type="text" name="xs.xh" value="<s:property value="#xs.xh"/>" readOnly/></td>
                </tr>
                <tr>
                    <td>姓名:</td>
                    <td><input type="text" name="xs.xm" value="<s:property value="#xs.xm"/>" /></td>
                </tr>
                <tr>
                    <s:radio list="#{1:'男',0:'女'}" value="#xs.xb" label="性别" name="xs.xb"></s:radio>
                </tr>
                <tr>
                    <td>专业:</td>
                    <td>
                    <!-- 遍历出专业的信息-->
                        <select name="zyb.id">
                            <s:iterator id="zy" value="#request.zys">
                                <option value="<s:property value="#zy.id"/>">
                                <s:property value="#zy.zym"/></option>
                            </s:iterator>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>出生时间:</td>
                    <td><input type="text" name="xs.cssj" value="<s:date name="#xs.cssj" format="yyyy-MM-dd"/>"/></td>
                </tr> 
                <tr>
                    <td>备注:</td>
                    <td><input type="text" name="xs.bz" value="<s:property value="#xs.bz"/>" /></td>
                </tr>
                <tr>
                    <td>总学分:</td>
                    <td><input type="text" name="xs.zxf" value="<s:property value="#xs.zxf"/>" /></td>
                </tr>
                <tr>
                    <td>照片:</td>
                    <!-- 上传照片 -->
                    <td><input type="file" name="zpFile"/> </td>
                </tr>
                <tr>
                  <td><input type="submit" value="修改"/></td>
                </tr>
            </table>
        </s:form>
    </body>
</html>

 

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

<action name="updateXs" class="org.action.XsAction" method="updateXs">
    <result name="success">/updateXs_success.jsp</result>
</action>

   

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"%>
<html>
  <head>
  </head>
  <body bgcolor="#D9DFAA">
    恭喜你,修改为功!
  </body>
</html>

 

下面是Action配置代码:

<action name="getXsKcs" class="org.action.XsAction" method="getXsKcs">
    <result name="success">/xsKcs.jsp</result>
</action>

 

对应的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" %>
<html>
  <head>
    <title>学生选课系统</title>
  </head>
  <body bgcolor="#D9DFAA">
    <table width="400" border=1>
      <caption>您选课信息以下:</caption>
      <tr>
        <th>课程号</th><th>课程名</th><th>开学学期</th><th>学时</th><th>学分</th><th>操做</th>
      </tr>
      <s:iterator value="#request.list" id="kc">
        <tr>
          <td align="center"><s:property value="#kc.kch"/></td>
          <td align="center"><s:property value="#kc.kcm"/></td>
          <td align="center"><s:property value="#kc.kxxq"/></td>
          <td align="center"><s:property value="#kc.xs"/></td>
          <td align="center"><s:property value="#kc.xf"/></td>
          <td align="center">
          <!-- 退选该课程,这里用JavaScript来肯定是否退选 -->
            <a href="deleteKc.action?kcb.kch=<s:property value='#kc.kch'/>" onClick="if(!confirm('您肯定退选该课程吗?'))return false;else return true;">退选</a>
          </td>
        </tr>
      </s:iterator>
    </table>
  </body>
</html>

 

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

<action name="deleteKc" class="org.action.XsAction" method="deleteKc">
    <result name="success">/deleteKc_success.jsp</result>
</action>

 

对应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"%>
<html>
    <body bgcolor="#D9DFAA">
            退选成功!
    </body>
</html>

   

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

<action name="getAllKc" class="org.action.KcAction">
    <result name="success">/allKc.jsp</result>
</action>

 

对应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" %>
<html>
  <head >
    <title>学生选课系统</title>
  </head>
  <body bgcolor="#D9DFAA">
    <table width="400" border="1">
      <caption>全部课程信息</caption>
      <tr>
        <th>课程号</th><th>课程名</th><th>开学学期</th>
        <th>学时</th><th>学分</th><th>操做</th>
      </tr>
      <s:iterator value="#request.list" id="kc">
        <tr>
          <td align="center"><s:property value="#kc.kch"/></td>
          <td align="center"><s:property value="#kc.kcm"/></td>
          <td align="center"><s:property value="#kc.kxxq"/></td>
          <td align="center"><s:property value="#kc.xs"/></td>
          <td align="center"><s:property value="#kc.xf"/></td>
          <td align="center">
            <a href="selectKc.action?kcb.kch=<s:property value="#kc.kch"/>" onClick="if(!confirm('您肯定选修该课程吗?')) return false;else return true;">选修</a>
          </td>
        </tr>                          
      </s:iterator>
    </table>
  </body>
</html>

 

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

<action name="selectKc" class="org.action.XsAction" method="selectKc">
    <result name="success">/selectKc_success.jsp</result>
    <result name="error">/selectKc_fail.jsp</result>
</action>

   

对应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"%>
<html>
    <body bgcolor="#D9DFAA">
        你已经成功选择该课程!
    </body>
</html>

 

失败页面selectKc_fail.jsp:

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

 

10)部署运行

    完成之后,部署项目,启动Tomcat,就能够运行项目。一个简易的学生选课系统就造成了。


附:目录《JavaEE基础实用教程》笔记说明

相关文章
相关标签/搜索