SSH的簡單入門體驗(Struts2.1+Spring3.1+Hibernate4.1)- 查詢系統(下)


我們繼續吧,SSH最大的優點就是實現的系統的松耦合,能夠將后台和前台有機的分離開來。

 

一、目錄結構

一個好的程序要有一個好的開始。我們先來看看整個目錄結構吧

主要的是三層架構概念,或者說是mvc的概念。

二、Hibernate實體類

  1. 首先大家要懂得Hibernate運行的機制,簡單的說就是你建一個類,然后將這個類映射到Hibernate中作為數據庫的一張表,通過對這個類的操作來進行數據庫的增刪改查。具體的概念可以上網度查找資料或者通過書籍來學習。由於我也沒有系統的學過,這里就不便詳細的闡述了。
  2. 那么我們先建立一個實體類放在cpacm.pojo包下,名為Archive,表示文書檔案類。具體代碼如下:
    package cpacm.pojo;
    
    public class Archive {
    
        private int aid;
        private String title;
        private String year;//年度
        private String dcNumber;//文號
        private int classid;//分類號
        private String fileNum;//案卷號
        private String location;//所在地
        private String level;//密級
        private String outDate;//保管期限
        private String partNum;//件號
        private String date1;//錄入日期開始
        private String date2;//錄入日期結束
        private int isBorrow;//是否出借
        
        //Hibernate要求必須有一個空的構造函數
        public Archive() {
            
        }
        
        //自定義的一個構造函數
        public Archive(int aid, String title, String year, String dcNumber,
                int classid, String fileNum, String location, String level,
                String outDate, String partNum, String date1, String date2, int isBorrow) {
            super();
            this.aid = aid;
            this.title = title;
            this.year = year;
            this.dcNumber = dcNumber;
            this.classid = classid;
            this.fileNum = fileNum;
            this.location = location;
            this.level = level;
            this.outDate = outDate;
            this.partNum = partNum;
            this.date1 = date1;
            this.date2 = date2;
            this.isBorrow = isBorrow;
        }
    
        //下面都是屬性的get,set方法
        
        public int getAid() {
            return aid;
        }
    
        public void setAid(int aid) {
            this.aid = aid;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getYear() {
            return year;
        }
    
        public void setYear(String year) {
            this.year = year;
        }
    
        public String getDcNumber() {
            return dcNumber;
        }
    
        public void setDcNumber(String dcNumber) {
            this.dcNumber = dcNumber;
        }
    
        public int getClassid() {
            return classid;
        }
    
        public void setClassid(int classid) {
            this.classid = classid;
        }
    
        public String getFileNum() {
            return fileNum;
        }
    
        public void setFileNum(String fileNum) {
            this.fileNum = fileNum;
        }
    
        public String getLocation() {
            return location;
        }
    
        public void setLocation(String location) {
            this.location = location;
        }
    
        public String getLevel() {
            return level;
        }
    
        public void setLevel(String level) {
            this.level = level;
        }
    
        public String getOutDate() {
            return outDate;
        }
    
        public void setOutDate(String outDate) {
            this.outDate = outDate;
        }
    
        public String getPartNum() {
            return partNum;
        }
    
        public void setPartNum(String partNum) {
            this.partNum = partNum;
        }
    
        public String getDate1() {
            return date1;
        }
    
        public void setDate1(String date1) {
            this.date1 = date1;
        }
    
        public String getDate2() {
            return date2;
        }
    
        public void setDate2(String date2) {
            this.date2 = date2;
        }
    
        public int getIsBorrow() {
            return isBorrow;
        }
    
        public void setIsBorrow(int isBorrow) {
            this.isBorrow = isBorrow;
        }    
    }

     

  3. 接下來我們要把這個類的和hibernate的數據庫綁定,有兩種方法:(1)xml配置文件;(2)注解。我們這里用配置文件來進行綁定,注解的話會比較方便,大家有興趣的話可以自己嘗試用注解來映射。

    那么我們建立一個叫做Archive.hbm.xml的配置文件(注意文件名要與實體類Archive對應,方便我們查找),跟實體類Archive.java放在一起。配置代碼如下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
    <!-- name是表示你要映射類的位置。table表示你要在數據庫生成的表名 -->
        <class name="cpacm.pojo.Archive" table="Archive">
            <id name="aid"> <!-- 實體類中屬性名  下同-->
                <column name="aid" /> <!-- 表中的列名 下同-->
                <generator class="native"></generator><!-- 自增長id -->
            </id>
            <property name="title" >  
                <column name="title" length="50" />  
            </property>
            <property name="year" >  
                <column name="year" length="10" />  
            </property>
            <property name="classid">  
                <column name="classid" not-null="true" />  
            </property>
            <property name="dcNumber" >  
                <column name="dcNumber" length="20" />  
            </property>
            <property name="fileNum" >  
                <column name="fileNum" length="20" />  
            </property>
            <property name="location" >  
                <column name="location" length="20" />  
            </property>
            <property name="level" >  
                <column name="level" length="20" />  
            </property>
            <property name="outDate" >  
                <column name="outDate" length="20" />  
            </property>
            <property name="partNum">  
                <column name="partNum" length="20" />  
            </property>
            <property name="date1">  
                <column name="date1" />  
            </property>
            <property name="date2">  
                <column name="date2" />  
            </property>
            <property name="isBorrow" >  
                <column name="isBorrow"/>  
            </property>
        </class>
    
    </hibernate-mapping>
  4. 最后到spring的配置文件applicationContext.xml中,告知spring有實體類要與Hibernate綁定
    <!-- 配置實體Hibernate的描述文件 -->
            <property name="mappingResources">
                <list>
                    <!-- 實體類列表 -->
                    <value>cpacm/pojo/Archive.hbm.xml</value>
                </list>
            </property>

    放在bean id="sessionFactory"的內部中。具體可以看看上一篇中的applicationContext.xml代碼

  5. 這樣實體類的映射就完成了,接下來我們來看看怎么在SSH中用Hibernate操作數據庫。

三、Hibernate數據層DAO

  1. Dao層以及后面的Service層我們要創建大量的接口來進行操作,雖然繁瑣,但會充分體現整個系統設計的優點(像可移植性,可擴充性等)
  2. 首先我們要建立一個共用的Dao類和接口在cpacm.dao包中
    IDao接口
    package cpacm.dao;
    
    import java.io.Serializable;
    import java.util.List;
    
    public interface IDao<T, ID extends Serializable> {
    
        public void save(T transientInstance) throws Exception;
    
        public void delete(T persistentInstance) throws Exception;
    
        public void update(T instance) throws Exception;
    
        public int updateByQuery(String hql);
    
        public T findById(ID id);
    
        public List<T> findAll();
    
        public List<T> queryForPage(String hql, int offset, int length);
    
        public List<T> findByQuery(String queryString);
    }

    里面包含了各個數據庫的操作
    Dao類

    package cpacm.dao;
    
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.util.List;
    
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.criterion.Criterion;
    
    public abstract class Dao<T,ID extends Serializable> implements IDao<T, ID>{
        
        private SessionFactory sessionFactory;//加載數據庫連接(使用spring實現加載)
        private Class<T> persistentClass;
       
        //sessionFactory的get和set方法。
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
       
        //用構造方法處理Class<T>以下為固定模式
        @SuppressWarnings("unchecked")
        public Dao()
        {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                    .getGenericSuperclass()).getActualTypeArguments()[0];
        }
       
        public Class<T> getPersistentClass() {
            return persistentClass;
        }
       
        //對表的操作(增刪改查)
        //保存
        public void save(T transientInstance) throws Exception
        {
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin();
                session.save(transientInstance);
                session.getTransaction().commit();
            } catch (RuntimeException e) {
                throw e;
            }
        }
       
        //刪除
        public void delete(T persistentInstance) throws Exception
        {
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                session.delete(persistentInstance);
                session.getTransaction().commit();
            } catch (RuntimeException e) {
                throw e;
            }
        }
       
       
        //更新
        public void update(T instance) throws Exception
        {
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                session.saveOrUpdate(instance);
                session.getTransaction().commit();
            } catch (RuntimeException e) {
                // TODO: handle exception
                throw e;
            }
        }
       
       
        //根據傳進來的HQL語句更新,返回受影響行數
        public int updateByQuery(String hql)
        {
            int k=0;
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                k=session.createQuery(hql).executeUpdate();
                session.getTransaction().commit();
            } catch (RuntimeException e) {
                // TODO: handle exception
                throw e;
            }
            return k;
        }
       
        //根據傳進來的ID進行查詢
        public T findById(ID id)
        {
           
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                @SuppressWarnings("unchecked")
                T instance = (T) session.get(getPersistentClass(), id);
                session.getTransaction().commit();
                return instance;
            } catch (RuntimeException e) {
                // TODO: handle exception
                throw e;
            }
        }
       
        //根據傳進來的hql查詢
        @SuppressWarnings("unchecked")
        public List<T> findByQuery(String hql)
        {
            try {
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                List<T> q = session.createQuery(hql).list();
                session.getTransaction().commit();
                return q;
                /*return sessionFactory.getCurrentSession().createQuery(hql).list();*/
            } catch (RuntimeException e) {
                // TODO: handle exception
                throw e;
            }
        }
       
        //查找所有表里的所有內容
        public List<T> findAll()
        {
            try {
                return findByCriteria();//調用下面的findByCriteria方法
            } catch (RuntimeException e) {
                // TODO: handle exception
                throw e;
            }
        }
       
        //查找表里的所有內容並返回
        @SuppressWarnings("unchecked")
        protected List<T> findByCriteria(Criterion... criterion) {
            Session session= getSessionFactory().getCurrentSession();
            session.getTransaction().begin(); 
            Criteria crit = session.createCriteria(
                    getPersistentClass());
            session.getTransaction().commit();
            for (Criterion c : criterion) {
                crit.add(c);
            }
            return crit.list();
        }
       
        //jQuery Easyui Datagrid需要的方法,根據傳進來的hql,當前頁數,頁面長度返回數據列
        public List<T> queryForPage(String hql, int offset, int length) {
            try{
                Session session= getSessionFactory().getCurrentSession();
                session.getTransaction().begin(); 
                @SuppressWarnings("unchecked")
                List<T> results=session.createQuery(hql)
                        .setFirstResult(offset)
                        .setMaxResults(length)
                        .list();
                session.getTransaction().commit();
                return results;
            }catch (RuntimeException re) {
                throw re;
            }
        }
    }
  3. 接下來繼續在cpacm.dao中針對實體類建立dao類和接口
    IArchiveDao
    package cpacm.dao;
    
    import cpacm.pojo.Archive;
    
    public interface IArchiveDao extends IDao<Archive,Integer>{
    
    }

    很簡單,繼承公用Dao接口就行了

    ArchiveDao
    package cpacm.dao;
    
    import cpacm.pojo.Archive;
    
    public class ArchiveDao extends Dao<Archive, Integer> implements IArchiveDao {
        
        
    }

    一樣簡單,繼承公用Dao類和IArchive接口

    如此一來,我們就可以擴展ArchiveDao數據操作的功能。

