JAVA—咖啡馆

——欢迎访问rogerfan的博客,常来《JAVA——咖啡馆》坐坐,喝杯浓香的咖啡,彼此探讨一下JAVA技术,交流工作经验,分享JAVA带来的快乐!本网站部分转载文章,如果有版权问题请与我联系。

BlogJava 首页 新随笔 联系 聚合 管理
  447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

18.9  物资管理模块

18.9.1  物资管理模块总体架构

1.模块功能介绍

物资管理模块主要包括以下功能。

  ●   查看物资列表:用于分类显示未删除的和已删除的物资信息;

  ●   添加物资信息:用于添加物资信息;

  ●   修改物资信息:用于修改物资信息;

  ●   删除/恢复物资信息:用于删除或恢复物资信息。

2.文件架构

物资管理模块文件架构如图18.14所示。

图18.14  物资管理模块文件架构

18.9.2  创建物资管理模块的持久化类及映射文件

1.创建持久化类

物资管理模块只涉及到物资信息表tb_goods,因此只需要创建一个对应的持久化类,将其命名为GoodsForm。由于持久化类的创建方法大致相同,都是包含一些属性,以及与之对应的getXXX()和setXXX()方法,这里就不详细介绍了,具体实现方法请参见18.8.2节。

2.创建映射文件

创建一个名为GoodsForm.hbm.xml的文件,用于把GoodsForm类映射到tb_goods表,这个文件应该与UserForm.class文件存放在同一个目录下,关键代码如下。

例程18-41:光盘\mr\18\MaterialManage\src\com\actionForm\GoodsForm.hbm.xml

<class name="com.actionForm.GoodsForm" table="tb_goods">

   <id name="id" column="id" type="int">

   <generator class="increment"/>

   </id>

   <property name="name" column="name" type="string" not-null="true"/>

   <property name="spec"  column="spec"  type="string" not-null="true"/>

   <property name="unit"  column="unit"  type="string" not-null="true"/>

   <property name="price"  column="price"  type="float" not-null="true"/>

   <property name="producer"  column="producer"  type="string"/>

   <property name="ifdel"  column="ifdel"  type="byte"/>

   </class>

3.修改Hibernate配置文件

在创建持久化类和映射文件后,还需要在Hibernate配置文件hibernate.cfg.xml中指定持久化类映射文件,关键代码如下:

<mapping resource="com/actionForm/GoodsForm.hbm.xml"/>

18.9.3  创建物资管理的Action实现类

物资管理模块的Action实现类继承了Action类,在该类中首先需要在构造方法中实例化物资管理模块的GoodsDAO类(该类用于实现业务逻辑操作),然后通过Action实现类的主要方法execute()执行相应的业务逻辑操作。Action实现类的execute()方法会被自动执行,这个方法本身没有具体的事务,它是根据HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。

物资管理模块的Action实现类的关键代码如下。

例程18-42:光盘\mr\18\MaterialManage\src\com\action\Goods.java

public class Goods extends Action {

    private GoodsDAO goodsDAO=null;

    public Goods(){

        goodsDAO=new GoodsDAO();

    }

    public ActionForward execute(ActionMapping mapping, ActionForm form,

                                 HttpServletRequest request,

                                 HttpServletResponse response) {

        String action=request.getParameter("action"); //获取action参数值

        if(action.equals("") || action==null){

            request.setAttribute("error","您的操作有误!");

            return mapping.findForward("error");

        }else if(action.equals("goodsRequest")){     //查询物资信息

            return goodsQuery(mapping,form,request,response);

        }else if(action.equals("goodsadd")){     //添加物资信息

            return goodsAdd(mapping,form,request,response);

        }else if(action.equals("goodsMquery")){     //查询单条物资信息

            return goodsModiQuery(mapping,form,request,response);

        }else if(action.equals("goodsmodify")){     //修改物资信息

            return goodsModify(mapping,form,request,response);

        }else if(action.equals("goodsdel")){     //删除物资信息

            return goodsdel(mapping,form,request,response);

        }

        request.setAttribute("error","您的操作有误!");

        return mapping.findForward("error");

    }

    ……  //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出

}

18.9.4  查看物资列表设计

