SSH框架网上商城项目第10战之搭建商品类基本模块

前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分。
1. 数据库建表并映射Model
首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下:

/*=============================*/
/* Table: 商品表结构   */
/*=============================*/
create table product
(
 /* 商品编号,自动增长 */
 id     int primary key not null auto_increment,
 /* 商品名称 */
 name    varchar(20),
 /* 商品价格 */
 price    decimal(8,2),
 /* 商品图片 */
 pic     varchar(200),
 /* 商品简单介绍 */
 remark    longtext,
 /* 商品详细介绍 */
 xremark    longtext,
 /* 商品生产日期 */
 date    timestamp default CURRENT_TIMESTAMP,
 /* 是否为推荐商品,推荐商品才有可能显示在商城首页 */
 commend    bool,
 /* 是否为有效商品,有效商品才有可能显示在商城首页 */
 open    bool,
 /* 商品所在的类别编号*/
 cid     int,
 constraint cid_FK foreign key(cid) references category(id)
);

使用逆向工程映射为Model类就不赘述了,前面有提到如何使用逆向工程生成Model。

2. 完成商品类的Service层和Action的架构
2.1 商品类的Service层架构
与前面category一样,product也得有个service来操作与商品相关的业务逻辑,所以我们得写一个ProductService和ProductServiceImpl的架构出来,具体如下:

//ProductService接口继承BaseService<Product>
public interface ProductService extends BaseService<Product> { 

} 

//ProductServiceImpl实现类继承BaseServiceImpl<Product>,并实现上面的ProductService接口
@Service("productService")
public class ProductServiceImpl extends BaseServiceImpl<Product> implements ProductService { 

}

2.2 商品类的Action架构
 首先得完善一下BaseAction中关于Service层的注解

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

 @Resource
 protected ProductService productService; 

  //其他代码省略,还是原来的代码……
} 

然后我们写一个ProductAction继承该方法:

public class ProductAction extends BaseAction<Product> { 

} 

至此,关于商品的后台架构就基本搭建好了,接下来就是完善里面的具体功能和业务逻辑了。

3. 完成前台的基本结构
 前台的基本结构和商品类的一样,我们看一下已经完成的商品类的前台都有哪些文件:

我们先根据其商品类的前台文件,拷贝一份到product文件夹中,然后我们再做相应的修改。先来分析一下流程:首先index.jsp到aindex.jsp显示左侧菜单栏,当点击类别管理时,进入category/query.jsp页面右侧显示所有商品类别信息,搜索和删除功能均在此页面,不需要弹出新的窗口,添加弹出save.jsp窗口,更新弹出update.jsp窗口。当点击商品管理的时候,进入product/query.jsp页面右侧显示所有商品信息,搜索和删除功能均在此页面完成,添加和更新分别弹出save.jsp和update.jsp。接下来我们把各个页面的框架搭建好,然后往相应的部分填东西即可。

首先在aindex.jsp中添加如下代码:

接下来,我们完成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地址改为请求productAction中的queryJoinCategory方法
    url:'product_queryJoinCategory.action',
    loadMsg:'Loading......',
    queryParams:{name:''},//这里参数改成name,参数值为空,表示我们要显示所有商品,后台是根据商品name属性查询的
    //width:300,
    fitColumns:true,
    striped:true,
    nowrap:true,
    singleSelect:false,
    pagination:true,
    pageSize:5,
    pageList:[5,10,15,20],
    idField:'id',//指定id为标识字段,在删除,更新的时候有用,如果配置此字段,在翻页时,换页不会影响选中的项 

    //toolbar定义添加、删除、更新按钮以及搜索框
    toolbar: [{
     iconCls: 'icon-add',
     text:'添加商品',
     handler: function(){
      //添加触发代码
     }
     },'-',{
     iconCls: 'icon-edit',
     text:'更新商品',
     handler: function(){
           //添加触发代码
     }
     },'-',{
     iconCls: 'icon-remove',
      text:'删除商品',
     handler: function(){
      //添加触发代码
     }
    },'-',{ //查询按钮不是LinkButton,它有语法,但是也支持解析HTML标签
     text:"<input id='ss' name='serach' />"
    }],
    rowStyler: function(index,row){
     console.info("index" + index + "," + row)
     if(index % 2 == 0) {
      return 'background-color:#fff;';
     } else {
      return 'background-color:#c4e1e1;';
     } 

     },
    frozenColumns:[[
      {field:'checkbox',checkbox:true},
     {field:'id',title:'商品编号',width:100}
     ]],
    columns:[[
     {field:'name',title:'商品名称',width:100},
     {field:'price',title:'商品价格',width:100},
     {field:'remark',title:'简单描述',width:100},
     {field:'xremark',title:'详细描述',width:100},
     {field:'date',title:'上架时间',width:100},
     {field:'commend',title:'推荐商品',width:100,
      formatter: function(value,row,index){
       if(value) {
        return "<input type='checkbox' checked='checked' disabled='true'";
       } else {
        return "<input type='checkbox' disabled='true'";
       }
       }
     },
     {field:'open',title:'有效商品',width:100,
      formatter: function(value,row,index){
       if(value) {
        return "<input type='checkbox' checked='checked' disabled='true'";
       } else {
        return "<input type='checkbox' disabled='true'";
       }
      }
      },
     {field:'category.type',title:'所属商品类别',width:200, //category.type是商品类别
      formatter: function(value,row,index){
       if(row.category != null && row.category.type != null) {
        return row.category.type; //如果商品类别不为空,返回商品类别
       } else {
        return "此商品暂时未分类";
       }
       }
     }
    ]]
   });
   //把普通的文本框转化为查询搜索文本框
   $('#ss').searchbox({
    //触发查询事件
     searcher:function(value,name){ //value表示输入的值
     //添加触发代码
    },
    prompt:'请输入搜索关键字'
   });
  });
 </script>
 </head> 

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

 </body>
</html>

接下来我们完成productAction中的queryJoinCategory方法,在这之前,先要完成service部分,我们都是先从底层慢慢往上开发的:

//ProductService接口
public interface ProductService extends BaseService<Product> { 

 //查询商品信息,级联类别
 public List<Product> queryJoinCategory(String type, int page, int size); //使用商品的名称查询
 //根据关键字查询总记录数
 public Long getCount(String type);
} 

@SuppressWarnings("unchecked")
@Service("productService")
public class ProductServiceImpl extends BaseServiceImpl<Product> implements ProductService { 

 @Override
 public List<Product> queryJoinCategory(String name, int page, int size) {
  String hql = "from Product p left join fetch p.category where p.name like :name";
  return getSession().createQuery(hql)
    .setString("name", "%" + name + "%")
    .setFirstResult((page-1) * size) //从第几个开始显示
    .setMaxResults(size) //显示几个
    .list();
 } 

 @Override
 public Long getCount(String name) {
  String hql = "select count(p) from Product p where p.name like :name";
  return (Long) getSession().createQuery(hql)
   .setString("name", "%" + name + "%")
   .uniqueResult(); //返回一条记录:总记录数
 } 

}

下面可以完成productAction中的queryJoinCategory方法了:

@Controller("productAction")
@Scope("prototype")
public class ProductAction extends BaseAction<Product> { 

 public String queryJoinCategory() {
  System.out.println("name:" + model.getName());
  System.out.println("page:" + page);
  System.out.println("rows:" + rows); 

  //用来存储分页的数据
  pageMap = new HashMap<String, Object>(); 

  //根据关键字和分页的参数查询相应的数据
  List<Product> productList = productService.queryJoinCategory(model.getName(), page, rows);
  pageMap.put("rows", productList); //存储为JSON格式
  //根据关键字查询总记录数
  Long total = productService.getCount(model.getName());
//  System.out.println(total);
  pageMap.put("total", total); //存储为JSON格式
  return "jsonMap";
 } 

}

接下来在struts.xml中进行配置,跟之前的商品类一样的流程,到这里可以看出,开发好了一个,下面一个就快了:

<action name="product_*" class="productAction" method="{1}">
 <result name="jsonMap" type="json">
  <param name="root">pageMap</param>
  <param name="excludeProperties">
   <!-- rows[0].category.account -->
   <!-- 把所有account过滤掉,否则会出现懒加载问题,该部分下面截图 -->
  </param>
 </result>
</action>

这样后台程序写好了,然后开启tomcat,测试一下,当我们点击左侧菜单栏的商品管理时,会弹出右边如下窗口:

这样我们就完成了商品管理窗口的框架了。

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

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

(0)

相关推荐

  • Java的web开发中SSH框架的协作处理应用笔记

    相信SSH没人不知道了吧,struts2+spring+hibernate,企业开发的"基础"架构,为什么基础标上引号,因为这个基础只是很多人自以为的而已,最基础的是servlet,很多培训机构很多基础都不教,直接上来就三大框架了,SSH不然就SSI,搞得很多人以为JAVAWEB开发就一定要框架,没框架就跟没了手一个样.三大框架没有什么坏处,实用,很多公司都在用,直接上手开发.但毕业以为真的好久没用三大框架了,spring倒是有用,特别是springMVC,感觉用起来比struts2爽

  • SSH框架网上商城项目第3战之使用EasyUI搭建后台页面框架

    前面两篇,我们整合了SSH并且抽取了service和action部分的接口,可以说基本开发环境已经搭建好了,这一节我们搭建一下后台的页面.我们讨论一下两种搭建方式:基于frameset和基于easyUI.最后我们会使用easyUI来开发. 1. 抽取公共JSP页面 我们先来看一下当前的jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

  • 搭建SSH时的思考和遇到的几个问题的解决方法

    SSH流行很久了,一直看到官方文档和网上都在讲如何整合SSH,讨论各种整合的优缺点.今天我比较闲,也用我的一些想法来试着整合这三个最流行的框架. 本次所用版本为:Struts 1.3.9   Spring 2.5   Hiberante 3.2 开发工具和环境为:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat 用SSH时,我们的架构自然就会分成三层,即表现层,逻辑层和持久层,按照Martin Flower的指导思想,耦合越少越好,下层为上层提供服务,这也是R

  • Java实现SSH模式加密

    Java实现SSH模式加密的实现原理思路分享给大家. 一.SSH加密原理 SSH是先通过非对称加密告诉服务端一个对称加密口令,然后进行验证用户名和密码的时候,使用双方已经知道的加密口令进行加密和解密,见下图: 解释:SSH中为什么要使用非对称加密,又使用对称加密,到底有什么用处?到底安全不安全?既然后来又使用了对称加密,开始的时候为什么还要用非对称加密?反过来,既然用非对称加密,为什么又要使用对称加密呢? 非对称加密,是为了将客户端产生的256位随机的口令传递到服务端,那么在传递的过程中,使用公

  • ssh项目环境搭建步骤(web项目)

    一.创建Web项目 二.加入Struts2支持(Struts-2.3.1.2版本)1.   拷贝相关jar包到lib目录下(1)      struts2-core-2.3.1.2.jar(2)      xwork-core-2.3.1.2.jar(3)      ognl-3.0.4.jar(4)      freemarker-2.3.18.jar(5)      commons-logging-1.1.1.jar(6)      commons-io-2.0.1.jar(7)     

  • MyEclipse整合ssh三大框架环境搭载用户注册源码下载

    前言 SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层(实体层). Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持.Spring一方面作为一个轻量级的IoC容器,负责查找.定位.创建和管理对象及

  • Java框架SSH结合Easyui控件实现省市县三级联动示例解析

    Easyui调用数据库实现省市县区三级联动的效果如果下 1.首先要设计数据库,如图所示.一个有4个字段code,note,pycode.code:行政区划代码,note:中文注释,pycode:拼音缩写. 其中code是由6个字段组成.如果是省级最后4位是0000,如果是地级市最后2位是00,其他是县区. 我已经把相关数据库代码上传到我的csdn资源中,需要的同学自行下载. 2.我用的是java.SSH框架结合Easyui控件 3.html代码如下 <tr> <td class=&quo

  • SSH框架网上商城项目第25战之使用java email给用户发送邮件

    当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息,邮箱地址是从用户的基本信息中获取,好了,首先我们来看一下java中发送邮件的方法. 1. java中发送email的方法 在完善这个项目之前,先来回顾一下java中是如何发送邮件的,首先肯定需要发送邮件的jar包:mail.jar,导入到lib目录下,好了,下面我们先写一个普通的java程序来回顾一下java email的知识点: public class SendEmailDemo { public static vo

  • java-SSH2实现数据库和界面的分页

    分页应该是在我们开发web应用时经常要做的工作,能够比较简洁的实现数据库和视图层的分页十分重要. 在数据库层利用hibernate进行数据库的分页,将从数据库中查询出的数据封装为javabean:在视图层就可以方便的实现分页. 创建PageBean package com.fishing.common.bean; import java.util.List; @SuppressWarnings("unchecked") public class PageBean { private L

  • SSH框架网上商城项目第10战之搭建商品类基本模块

    前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分. 1. 数据库建表并映射Model 首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下: /*=============================*/ /* Table: 商品表结构 */ /*=============================*/ create table product ( /* 商品编号,自动增长 */ id int primary key not null aut

  • 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

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

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

  • SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示

    网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样.那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响.那么使用Hibernate的二级缓存就可以解决这个问题. 有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中

  • SSH框架网上商城项目第27战之申请域名空间和项目部署及发布

    前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响项目的部署和发布,我们可以先来玩一把,这一节主要介绍下域名空间的申请以及项目的部署和发布流程. 1. 域名空间的申请 作为一个伟大的屌丝,肯定没钱买域名空间,很自然的想到去申请个免费的,现在免费的域名空间也很多,我在福佳jsp技术网上申请了一个试用期是15天的,大家也可以去申请个玩玩,反正作为学习,这已经足够了,当然,如果要长期的肯定要付费的.注册过程我截几个图,如下: 然后下一步,最后开通如下: 建议把上面这些信息

  • SSH框架网上商城项目第21战之详解易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的API.那么问题来了,使用第三方支付平台最主要的一件事就是获取该平台的API,我们首先得获取他们的API以及开发文档,然后才可以做进一步的开发. 1. 获取易宝的API 获取API的第一步,要在易宝上注册一个账号,这个账号是商家的账号,后面买家付款后,会将钱款存入该账号中,然后商家自己提取到银行卡,易宝

  • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    本文开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总结一下如何整合Struts2.Hibernate4.3和Spring4.2. 整合三大框架得先从搭建各部分环境开始,也就是说首先得把Spring,Hibernate和Struts2的环境搭建好,确保它们没有问题了,再做整合.这篇博文遵从的顺序是:先搭建Spring环境-->然后搭建Hibernate环境--> 整合Spring和Hibernate --> 搭建Struts2环境 --> 整合Spri

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

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

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

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

随机推荐