WEBAPP开发教程newstyles项目实战(七)商品列表功能实现
凌雪 2018-11-08 来源 :网络 阅读 875 评论 0

摘要:本文将带你了解WEBAPP开发教程newstyles项目实战(七)商品列表功能实现,希望本文对大家学WEBAPP有所帮助。

本文将带你了解WEBAPP开发教程newstyles项目实战(七)商品列表功能实现,希望本文对大家学WEBAPP有所帮助。


        在测试完我们的框架之后,能够整体的通起来,我们实现一个简单的功能,结合我们之前写的jsp页面实现商品列表的查询:
    需求分析:
            首先实现打开后台管理工程的首页,真正访问的是webapp下面的WEB-INF里面的jsp中的页面,由于其在webapp目录里面,不能够直接的去访问,所以我们这时候需要写一个controller来展示首页,所以在newstyles-manger-web工程的com.newstyles.controller里面新建一个控制页面的Controller:
   
    /* * 页面跳转,打开首页 */@Controllerpublic class PageControlller {  /*  * 打开首页   */ @RequestMapping("/") public String showIndex(){ return   "index"; } /*  * 展示其它页面  */ @RequestMapping("/{page}") public   String showPage(@PathVariable String page){ return page; }}      为什么打开首页的控制器返回index字符串呢,这是因为我们在springmvc.xml文件中定义了一个视图解析器,@RequestMapping为请求映射的注解,试图解析器的配置如下:
   
   
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property   name="prefix" value="/WEB-INF/jsp/" /> <property   name="suffix" value=".jsp" /> </bean>
    可以看到,定义的前缀为/WEB-INF/下面的jsp文件夹,后缀名为.jsp的jsp文件。所以如果想打开首页(假如首页的名称为index.jsp),则返回index字符串经过解析就可以找到首页的jsp文件了。页面则是使用EasyUI开发的。那怎么打开其它的页面呢?首先分析一下index.jsp中是否有对不同页面的定义呢,    <ul id="menu"   style="margin-top: 10px;margin-left: 5px;">          <li>          <span>商品管理</span>          <ul>           <li data-options="attributes:{'url':'item-add'}">新增商品</li>           <li   data-options="attributes:{'url':'item-list'}">查询商品</li>           <li   data-options="attributes:{'url':'item-param-list'}">规格参数</li>           </ul>          </li>          <li>发现,商品管理下一层的无序列表中含有对新增商品,查询商品,规格参数等的url路径的定义,分别为item-add,item-list,item-param-list,所以我们可以简单的写一个controller,如上面的打开其他页面的controller所示。
   
            这次实现的功能为当我们打开商品列表这个界面时,商品应该都展示出来,也就是说,但我们一打开这个页面,相当于开始了一次请求,再进一步就是与数据库的一次查询操作,我们将查询到的数据通过EasyUI来进行展示,其特点是EasyUI不进行页面的刷新,其通过Ajax请求来实现数据的更新,下面是item-list.jsp中table元素的代码。
   
    <table id="itemList"   title="商品列表"          data-options="singleSelect:false,collapsible:true,pagination:true,url:'/item/list',method:'get',pageSize:30,toolbar:toolbar">    <thead>        <tr><!--         要与TbItem类里面的字段统一 -->         <th   data-options="field:'ck',checkbox:true"></th>         <th data-options="field:'id',width:60">商品ID</th>            <th   data-options="field:'title',width:200">商品标题</th>            <th data-options="field:'cid',width:100">叶子类目</th>            <th   data-options="field:'sellPoint',width:100">卖点</th>            <th   data-options="field:'price',width:70,align:'right',formatter:TAOTAO.formatPrice">价格</th>            <th   data-options="field:'num',width:70,align:'right'">库存数量</th>            <th   data-options="field:'barcode',width:100">条形码</th>            <th   data-options="field:'status',width:60,align:'center',formatter:TAOTAO.formatItemStatus">状态</th>            <th   data-options="field:'created',width:130,align:'center',formatter:TAOTAO.formatDateTime">创建日期</th>            <th data-options="field:'updated',width:130,align:'center',formatter:TAOTAO.formatDateTime">更新日期</th>        </tr>    </thead></table>     请求的url为/item/list,默认的EasyUI   datagrid是带有参数的(//localhost:8080/item/list?page=1&rows=30)。具体的详细的内容可以查看EasyUI的官方手册。返回值则为一个json数据,但是这个数据的格式是不同的,这个可以通过官方文档了解到,其格式如下:
   
   
    {total:”2”,rows:[{“id”:”1”,”name”,”张三”},{“id”:”2”,”name”,”李四”}]}
   
    逐步实现:
    初步的步骤为先写 Dao层,再写service,再写controller:
   
      首先,我们先分析Dao层:分析得到需要查询tb_item表格,所以,我们需要得到其对应表格的查询语句,实现数据库操作,而在sql语句中分页显示则表示为如下:
   
    select *from tb_item limit 0,30接下来需要使用分页插件
   
    涉及到mybatis中plugin标签的使用,而我们使用的分页插件为 PageHelper,是一种第三方的开源分页插件,其在github上,具体的可以参考此网址。
    实现原理分析:
   
          通过上图可以发现,我们可以通过利用mybatis的Interceptor接口,获取到要执行的sql语句,所以在这一步可以对sql语句进行处理,也就是在Executor对象和Mappedtatement对象之间,实现分页插件,添加对sql语句的处理。
    具体使用方法:
    1.添加相关的jar包和相关的依赖,因为我们是利用maven来进行项目的管理,我们在之前在newstyles-parent的pom聚合工程里面管理了相关的依赖关系。
    2.我们需要陪配置这个插件,所以我们应该在sqlMapperConfig.xml文件里面,因为其属于mybatis   的插件,所以,我们在原来的空的sqlMapperConfig.xml文件中配置分页插件PageHelper。在上述的文件中的configuration标签中间添加如下内容:
   
     <!-- 配置分页插件 --> <plugins> <plugin   interceptor="com.github.pagehelper.PageHelper">//注意拦截器的拦截类型需要权】全限定名 <!--   设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->                 <property name="dialect"   value="mysql"/> </plugin> </plugins>3.在执行的sql语句之前需要添加一句代码:
   
   
    PageHelper.startPage(1, 10);
    第一个参数是page,要显示第几页。
    第二个参数是rows,没页显示的记录数。
    4.取查询结果的总数量。
    创建一个PageInfo类的对象,从对象中取分页信息。分页测试:
      在newstyles-manager-web工程下面的test测试的文件中写一个TestPageHelper类,这里面使用了junit测试,还需要注意junit的相关引用是否导入:
   
    public class TestPageHelper { @Test public void   testPageHelper(){// 创建一个spring容器 ApplicationContext applicaitonContext =   new   ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml"); //从spring中获取mapper对象,此处的对象为代理对象(example) TbItemMapper   mapper =   applicaitonContext.getBean(TbItemMapper.class); //执行查询,并分页 TbItemExample   example = new TbItemExample();  //分页处理 PageHelper.startPage(1,   10); List<TbItem> list =    mapper.selectByExample(example);//开始查询 //枚举取得对应的记录 for(TbItem tbItem :   list){ System.out.println(tbItem.getTitle()); } //取得分页信息 PageInfo   <TbItem> pageInfo = new PageInfo(list); long total =   pageInfo.getTotal(); System.out.println("共有商品:" + total +   "件。");  } }run as junittest 测试一下:
   
   
      可以看到罗列出了第一页的10条信息,同时也获取了商品的总数,但是,注意:分页插件对逆向工程生成的代码支持不好,不能对有查询条件的查询分页。会抛异常。然而怎么实现前面所述的jsp页面中实现呢,那接下来应该操作Service层了。接收分页参数,一个是page一个是rows。调用dao查询商品列表。并分页。返回商品列表。
    返回一个EasyUIDateGrid支持的数据格式。需要创建一个Pojo。此pojo应该放到taotao-common工程中。
          解决方案是,可以构建一个pojo,里面包含rows和total,这个pojo需要建立在newstyles-common工程里面,因为这个类不仅仅是这一个业务需要,还可能有其它的地方需要,所以把他放到一个较为底层的位置比较好,方便使用。pojo类如下:
    public class EUDataGridResult {  private long total; private List<?>   rows; public long getTotal() { return total; } public void setTotal(long   total) { this.total = total; } public List<?> getRows() { return   rows; } public void setRows(List<?> rows) { this.rows = rows; }}     然后在之前建好的ItemService接口中,再次定义一个业务类型的接口,这个接口主要是查询,也就是本节的分页查询的功能,所以,同时建立起其实现方法:
     @Override public EUDataGridResult getItemList(int page, int rows) { //查询商品列表 TbItemExample   exmaple = new TbItemExample(); //分页处理 PageHelper.startPage(page,   rows);; List<TbItem> list = itemMapper.selectByExample(exmaple); //   TODO Auto-generated method stub //创建返回值对象 EUDataGridResult result = new   EUDataGridResult(); result.setRows(list); //获取记录的总数 PageInfo<TbItem>   pageInfo = new   PageInfo<>(list); result.setTotal(pageInfo.getTotal()); return   result; }
    接下来需要再web工程中开始写对应的controller控制:
    Controller主要接收页面传递过来的参数,pages和rows,同时,需要返回一个json格式的数据,EUDataGridResult需要使用到@ResponseBody注解。这样我们在之前写的Service的controller里面再次写一个controller,关于这个分页的一个controller。
     @RequestMapping("/item/list") @ResponseBody public   EUDataGridResult getItemList(Integer page,Integer rows){ EUDataGridResult   result = itemService.getItemList(page, rows); return result; }     一定要注意@RequestMapping的映射关系,不要出现错误。此时若直接启动则会出现错误,这是因为我们刚才新添加的内容没有更改到本地仓库,所以,我们可以重新再次安装一下,更新过后就可以执行了。
    执行结果如下:    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之WebApp频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程