四、邏輯設計Service層

設計方式跟Dao層類似,同樣也是設計成接口模式。且更重要的一點是接口是繼承Dao層的實體接口,這樣保證了行為的一致性,如下

IArchiveService

 

package cpacm.service;

import cpacm.dao.IArchiveDao;

public interface IArchiveService extends IArchiveDao {

}

 

 

ArchiveService

package cpacm.service;

import java.util.List;

import cpacm.dao.ArchiveDao;
import cpacm.pojo.Archive;

public class ArchiveService implements IArchiveService {
    
    private ArchiveDao archiveDao;//加載數據庫操作類(使用spring實現加載)

    @Override
    public void save(Archive transientInstance) throws Exception {
        // TODO Auto-generated method stub
        archiveDao.save(transientInstance);
    }

    @Override
    public void delete(Archive persistentInstance) throws Exception {
        // TODO Auto-generated method stub
        archiveDao.delete(persistentInstance);
    }

    @Override
    public void update(Archive instance) throws Exception {
        // TODO Auto-generated method stub
        archiveDao.update(instance);
    }

    @Override
    public int updateByQuery(String hql) {
        // TODO Auto-generated method stub
        return archiveDao.updateByQuery(hql);
    }

    @Override
    public Archive findById(Integer id) {
        // TODO Auto-generated method stub
        return archiveDao.findById(id);
    }

