文档章节

4.5 Hibernate与Struts2整合应用

JerryPan
 JerryPan
发布于 2016/03/03 06:35
字数 4816
阅读 1013
收藏 1


1.DAO模式

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

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

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

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

图4.25  登录界面

  

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

图4.26  主界面

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

图4.27  查询个人信息界面

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

图4.28  个人选课情况界面

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

单击【所有课程信息】超链接,可显示所有课程的信息,如图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基础实用教程》笔记说明

© 著作权归作者所有

JerryPan
粉丝 21
博文 54
码字总数 64891
作品 0
宁波
程序员
私信 提问
加载中

评论(3)

t
tommorrw
终于跑起来了,搞了两三天了,该死的zyb
JerryPan
JerryPan 博主

引用来自“1437丶”的评论

有源码压缩包吗?
没有,所有的代码都已经贴上去了,而且我运行通过的
1
1437丶
有源码压缩包吗?
《JavaEE基础实用教程》笔记说明

“《JavaEE基础实用教程》笔记”分类中的文章是本人学习《JavaEE基础实用教程》时所做的笔记。 该书作者:郑阿奇 著。ISBN:9787121091360。 这里整理出第3、4、5章的笔记,主要内容是Strut...

JerryPan
2016/02/19
1K
1
Java Web学习计划

--- 本月为入门阶段,从零开始,一步一步的做出一个实用的网站。 深入学习Java语言,初步掌握前端技术,使用JSP和MySQL完成一个简单的网站 第1周 Java高级编程学习目标:
1.深入了解JDK环境...

SVD
2016/12/01
154
0
Struts2+Spring3+Hibernate——整合byMaven

在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框架来开发项目,而这些框架一般不是单独使用的,经常是Str...

凡尘里的一根葱
2015/11/10
245
0
SSH整合开发[Spring2.5+Hibernate3.3+Struts2]

1.首先整合Spring和Hibernate ①引入jar包: hibernate核心安装包下的: hibernate3.jar lib\required\*.jar lib\optional\ehcache-1.2.3.jar hibernate 注解安装包下的 lib\test\slf4j-log4j......

长平狐
2013/01/06
895
0
求助如何学好Spring+Hibernate实际项目开发,请推荐一些视频教程给我,谢谢。

我之前买了书“Java EE企业应用实战Struts2 + Spring 4 + Hibernate整合开发 ”,这本书很像C++primer,应该说是一本工具书,这本书前面的struts2感觉还挺好懂的,Hibernate和 Spring也勉强还...

hstaewg
2015/09/23
238
2

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
17
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部