用户登录后,选择“基础信息”→“物资管理”命令,进入到查看物资列表页面,在该页面中将列出系统中的除超级用户mr之外的用户及其权限信息,同时提供添加物资信息、修改物资和删除物资信息的超级链接。查看物资列表页面的运行结果如图18.15所示。

图18.15  查看物资列表页面运行结果

在实现系统导航菜单时,引用了JavaScript文件menu.JS,该文件实现了半透明背景菜单的全部JavaScript代码。打开该JS文件,可以找到如下所示的“物资管理”菜单项的超级链接代码:

<a href=goods.do?action=goodsRequest>物资管理</a>

从上面的URL地址中可以知道查看物资列表模块涉及到的action的参数值为“goodsRequest”,当action=goodsRequest时,会调用查看物资列表的方法goodsQuery(),具体代码如下。

例程18-43:光盘\mr\18\MaterialManage\src\com\action\Goods.java

if(action.equals("goodsRequest")){

    return goodsQuery(mapping,form,request,response);

}

在查看物资列表的方法goodsQuery()中,首先调用GoodsDAO类中的query()方法查询出未删除的和已删除的物资信息,再将返回的查询结果分别保存到HttpServltRequest的对象goodslist0和goodslist1中,查看物资列表的方法goodsQuery()的具体代码如下。

例程18-44:光盘\mr\18\MaterialManage\src\com\action\Goods.java

    public ActionForward goodsQuery(ActionMapping mapping,ActionForm form,

                                HttpServletRequest request,HttpServletResponse response){

        String str=null;

        int ifdel=0;     //获取未被删除的物资信息

        request.setAttribute("goodslist0",goodsDAO.query(str,ifdel));

        ifdel=1;     //获取已被删除的物资信息

        request.setAttribute("goodslist1",goodsDAO.query(str,ifdel));

        return mapping.findForward("goodsQuery");

    }

从上面的代码中可以知道查看物资列表使用的GoodsDAO类的方法是query(),该方法包括两个参数,一个是String型参数strif(用于指定查询条件字符串),另一个是int型参数del(用于标记是查询未删除的还是查询已删除的物资信息,0表示未删除的,1表示已删除的)。在query()方法中首先判断参数strif的值是否为空并且是否为“all”,当strif不为空并且不为“all”时,将通过Hibernate的HQL根据指定的条件查询物资信息,否则将通过Hibernate的HQL查询未删除或已删除的物资信息。然后将查询结果保存到List集合中并返回该List,query()方法的具体代码如下。

例程18-45:光盘\mr\18\MaterialManage\src\com\dao\GoodsDAO.java

    public List query(String strif, int del) {

        session = MySession.openSession(); //打开Session

        String hql = "";

        if (strif != "all" && strif != null && strif != "") { //条件查询

            hql = "FROM GoodsForm goods WHERE " + strif + "";

        } else {     //查询未删除或已删除的物资信息

            hql = "FROM GoodsForm goods WHERE ifdel=" + del + " ORDER BY ifdel";

        }

        List list=null;

        try {

            Query query = session.createQuery(hql);

            list = query.list();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            MySession.closeSession(session); //关闭Session

        }

        return list;

    }

在struts-config.xml文件中配置查看物资列表所涉及的<forward>元素,代码如下:

<forward name="goodsQuery" path="/goodsList.jsp" />

接下来的工作是将Action实现类中goodsQuery()方法返回的查询结果显示在查看物资列表页goodsList.jsp中。在goodsList.jsp中首先通过request.getAttribute()方法获取查询结果并将其保存在List集合中,再通过循环将物资信息以列表形式显示在页面中,由于该页面涉及到两个结果集,所以需要分别获取并显示。

说明:由于该页面与18.8.5节中的显示用户信息列表页类似,所以此处将不再赘述。

18.9.5  添加物资信息设计

用户登录后,选择“基础信息”→“物资管理”命令,进入到查看物资列表页面,在该页面中单击“添加物资信息”超级链接即可进入添加物资信息页面。添加物资信息页面的运行结果如图18.16所示。

图18.16  添加物资信息页面的运行结果

1.设计添加物资信息页面

添加物资信息页面主要用于收集输入的物资信息及通过自定义的JavaScript函数验证输入信息是否合法,该页面中所涉及到的重要表单元素如表18.15所示。