    @Override
    public List<Archive> findAll() {
        // TODO Auto-generated method stub
        return archiveDao.findAll();
    }

    @Override
    public List<Archive> queryForPage(String hql, int offset, int length) {
        // TODO Auto-generated method stub
        return archiveDao.queryForPage(hql, offset, length);
    }

    @Override
    public List<Archive> findByQuery(String queryString) {
        // TODO Auto-generated method stub
        return archiveDao.findByQuery(queryString);
    }

    public ArchiveDao getArchiveDao() {
        return archiveDao;
    }

    public void setArchiveDao(ArchiveDao archiveDao) {
        this.archiveDao = archiveDao;
    }
    
}

五、Struts控制層Action

這一塊是我們與前台交互最重要的部分,通過設定Action的行為來控制后台。

  1. ArchiveAction類
    package cpacm.action;
    
    import java.util.Iterator;
    import java.util.List;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import cpacm.pojo.Archive;
    import cpacm.service.ArchiveService;
    import cpacm.service.BaseService;
    
    public class ArchiveAction extends ActionSupport {
    
        /**
         * 
         */
        private static final long serialVersionUID = 7966166028096000810L;
    
        private Archive acv = new Archive();
    
        private BaseService<Archive> baseService;
        
        private ArchiveService archiveService;//加載邏輯設計類(使用spring實現加載)
    
        private List<Archive> Archives;
        
        private static String lastQueryString;
        
        private int tag;
    
        public String Query() {
            String queryString;
            queryString = "select a from Archive as a ";
            queryString += "where ";
            queryString += "a.classid like '%" + acv.getClassid() + "%' ";
    
            queryString += "and ";
            queryString += "a.date1 like '%" + acv.getDate1() + "%' ";
            queryString+="and ";
            queryString+="date2 like '%"+acv.getDate2()+"%' ";
            queryString+="and ";
            queryString+="dcNumber like '%"+acv.getDcNumber()+"%' ";
            queryString+="and ";
            queryString+="fileNum like '%"+acv.getFileNum()+"%' ";
            queryString+="and ";
            queryString+="level like '%"+acv.getLevel()+"%' ";
            queryString+="and ";
            queryString+="location like '%"+acv.getLocation()+"%' ";
            queryString+="and ";
            queryString+="outDate like '%"+acv.getOutDate()+"%' ";
            queryString+="and ";
            queryString+="partNum like '%"+acv.getPartNum()+"%' ";
            queryString+="and ";
            queryString+="title like '%"+acv.getTitle()+"%' ";
            queryString+="and ";
            queryString+="year like '%"+acv.getYear()+"%' ";
            lastQueryString = queryString;
            System.out.println("lastQueryString"+lastQueryString);
            System.out.println("queryString"+queryString);
            Archives = archiveService.findByQuery(queryString);
            return "Query";
        }
        
        public String LastQuery(){
            Archives = archiveService.findByQuery(lastQueryString);
            return "Query";
        }
    
        public String toUpdate(){
            acv = archiveService.findById(acv.getAid());
            return "toUpdate";
        }
        public String Update(){
            try {
                archiveService.update(acv);
                LastQuery();
                return "success";
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return "fail";
            }
        }
        public String Delete(){
            try {
                archiveService.delete(acv);
                LastQuery();
                return "success";
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return "fail";
            }
        }
        public String Add(){
            try {
                archiveService.save(acv);
                return "success";
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return "fail";
            }
        }
        public String QueryByclassID(){
            String queryString;
            queryString = "select a from Archive as a ";
            queryString += "where ";
            queryString += "a.classid = '" + acv.getClassid() + "'";
            System.out.println("queryString"+queryString);
            lastQueryString = queryString;
            Archives = archiveService.findByQuery(queryString);
            return "success";
            
        }
        
        
        public Archive getAcv() {
            return acv;
        }
    
        public void setAcv(Archive acv) {
            this.acv = acv;
        }
    
        public BaseService<Archive> getBaseService() {
            return baseService;
        }
    
        public void setBaseService(BaseService<Archive> baseService) {
            this.baseService = baseService;
        }
    
        public List<Archive> getArchives() {
            return Archives;
        }
    
        public void setArchives(List<Archive> archives) {
            Archives = archives;
        }
    
        public ArchiveService getArchiveService() {
            return archiveService;
        }
    
        public void setArchiveService(ArchiveService archiveSerive) {
            this.archiveService = archiveSerive;
        }
    
        public int getTag() {
            return tag;
        }
    
        public void setTag(int tag) {
            this.tag = tag;
        }
    
    }

    在struts.xml定義的Action行為都在這里實現,然后返回一個字段(像success,fail等的字符串來決定執行Action后要跳轉的頁面。
    具體代碼請看上一篇的Struts.xml代碼

  2. 像在下面這段配置代碼中
    <action name="query" class="ArchiveAction" method="Query">
                <result name="Query">/frame/ArcDataGrid.jsp</result>
    </action>

    前台訪問query,然后會轉入ArchiveAction(這里是spring的id,里面存放着文件的路徑)所在的路徑,執行Query()方法。
    如果返回了一個"Query"的字符串,就會跳到/frame/ArcDataGrid.jsp頁面。
    這樣就實現了控制器的效果。

六、Spring反轉控制注入bean

不知道大家剛才有沒有注意到剛才的類中有幾個對象是沒有實例化的,這里就是使用了Spring的反轉控制。
像這里

private ArchiveDao archiveDao;//加載數據庫操作類(使用spring實現加載)

(重要的是你要為這些類設置set,get方法)

它是通過Spring的配置文件實現的

 

以上后台的部分就算是結束了,那么我們通過前台來實現吧。

七、JSP前台頁面

前台界面比較多,我這里就摘錄比較重要的代碼。首先是網頁的預覽圖

  1. 首頁


    主要代碼:
    <li data-options="state:'opened'"> <span><a href="frame/ArcQuery.jsp " target= "myiframe">文書檔案類</a></span>
                <ul>
                  <li> <span><a href="queryByclassId?acv.classid=10" target= "myiframe">綜合類(A)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=20" target= "myiframe">計划財務類(B)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=30" target= "myiframe">地籍管理類(C)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=40" target= "myiframe">國土資源利用規划類(D)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=50" target= "myiframe">建設用地類(E)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=60" target= "myiframe">國土資源監察類(F)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=70" target= "myiframe">國土資源宣教、科技、信息類(G)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=80" target= "myiframe">電子、聲像材料類(H)</a></span> </li>
                  <li> <span><a href="queryByclassId?acv.classid=90" target= "myiframe">地質、礦產管理類(I)</a></span> </li>
                  <li> <span><a href="frame/ArcAddData.jsp" target= "myiframe">添加數據</a></span> </li>
                </ul>
              </li>
    <form id="ff" method="post" action="query">
        <table cellpadding="6">
            <tr>
                <td>題名:</td>
                <td><input class="easyui-textbox" type="text" name="acv.title"
                    data-options="required:false" style="width:605px;"> </input></td>
            </tr>
            <tr>
                <td>年度:</td>
                <td><select class="easyui-combobox" name="acv.year"
                    style="width:100px">
                        <option value="" selected="selected">不限年份</option>
                        <option value="2011">2011</option>
                        <option value="2012">2012</option>
                        <option value="2013">2013</option>
                        <option value="2014">2014</option>
                </select></td>
                <td>所在地:</td>
                <td><select class="easyui-combobox" name="acv.location"
                    style="width:100px">
                        <option value="" selected="selected">不限地區</option>
                        <option value="浙江省">浙江省</option>
                        <option value="上海市">上海市</option>
                        <option value="海南省">海南省</option>
                        <option value="北京市">北京市</option>
                </select></td>
            </tr>
            <tr>
                <td>文號:</td>
                <td><input class="easyui-textbox" type="text"
                    name="acv.dcNumber" style="width:270px;"> </input></td>
                <td>密級:</td>
                <td><input class="easyui-textbox" type="text" name="acv.level"
                    style="width:270px;"> </input></td>
            </tr>
            <tr>
                <td>分類號:</td>
                <td><select class="easyui-combobox" name="acv.classid"
                    style="width:230px">
                        <option value="0" selected="selected">不限分類</option>
                        <option value="10">綜合類(A)</option>
                        <option value="20">計划財務類(B)</option>
                        <option value="30">地籍管理類(C)</option>
                        <option value="40">國土資源利用規划類(D)</option>
                        <option value="50">建設用地類(E)</option>
                        <option value="60">國土資源監察類(F)</option>
                        <option value="70">國土資源宣教、科技、信息類(G)</option>
                        <option value="80">電子、聲像材料類(H)</option>
                        <option value="90">地質、礦產管理類(I) </option>
                </select></td>
                <td>保管期限:</td>
                <td><select class="easyui-combobox" name="acv.outDate"
                    style="width:100px">
                        <option value="" selected="selected">不限</option>
                        <option value="一星期">一星期</option>
                        <option value="一個月">一個月</option>
                        <option value="半年">半年</option>
                        <option value="一年">一年</option>
                </select></td>
            </tr>
            <tr>
                <td>案卷號:</td>
                <td><input class="easyui-textbox" type="text" name="acv.fileNum"
                    style="width:253px;"> </input></td>
                <td>件號:</td>
                <td><input class="easyui-textbox" type="text" name="acv.partNum"
                    style="width:270px;"> </input></td>
            </tr>
            <tr>
                <td>錄入日期:</td>
                <td><input class="easyui-textbox" type="text" name="acv.date1"
                    style="width:262px;"> </input></td>
                <td></td>
                <td><input class="easyui-textbox" type="text" name="acv.date2"
                    style="width:270px;"> </input></td>
            </tr>
        </table>
        <input class="easyui-linkbutton" type="submit" value="Submit" />
        <input class="easyui-linkbutton" type="button" value="Clear" onclick="clearForm()"/>
    </form>

  2. 列表頁面

    <table width="500px" class="easyui-datagrid"
        data-options="url:'datagrid_data1.json',method:'get',border:false,singleSelect:true,fit:true,fitColumns:true">
        <thead>
            <tr>
                <th data-options="field:'itemid'" width="70px">行號</th>
                <th data-options="field:'kkkid'" width="200px">題名(標題)</th>
                <th data-options="field:'productid'" width="120px">所在地</th>
                <th data-options="field:'listprice'" width="70px">文號</th>
                <th data-options="field:'unitcost'" width="70px">年度</th>
                <th data-options="field:'attr1'" width="70px">件號</th>
                <th data-options="field:'status',align:'center'" width="70px">期限</th>
                <th data-options="field:'control',align:'center'" width="150px">操作</th>
            </tr>
            <tbody>
                <c:forEach var="acv" items="${Archives}" varStatus="status">
                    <tr>
                        <td>${acv.aid}</td>
                        <td>${acv.title}</td>
                        <td>${acv.location}</td>
                        <td>${acv.dcNumber}</td>
                        <td>${acv.year }</td>
                        <td>${acv.partNum }</td>
                        <td>${acv.outDate}</td>
                        <td><div style="text-align:center;padding:1px;">
                                <a href="tag?acv.aid=${acv.aid}" class="easyui-linkbutton"
                                    style="height:20px;"
                                    >Update</a> <a
                                    href="delete?acv.aid=${acv.aid}" class="easyui-linkbutton"
                                    style="height:20px;">Delete</a>
                            </div></td>
                    </tr>
                </c:forEach>
            </tbody>
        </thead>
    
    </table>

     

  3. 其他的包括有增刪改查的操作都在這幾個頁面實現,想看完整代碼的請下載源碼。

八、結束語
這可以算是SSH中最簡單的一個系統了,只是簡單的實現了數據的增刪改查的操作,沒有其他的功能了。

通過這一個系統的實踐,算是對SSH有一個初步的認識了,但還遠遠不夠,估計連入門都算不上,路漫漫啊~。

 

相關資料:源碼下載:https://github.com/cpacm/WebSystem

 

========================================

 

 

 

作者:cpacm
出處:(http://www.cnblogs.com/cpacm/p/4004504.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM