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基礎實用教程》筆記說明

相關文章
相關標籤/搜索