表18.15                                   添加物资信息页面所涉及的重要表单元素

名    称

元 素 类 型

重 要 属 性

含    义

form1

form

method="post"action="goods.do?action=goodsadd" onSubmit="return mycheck(form1)"

表单

name

text

物资名称

ifdel

hidden

value="0"

是否删除

Submit

submit

value="保存"

【保存】按钮

Submit3

button

value="返回"

onClick="window.location.href='goods.do?action=goodsRequest'"

【返回】按钮

2.修改物资管理的Action实现类

在添加物资信息页面中输入合法的物资信息后,单击“保存”按钮,网页会访问一个URL,这个URL是“goods.do?action=goodsadd”。从该URL地址中可以知道添加用户模块涉及到的action的参数值为“goodsadd”,也就是当action=goodsadd时,会调用添加用户的方法goodsAdd(),具体代码如下。

例程18-46:光盘\mr\18\MaterialManage\src\com\action\Goods.java

if(action.equals("goodsadd")){

     return goodsAdd(mapping,form,request,response);

}

在添加物资信息的方法goodsAdd()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用GoodsDAO类中的insert()方法将添加的用户信息保存到数据表中,并将返回值保存到变量rtn中,如果返回值为1,表示信息添加成功,将页面重定向到添加信息成功页面。如果返回值为2,表示该物资信息已经添加,将错误提示信息“该物资信息已经存在!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面;否则将错误提示信息“添加物资信息失败!”保存到HttpServletRequest的对象error中,并将页面重定向到错误提示页,添加物资信息的方法goodsAdd()的关键代码如下。

例程18-47:光盘\mr\18\MaterialManage\src\com\action\Goods.java

public ActionForward goodsAdd(ActionMapping mapping,ActionForm form,

                            HttpServletRequest request,HttpServletResponse response){

    GoodsForm goodsForm = (GoodsForm) form;

    int rtn=goodsDAO.insert(goodsForm);

    ……    //此处省略了根据返回值重定向页面的代码

}

3.编写添加物资的GoodsDAO类的方法

从上面的代码中可以知道添加用户使用的GoodsDAO类的方法是insert()。在insert()方法中首先调用GoodsDAO的query()方法从数据表tb_goods中查询输入的物资信息是否存在,如果存在,将标志变量设置为2,否则将输入的信息保存到物资信息表中,如果插入时抛出异常,将回滚事务并将标志变量设置0,否则将标志变量设置为1,最后返回标志变量,insert()方法的具体代码如下。

例程18-48:光盘\mr\18\MaterialManage\src\com\dao\GoodsDAO.java

public int insert(GoodsForm goodsForm) {

    int ret = 0;

    Transaction tx = null;

    String str = "name='" + goodsForm.getName() + "' AND spec='" + goodsForm.getSpec() + "'";

    List list = query(str, 0);

    if (list.size() > 0) {      //存在该信息

        ret = 2;

    } else {

        session = MySession.openSession();    //打开Session

        try {

            tx = session.beginTransaction();

            session.save(goodsForm);

            tx.commit();

            ret = 1;

        } catch (Exception e) {

            if (tx != null) {

                tx.rollback();

            }

            return ret = 0;

        } finally {

            MySession.closeSession(session); //关闭Session

        }

    }

    return ret;

}

4.struts-config.xml文件配置

在struts-config.xml文件中配置添加用户所涉及的<forward>元素,代码如下:

<forward name="goodsaddok" path="/goods_ok.jsp?para=1" />

18.9.6  修改物资设计

用户登录后,选择“基础信息”→“物资管理”命令,进入到查看物资列表页面,在该页面中单击想要修改的物资信息后面的“修改”超级链接即可进入到“修改物资信息”页面对物资信息进行修改。修改物资信息页面的运行结果如图18.17所示。

图18.17  修改物资信息页面的运行结果

1.设计修改物资信息页面

在“查看物资列表”页面中可以找到打开“修改物资信息”页面的超级链接代码,如下所示。

例程18-49:光盘\mr\18\MaterialManage\defaultroot\goodsList.jsp

<a href="goods.do?action=goodsMquery&id=<%=id%>">修改</a>

