SSH框架网上商城项目第8战之查询和删除商品类别功能实现

上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加、更新、删除和查询。首先我们实现下前台的显示,然后再做后台获取数据。
1. 添加、更新、删除和查询功能的前台实现
DataGrid控件里有个toolbar属性,是添加工具栏的,我们可以在toolbar属性中添加这些按钮来实现相应的功能。先看一下官方文档对toolbar的定义:

我们使用数组的方式定义工具栏,在query.jsp页面中新添加如下代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <%@ include file="/public/head.jspf" %>
  <style type="text/css">
    body {
      margin: 1px;
    }
        .searchbox {
            margin: -3;
        }
  </style>
  <script type="text/javascript">
    $(function(){
      $('#dg').datagrid({
        //url地址改为请求categoryAction
        url:'category_queryJoinAccount.action', 

        singleSelect:false, //如果为真,只允许单行显示,全选功能失效
        //设置分页
        pagination:true,
        //设置每页显示的记录数,默认是10个
        pageSize:5,
        //设置可选的每页记录数,供用户选择,默认是10,20,30,40...
        pageList:[5,10,15,20],
        idField:'id',//指定id为标识字段,在删除,更新的时候有用,如果配置此字段,在翻页时,换页不会影响选中的项 

           /*********************添加的代码***********************/
        toolbar: [{
          iconCls: 'icon-add',
          text:'添加类别',
          handler: function(){
            alert('--加添类别--');
          }
        },'-',{
          iconCls: 'icon-edit',
          text:'更新类别',
          handler: function(){
            alert('--更新类别--');
          }
        },'-',{
          iconCls: 'icon-remove',
          text:'删除类别',
          handler: function(){
            //判断是否有选中行记录,使用getSelections获取选中的所有行
            var rows = $("#dg").datagrid("getSelections");
            //返回被选中的行,如果没有任何行被选中,则返回空数组
            if(rows.length == 0) {
              //弹出提示信息
              $.messager.show({ //语法类似于java中的静态方法,直接对象调用
                title:'错误提示',
                msg:'至少要选择一条记录',
                timeout:2000,
                showType:'slide',
              });
            } else {
              //提示是否确认删除,如果确认则执行删除的逻辑
              $.messager.confirm('删除的确认对话框', '您确定要删除此项吗?', function(r){
                if (r){
                // 退出操作;
                  alert("--删除操作--")
                }
              });
            }
          }
         },'-',{ //查询按钮不是LinkButton,它有语法,但是也支持解析HTML标签
           text:"<input id='ss' name='serach' />"
         }], 

        //把普通的文本框转化为查询搜索文本框
        $('#ss').searchbox({
          //触发查询事件
          searcher:function(value,name){ //value表示输入的值
                      //查询操作
          },
          prompt:'请输入搜索关键字' //默认的显示
        });
        /*********************************************************************/ 

    });
  </script>
 </head> 

 <body>
  <table id="dg"></table>
 </body>
</html>

这样我们就搭好了添加、更新、删除和查询的前台框架了,现在可以在前台显示了,后台没有数据过来,只是弹出个提示框,不过显示功能已经完成,看一下效果:

接下来我们逐个来完成相应的功能。

2. DataGrid类别查询的实现
查询的实现是最简单的,在搜素框中输入关键字,然后将关键字作为参数传给action,然后Service从数据库中拿出数据,打包成json格式传到前台来显示即可,这个过程跟前面显示所有商品信息是一样的,我们只需要在上面jsp中添加搜索部分的代码即可,其他不用改变,添加的代码如下:

//把普通的文本框转化为查询搜索文本框
$('#ss').searchbox({
  //触发查询事件
  searcher:function(value,name){ //value表示输入的值
    //alert(value + "," + name)
    //获取当前查询的关键字,通过DataGrid加载相应的信息,使用load加载和显示第一页的所有行。
    //如果指定了参数,它将取代'queryParams'属性。通常可以通过传递一些参数执行一次查询,通过调用这个方法会向上面url指定的action去发送请求,从服务器加载新数据。
    $('#dg').datagrid('load',{
      type: value
    }); 

  },
  prompt:'请输入搜索关键字'
});

load方法可以加载显示第一页的所有行,它有个参数,如果指定了,就会去带上么的queryParams,否则默认传递上面的queryParams指定的参数,我们在这里将type设置成value的值,即用户输入的查询关键字,然后传到action,后台根据用户输入的value在数据库中查找,并返回给前台。执行结果如下:

这样我便完成了搜索的功能了,比较简单。

3. DataGrid类别删除的实现
现在我们来实现删除功能,从上面的jsp中可以看出,删除前判断用户有没有选中某条记录,如果没有则给用户一个提示,如果有选中,则弹出窗口让用户确认,如果为真,则执行删除功能。有个细节要注意下,如果想要一次性删除多条记录,那么上面的singleSelect属性要设置成false。
首先,我们把上面query.jsp中删除部分的代码补充完,见下面:

{
  iconCls: 'icon-remove',
  text:'删除类别',
  handler: function(){
    //判断是否有选中行记录,使用getSelections获取选中的所有行
    var rows = $("#dg").datagrid("getSelections");
    //返回被选中的行,如果没有任何行被选中,则返回空数组
    if(rows.length == 0) {
      //弹出提示信息
      $.messager.show({ //语法类似于java中的静态方法,直接对象调用
        title:'错误提示',
        msg:'至少要选择一条记录',
        timeout:2000,
        showType:'slide',
      });
    } else {
      //提示是否确认删除,如果确认则执行删除的逻辑
      $.messager.confirm('删除的确认对话框', '您确定要删除此项吗?', function(r){
        if (r){
          //1. 从获取的记录中获取相应的的id,拼接id的值,然后发送后台1,2,3,4
          var ids = "";
          for(var i = 0; i < rows.length; i ++) {
            ids += rows[i].id + ",";
          }
          ids = ids.substr(0, ids.lastIndexOf(","));
          //2. 发送ajax请求
          $.post("category_deleteByIds.action",{ids:ids},function(result){
            if(result == "true") {
                        //将刚刚选中的记录删除,要不然会影响后面更新的操作
                        $("#dg").datagrid("uncheckAll");
              //刷新当前页,查询的时候我们用的是load,刷新第一页,reload是刷新当前页
              $("#dg").datagrid("reload");//不带参数默认为上面的queryParams
            } else {
              $.messager.show({
                title:'删除异常',
                msg:'删除失败,请检查操作',
                timeout:2000,
                showType:'slide',
              });
            }
          },"text");
        }
      });
    }
  }
}

如果用户选择删除,首先会弹出一个对话框,当用户确定要删除后,我们首先要获取用户所勾选的商品的id,将这些id拼接成一个字符串,然后向后台发送ajax请求,$.post中的第一个参数是发送到那个action,第二个参数是发送的参数,第三个参数是回调函数,即删除成功后执行该函数里面的方法,该函数的参数result是从后台传过来的,第四个参数可有可无,是返回数据的类型。我们重点看看$.post中的内容,当后台返回一个"true"表示删除成功了,那么我们调用DataGrid里面的reload方法重新刷新页面,reload和前面查询时用的load是一样的,不同的地方在于reload刷新后停留在当前页面,而load则显示第一页。
好了,前台页面部分写好了,接下来完成后台的相应方法,首先在categoryService中添加deleteByIds方法,并在其实现类categoryServceImpl中实现该方法:

//categoryService接口
public interface CategoryService extends BaseService<Category> {
  //查询类别信息,级联管理员
  public List<Category> queryJoinAccount(String type, int page, int size); //使用类别的名称查询
  //根据关键字查询总记录数
  public Long getCount(String type);
  //根据ids删除多条记录
  public void deleteByIds(String ids);
} 

//categoryServiceImpl实现类
@SuppressWarnings("unchecked")
@Service("categoryService")
public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { 

  //其他方法省略不写了……可以参照前面的相应章节内容 

  @Override
  public void deleteByIds(String ids) {
    String hql = "delete from Category c where c.id in (" + ids + ")";
    getSession().createQuery(hql).executeUpdate();
  }
}

写好了Service部分,接下来开始写Action部分了。因为我们要获取前台传进来的ids数据,所以在action中得有一个实现了get和set方法的变量来接收这个数据,另外,我们要将结果传给前台,前面章节中我们做级联查询的时候,使用的方法是struts把查询的结果数据打包成json格式传给前台,所以需要一个Map,然后将通过配置文件中的配置,将Map转换成json格式。这里我们传到前台的数据比较简单,入股删除成功我们传一个"true"即可,所以不用打包成json格式,我们通过流的方法去传送,道理和前面的一样,首相我们得有一个流的对象去保存这个"true"的字节,然后通过配置,将这个对象通过流传到前台。这两个对象我们还是写在BaseAction中,如下:

@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> { 

  //获取要删除的ids,要有get和set方法
  //流是用来想前台返回数据的,这个数据是让struts获取的,然后通过流的形式传到前台,所以实现get方法即可
  protected String ids;
  protected InputStream inputStream; 

    //下面省略……
}

对应的CategoryAction中的方法如下:

@Controller("categoryAction")
@Scope("prototype")
public class CategoryAction extends BaseAction<Category> { 

  public String queryJoinAccount() {
        //略……
  } 

  public String deleteByIds() {
    System.out.println(ids);
    categoryService.deleteByIds(ids);
    //如果删除成功就会往下执行,我们将"true"以流的形式传给前台
    inputStream = new ByteArrayInputStream("true".getBytes()); //将"true"的字节存到流inputStream中
    return "stream";
  }
}

接下来看struts.xml中相应的配置:

<struts> 

  <constant name="struts.devMode" value="true" /> 

  <package name="shop" extends="json-default"><!-- jason-default继承了struts-default --> 

    <global-results>
      <result name="aindex">/WEB-INF/main/aindex.jsp</result>
    </global-results> 

    <!-- class对应的是Spring中配置该Action的id值,因为要交给Spring管理 -->
    <action name="category_*" class="categoryAction" method="{1}">
      <result name="jsonMap" type="json">
        <!-- 略 -->
      </result>
      <result name="stream" type="stream"> <!-- 以stream的形式,type为stream -->
        <param name="inputName">inputStream</param> <!-- imputStream中有要传的数据 -->
       </result>
    </action> 

    <action name="account_*" class="accountAction" method="{1}">
      <result name="index">/index.jsp</result>
    </action> 

    <!-- 用来完成系统 请求转发的action,所有的请求都交给execute-->
    <action name="send_*_*" class="sendAction">
      <result name="send">/WEB-INF/{1}/{2}.jsp</result>
    </action>
  </package> 

</struts>

这样我们就做好了删除的操作了,看一下效果:

测试成功,我们也可以一次性选择多项去删除,至此,删除功能做完了。

原文地址:http://blog.csdn.net/eson_15/article/details/51338991

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-05-28

SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取

上一节<SSH框架网上商城项目第1战之整合Struts2.Hibernate4.3和Spring4.2>我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功将它们整合在一起.这节主要完成一些基本的增删改查以及Service.Dao和Action的抽取. 1. Service层的抽取         上一节中,我们在service层简单写了save和update方法,这里我们开始完善该部分的代码,然后对service层的代码进行抽取. 1.1 完善CategorySer

java网上商城开发之邮件发送功能(全)

最近在学习网上商城时,接触到了一个邮件发送的功能.之前一直在使用邮箱进行发送邮件,但是其中的具体如何运转的却不知道是怎么回事.那么邮件发送究竟是怎么一回事呢? 邮件发送过程: 过程描述:首先是发送人将邮件通过客户端软件发送到特定的服务器上,然后通过电子邮件简单传输协议(SMTP)来进行传输,收件人通过POP3协议将邮件从服务器上接受回来.这样就实现了邮件之间的相互传送. 实现过程: 在有网络的情况下,我们可以直接使用搜狐.网易等邮箱进行发送.那么如何在没有网络的情况下,实现内部之间的发送呢? 首

php 网上商城促销设计实例代码

大体的思想,每一个促销要新建一个促销类,有专门的开关来控制是否生效. 用商品里面的促销识别码来判断具体调用哪一个促销实例. 首先,在添加商品的时候,分两步,第一步是添加状态,第二步是把购物车内的商品显示这个状态. 一,添加步骤几个重要的点: 1,添加商品之前,遍历所有的促销互斥条件. 例如,某一款商品不可以和另一个商品同时在一个购物车内:或者某个用户权限,不可以购买特定的一件商品等等. 2,添加商品之前,选择特定的促销实例,来进行添加之前的操作. 注:第二点与第一点的区别在于1是要遍历所有的促销

SSH框架网上商城项目第20战之在线支付平台

之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容,从下一节开始,我们真正开发在线支付模块. 1. 在线支付介绍 在线支付是指卖方与买方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务.它为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具.在线支付不仅帮助企业实现了销售款项的快速归集,缩短收款周期,

SSH框架网上商城项目第4战之EasyUI菜单的实现

上篇文章我们使用EasyUI搭建了后台页面的框架,点击这里查看,这一节我们主要使用EasyUI技术简单实现后台菜单,先将简单功能做出来,后期再继续丰富. 1. 实现左侧菜单 首先看一下效果图: 我们可以点击"基本操作"和"其他操作"来切换菜单选项,在具体的选项内,点击不同的连接,会在右侧显示出来.我们先把左边的菜单做出来. 左侧菜单内容主要有两个:"类别管理"和"商品管理".我们知道,上一节中,在aindex.jsp中应将后台

SSH框架网上商城项目第30战之项目总结(附源码下载地址)

0. 写在前面 友情提示:下载地址在下面哦. 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们要做的首先是定位这个异常,一般异常的后面都会跟一个或多个Caused by:xxx,这些都是引起异常的原因,一般我们找最下面的一个Caused by,那里往往才是问题的根源.如果自己解决不了,可以去谷歌.百度搜索(搜索的时候别一大堆异常往上一贴,注意搜关

java网上商城项目第1篇之用户注册模块

本文为大家讲解了商城项目用户注册模块,供大家参考,先看看效果图: 1.前台JS校验: 事件触发: onsubmit="checkForm()" 2.使用AJAX完成异步用户名是否存在校验 ①事件触发:onblur="checkUserName()" ②AJAX function checkUsername(){ var username = $("#username").val(); $("#span1").load(&quo

SSH框架网上商城项目第23战之在线支付功能实现

上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点击确认支付时,会跳到${shop}/pay_goBank.action的action,也就是说,提交后我们得在payAction中的goBank方法中处理一些逻辑(即21节demo中的那个流程图的逻辑),即获得明文,将明文加密成签名(密文)然后再去访问易宝服务器,易宝连接银行,完成支付. 但是考虑到MVC设计模式,我们会将上面这些业务逻辑放到Service层中处理,所以下面我们来实现21节中那个demo的支付逻辑

SSH框架网上商城项目第26战之订单支付后发送短信提醒

上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就是给买家发送短信,告诉他订单已经生成之类的.这一节主要介绍一下如何在用户支付完成后自动给用户发送短信. 1. 申请短信发送功能 很明显,我们自己不能发短信,也没有做短信的功能,所以我们需要去借助第三方的运营商.但是像中国移动,联通,电信这种不会直接给我们提供短信服务,而是先把短信服务提供给一些运营商,然后这些运营商再提供给我们. 有一个运营商叫"中国网建sms短信通"(官网地址).这个运营商可以给我们提供短

php网上商城购物车设计代码分享

首先,购物车的数据库设计: 1. id 2. goods_id 商品ID 3. session_id 购物车ID 4. goods_sn 商品编码 5. goods_name 商品名称 6. shop_price 商品商城售价 7. goods_price 商品真实售价(与shop_price的区别在于,当打折的时候,shop_price是打折之前商品的售价,而goods_price是打折之后的) 8. goods_number 数量 9. weight 商品重量 10. goods_attr

python简单商城购物车实例代码

本文为大家分享一个简单商城购物车的python代码,供大家参考,具体内容如下 要求: 1.写一段商城程购物车序的代码 2.用列表把商城的商品清单存储下来,存到列表 shopping_mail 3.购物车的列表为shopping_cart 4.用户首先输入工资金额,判断输入为数字 5.用户从商城购物清单中选择购买物品,每次购买成功就用工资减去物品单价 6.判断用户金额是否足够,不足够提示用户 7.如果用户不想再继续购物,则按Q键退出菜单 8.用户退出之后,将用户购买的清单打印出来. 9.尽量学习带

Android实现商城购物车功能的实例代码

最近公司项目做商城模块,需要实现购物车功能,主要实现了单选.全选,金额合计,商品删除,商品数量加减等功能,先看看效果图: 在这里插入图片描述 一.实现步骤: 0.添加依赖库 1.购物车主界面布局文件(activity_main.xml) 2.购物车实现逻辑主界面(MainActivity.class) 3.使用ExpandableListView,继承BaseExpandableListAdapter 4.购物车数据的bean类(ShoppingCarDataBean.class) 5.分店铺实

python 实现网上商城,转账,存取款等功能的信用卡系统

一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单独处理金钱,也不单独记录流水账,每种交易类型调用处理金钱的函数(传入交易类型,交易金额) 2.处理金钱的函数,调用配置文件中关于每种交易类型的加减钱和利率 返回本次操作后信用卡可用余额,总欠款,剩余欠款,存款 3.客户端 银行管理员注册登陆 普通用户注册登陆 发送需求:注册.登陆.交易类型.交易金额

Winform窗体圆角设计代码

网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下 private void BeautiLoginForm_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void Type(Control sender, int p_1, double p_2) { GraphicsPath

vue实现商城购物车功能

本文实例为大家分享了vue实现商城购物车功能的具体代码,供大家参考,具体内容如下 首先,先上最终的效果图 效果并不是很好看,但是这不是重点. 首先,我们先看下布局: <template> <div class="shopcar" id="demo04"> <div class="header-title"> <h3>购物车</h3> </div> <div class=

SSH网上商城之使用ajax完成用户名是否存在异步校验

小伙伴在上网的时候,需要下载或者观看某些视频资料,更或者是在逛淘宝的时候,我们都需要注册一个用户,当我们填写好各种信息,点击确定的时候,提示用户名已经存在,小编就想,为什么当我们填写完用户名的时候,她就自动提示用户名已经存在,我们也不需要浪费那么多感情,直到填写完那么多的信息之后在提示,在小编最近的项目中,就碰到这个问题,我们可以使用ajax完成用户名是否存在,今天这篇博客,小编就简单的总结一下,如何使用ajax来完成校验,还请小伙伴多多指教哦`(*∩_∩*)′! 首先ajax完成用户名是否存在

SSH框架网上商城项目第15战之线程、定时器同步首页数据

上一节我们做完了首页UI界面,但是有个问题:如果我在后台添加了一个商品,那么我必须重启一下服务器才能重新同步后台数据,然后刷新首页才能同步数据.这明显不是我们想要的效果,一般这种网上商城首页肯定不是人为手动同步数据的,那么如何解决呢?我们需要用到线程和定时器来定时自动同步首页数据. 1. Timer和TimerTask 我们需要用到Timer和TimerTask两个类.先来介绍下这两个类. Timer是一种工具类,在java.util包中,线程用其安排以后在后台线程中执行的任务.可安排任务执行一