从上面的URL地址中可以知道修改物资信息页面所涉及到的action的参数值为“goodsMquery”,当action=goodsMquery时,会调用查询指定物资信息的方法goodsModiQuery(),具体代码如下。

例程18-50:光盘\mr\18\MaterialManage\src\com\action\Goods.java

if(action.equals("goodsMquery")){

    return goodsModiQuery(mapping,form,request,response);

}

在查询指定物资信息的方法goodsModiQuery()中,首先需要获取从页面中传递的参数id的值并赋值给int型变量id,然后调用GoodsDAO类中的query()方法,并将变量id作为该方法的参数,查询出指定物资信息,再将返回的查询结果保存到HttpServletRequest的对象goodsForm中,查询指定物资信息的方法goodsModiQuery()的具体代码如下。

例程18-51:光盘\mr\18\MaterialManage\src\com\action\Goods.java

public ActionForward goodsModiQuery(ActionMapping mapping,ActionForm form,

                           HttpServletRequest request,HttpServletResponse response){

    int id=Integer.parseInt(request.getParameter("id"));

    request.setAttribute("goodsForm",goodsDAO.query(id));

    return mapping.findForward("goodsModiQuery");

}

从上面的代码中可以知道查询指定物资信息使用的GoodsDAO类的方法是query(),该方法只有一个int型参数id(用于指定用户id)。在query()方法中将利用Session的get()方法查询出指定用户,然后将查询结果保存到GoodsForm中,并返回GoodsForm,query()方法的具体代码如下。

例程18-52:光盘\mr\18\MaterialManage\src\com\dao\GoodsDAO.java

public GoodsForm query(int id) {

    session = MySession.openSession(); //打开Session

    GoodsForm goodsForm = null;

    try {

        goodsForm = (GoodsForm) session.get(GoodsForm.class, id);

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return goodsForm;

}

在struts-config.xml文件中配置查询指定物资信息所涉及的<forward>元素,代码如下。

<forward name="goodsModiQuery" path="/goodsModify.jsp" />

接下来的工作是将Action实现类中goodsModiQuery()方法返回的查询结果显示在修改物资信息页goodsModify.jsp中。在goodsModify.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的表单元素中。

2.修改物资管理的Action实现类

在修改物资信息页面中对物资信息进行修改后,单击“保存”按钮,网页会访问一个URL,这个URL是“goods.do?action=goodsmodify”。从该URL地址中可以知道保存修改物资信息涉及到的action的参数值为“goodsmodify”,也就是当action=goodsmodify时,会调用保存修改物资信息的方法goodsModify(),具体代码如下。

例程18-53:光盘\mr\18\MaterialManage\src\com\action\Goods.java

if(action.equals("goodsmodify")){

     return goodsModify(mapping,form,request,response);

}

在保存修改物资信息的方法goodsModify()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用GoodsDAO类中的update()方法将修改的物资信息保存到物资信息表tb_goods,并将返回值保存到变量rtn中,如果返回值为1,表示信息修改成功,将页面重定向到修改信息成功页面,否则将错误提示信息“物资信息修改失败!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面,保存修改物资信息的方法goodsModify()的关键代码如下。

例程18-54:光盘\mr\18\MaterialManage\src\com\action\Goods.java

    public ActionForward goodsModify(ActionMapping mapping,ActionForm form,HttpServletRequest
request,HttpServletResponse response){

        GoodsForm goodsForm = (GoodsForm) form;

        int rtn=goodsDAO.update(goodsForm);

        ……    //此处省略了根据返回值重定向页面的代码

    }

3.编写保存修改权限信息的GoodsDAO类的方法

从上面的代码中可以知道修改物资信息时使用的GoodsDAO类的方法是update()。在update()方法中将修改的物资信息保存到物资信息表tb_goods中,并将返回值赋给标志变量,最后返回该标志变量,update()方法的具体代码如下。

例程18-55:光盘\mr\18\MaterialManage\src\com\dao\GoodsDAO.java

public int update(GoodsForm goodsForm) {

    session = MySession.openSession(); //打开Session

    int ret = 0;

    Transaction tx = null;

    try {

        tx = session.beginTransaction();

        GoodsForm goodsF = (GoodsForm) session.get(GoodsForm.class,

                goodsForm.getId());

        goodsF.setSpec(goodsForm.getSpec());

        goodsF.setUnit(goodsForm.getUnit());

        goodsF.setPrice(goodsForm.getPrice());

        goodsF.setProducer(goodsForm.getProducer());

        session.update(goodsF);

        tx.commit();

        ret = 1;

    } catch (Exception e) {

        if (tx != null) {

            tx.rollback();

        }

        return ret = 0;

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return ret;

}

4.struts-config.xml文件配置

在struts-config.xml文件中配置修改物资信息所涉及的<forward>元素,代码如下:

<forward name="goodsmodifyok" path="/goods_ok.jsp?para=2" />

18.9.7  删除/恢复物资信息设计

用户登录后,选择“基础信息”→“物资管理”命令,进入到查看物资列表页面,该页面分为未删除物资信息列表和已删除物资信息列表,上面部分显示的是未删除的物资信息,下面部分显示的是已删除的物资信息。单击未删除物资信息后面的“删除”超级链接可以将该物资删除,此时该信息将显示在已删除物资信息列表中;单击已删除物资后面的“恢复”超级链接可以取消对该物资的删除,此时该信息将显示在未删除物资信息列表中。

在“查看物资列表”页面中可以找到删除和恢复物资信息的超级链接代码,如下所示。

例程18-56:光盘\mr\18\MaterialManage\defaultroot\goodsList.jsp

<a href="goods.do?action=goodsdel&id=<%=id%>&val=1">删除</a>

<a href="goods.do?action=goodsdel&id=<%=id%>&val=0">恢复</a>

从上面的URL地址中可以知道删除物资页所涉及到的action的参数值为“goodsdel”,当action= goodsdel时,会调用删除/恢复物资信息的方法goodsdel(),具体代码如下。

例程18-57:光盘\mr\18\MaterialManage\src\com\action\Goods.java

if(action.equals("goodsdel")){

     return goodsdel(mapping,form,request,response);

}

在删除/恢复物资信息的方法goodsdel()中,首先需要获取从页面中传递的参数id和val,并将id的值赋给int型变量id,val的值赋给byte型变量val,赋值后将这两个变量作为GoodsDAO类中del()方法的参数,然后调用该del()方法删除/恢复物资信息,并根据执行结果转到相应的页面,删除/恢复物资信息的方法goodsdel()的具体代码如下。

例程18-58:光盘\mr\18\MaterialManage\src\com\action\Goods.java

public ActionForward goodsdel(ActionMapping mapping,ActionForm form,

                            HttpServletRequest request,HttpServletResponse response){

int id=Integer.parseInt(request.getParameter("id"));

byte val=Byte.parseByte(request.getParameter("val"));

int rtn=goodsDAO.del(id,val);

if(rtn==1){

     return mapping.findForward("goodsdelok");

}else{

    request.setAttribute("error", "物资信息删除/恢复失败!");

    return mapping.findForward("error");

}

从上面代码中可以知道删除/恢复物资信息使用的GoodsDAO类的方法是del()。在del()方法中首先通过Session的get()方法查询到要删除/恢复的物资信息,并保存到GoodsForm中,然后再使用Session的update()方法删除/恢复物资信息,最后返回执行结果,del()方法的具体代码如下。

例程18-59:光盘\mr\18\MaterialManage\src\com\dao\GoodsDAO.java

public int del(int id, byte val) {

    session = MySession.openSession(); //打开Session

    int ret = 0;

    Transaction tx = null;

    try {

        tx = session.beginTransaction();

        GoodsForm goodsF = (GoodsForm) session.get(GoodsForm.class, id);

        goodsF.setIfdel(val); 

        session.update(goodsF);

        tx.commit();

        ret = 1;

    } catch (Exception e) {

        if (tx != null) {

            tx.rollback();

        }

        return ret = 0;

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return ret;

}

在struts-config.xml文件中配置删除物资信息所涉及的<forward>元素,代码如下:

<forward name="goodsdelok" path="/goods_ok.jsp?para=3" />

posted on 2009-01-07 10:40 rogerfan 阅读(275) 评论(0)  编辑  收藏 所属分类: 【开源技术】

只有注册用户登录后才能发表评论。


网站导航: