后台商品管理功能实现

课前知识回顾

1.1 监听器的方式

1.1.1 配置文件

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="jt-manage" version="2.5">
    <display-name>jt-manage</display-name>
    
    <!--配置监听器启动spring容器  --> 
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/spring/applicationContext*.xml</param-value>
    </context-param>
    <!—及时配置了springMVC容器的配置文件.程序也能照常执行-->
      
    <!--1.配置前端控制器  -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置加载SpringMVC.xml  -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/spring/springmvc.xml</param-value>
        </init-param>
    </servlet>
    <!--
        / 规定
        1.表示拦截 全部的请求  
        2.拦截所有静态资源js/css/image 后期配置放行
        3.放行.jsp资源
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <!--配置全站乱码解决 POST乱码  -->
    <filter>
        <filter-name>characterEncoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!--定义默认字符集utf-8  -->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>characterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

1.1.2 图例

 

说明:如果通过监听器的方式,即使加载了springMVC的配置文件.SpringMVC的容器是不认的,只有通过前端控制器调用时,才会加载启动springMVC容器。这时会创建另外一个controller将原有的Controller覆盖。达到使用的目的。

1.1.3 框架调用逻辑图

 

EasyUI 

2.3 EasyUI入门案例

2.3.1 静态资源放行

说明:在配置文件中添加标签.放行静态资源文件

 

2.3.2 引入js工具

<!--引入jquery的js,EasyUI的执行需要依赖于jQuery  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<!--easyUI的js主文件  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<!--国际化的js文件  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<!--引入easyUI的样式  -->
<link rel="stylesheet" type="text/css"
    href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css"
    href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />

2.3.3 文件的拖动

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EasyUI-拖动</title>
<!--引入jquery的js,EasyUI的执行需要依赖于jQuery  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<!--easyUI的js主文件  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<!--国际化的js文件  -->
<script type="text/javascript"
    src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<!--引入easyUI的样式  -->
<link rel="stylesheet" type="text/css"
    href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css"
    href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />


<style type="text/css">
div {
    height: 200px;
    width: 200px;
    background: green;
    border: 10px solid #abcdef;
}
</style>
</head>
    <body>
        <div class="easyui-draggable">拖动DIV</div>
        <div>测试div</div>
    </body>
</html>

2.3.4 进度条

<script type="text/javascript">
    $(function(){
        
        $("#b").click(function(){
            onload();    
        })
        
        /*采用递归的方法实现进度条刷新  */
        var i = 0;
        function onload(){
            $('#p').progressbar({ value:i++});
            if(i<=100){
                /*多久执行一次方法  */
                setTimeout(function(){
                    onload();
                },2)
            }
        }
    })
    
</script>
</head>
    <body>
        <div id="p" class="easyui-progressbar" style="400px;"></div>
        <input id="b" type="button" value="加载"/> 
    </body>
    
    
</html>

2.3.5 页面布局

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css" href="/css/jt.css" />
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
</head>

<body class="easyui-layout">

   <div id="cc" class="easyui-layout" style="600px;height:400px;">   
    <div data-options="region:'north',title:'North Title',split:true" style="height:100px;"></div>   
    <div data-options="region:'south',title:'South Title',split:true" style="height:100px;"></div>   
    <div data-options="region:'east',iconCls:'icon-reload',title:'East',split:true" style="100px;"></div>   
    <div data-options="region:'west',title:'West',split:true" style="100px;"></div>   
    <div data-options="region:'center',title:'center title'" style="padding:5px;background:#eee;"></div>   
</div>  
</body>

说明:将页面分为为5个部分.///

2.3.6 选项卡技术

<body class="easyui-layout">

  <div data-options="region:'west',title:'菜单',split:true" style="10%;">
           <!--一级菜单  -->
           <ul class="easyui-tree">
               <li>
               <span>商品管理</span>
                   <!--二级菜单  -->
                   <ul>
                       <li><a onclick="addTab('商品新增BBBB','/item-add')">商品新增AAAAA</a></li>
                       <li><a onclick="addTab('商品查询','/item-list')">商品查询</a></li>
                       <li><a onclick="addTab('商品更新','/item-update')">商品更新</a></li>
                   </ul>
            </li>
            
            <li>
               <span>网站内容管理</span>
               <ul>
               <li>内容新增</li>
               <li>内容修改</li>
               </ul>
            </li>
           
           </ul>
   </div>
   <div id="tt" class="easyui-tabs" data-options="region:'center',title:'首页'"></div>


</body>
<script type="text/javascript">
function addTab(title, url){  
    if ($('#tt').tabs('exists', title)){  
        $('#tt').tabs('select', title);  
    } else {  
        var content = '<iframe scrolling="auto" frameborder="0"  src="'+url+'" style="100%;height:100%;"></iframe>';  
        $('#tt').tabs('add',{  
            title:title,  
            content:content,  
            closable:true  
        });  
    }  
} 

</script>

页面效果:

后台商品查询

3.1 页面通用跳转

3.1.1 RestFul结构实现页面跳转

//跳转到商品的新增页面  /page/item-add
    /**
     * 问题:如果index页面中需要跳转多个页面,
     * 则需要编辑多个Controller方法用来.处理请求.
     * 要求:采用一个方法.实现页面的通用跳转
     * 办法:采用restFul结构实现页面通用跳转
     * 
     * 回顾:
     *     get方法: localhost:8091/addUser?id=1&name=tom....
     *  restFel: localhost:8091/addUser/1/tom
     *  
     *  解决办法:
     *  localhost:8091/page/item-add
     *  @PathVariable 的作用:可以将{module}的数据,传值交给参数列表
     *  中的module.要求名称必须一致.
     *  
     *  总结:
     *       1.restFul结构参数用{}包裹
     *      2.参数与参数之间用"/"分割
     *      3.接收参数和变量应该一致
     *      4.使用@PathVariable 实现数据传参
     * @return
     */
    @RequestMapping("/page/{module}")
    public String toItemAdd(@PathVariable String module){
        
        return module;
    }

3.2 安装PD软件

3.2.1 安装pd文件

说明:选择地址hongkong,之后一路下一步安装

 

3.2.2 破解并且汉化

说明:将可课前资料中的破解文件,复制,替换PD的根目录的内容.全部覆盖后重启PD.图示表示汉化成功!

 

3.2.3 PD的介绍

 

说明:

1.PD是现在主流的数据库建模工具,Pd可以通过图形化的界面展现建模.

2.可以自动的生成数据库语句.

3.能够根据不同的数据库实现数据建模

3.2.4 PD数据库选择

 

3.2.5 创建表

说明:创建表时需要添加备注信息的选项.所以开启备注信息

 

 

定义数据库字段

3.2.6 主键自增设定

说明:Mysql数据模型中,提供了数据自增的设置.勾选Identity即可

 

3.2.7 根据PD模型创建表

 

说明将PD中的sql语句复制后在SqlYog中执行

 

效果:

在控制台中出现已经创建的表即可

3.2.8 关联关系

说明:通过tb_user查询用户时,也可以通过user_id查询当前用户的外挂信息.

解决办法:tb_wg表中添加一个外键.这个外键是tb_user的主键.

自关联画法:

 

定义关联关系:

 

3.3 商品信息查询

3.3.1 创建pojo对象

 

3.3.2 创建Mybatis

  1. 新建接口文件

 

  1. 编辑映射文件
<mapper namespace="com.jt.manage.mapper.ItemMapper">
    
    <!--说明:所有的sql语句必须小写.否则Linux操作时,不能识别表  -->
    <select id="findItemAll" resultType="Item">
        select * from tb_item order by updated desc
    </select>
    
</mapper>

3.3.3 编辑Service

说明:根据接口文件实现商品查询,注意对象的依赖注入

 

3.3.4 编辑Controller

说明:定义查询全部数据的方法.实现数据查询

 

结果:

 

3.4 商品展现的页面分析

3.4.1 Item-list分析

 

3.4.2 编辑ItemController

说明:编辑ItemControll接收用户请求

 

3.4.3 编辑Service

/**
     * page:当前查询的页数
     * rows:每页展现的行数
     * 要求:
     *     查询第1页数据,每页20条
     *     sql:SELECT * FROM tb_item LIMIT 0,20
     *     
     *  查询第2页
     *     sql:SELECT * FROM tb_item LIMIT 20,20
     *     
     *     查询第3页
     *     sql:SELECT * FROM tb_item LIMIT 40,20
     *     
     *  查询第n页
     *  sql:SELECT * FROM tb_item LIMIT (n-1)*rows,rows
     */
    @Override
    public EasyUIResult findItemByPage(Integer page, Integer rows) {
        //获取记录总数
        int total  = itemMapper.findItemCount();
        
        //计算分页的起始位置
        int begin = (page-1) * rows;
        
        List<Item> itemList = itemMapper.findItemByPage(begin,rows);
        
        return new EasyUIResult(total, itemList);
    }

3.4.4 定义Mybatis

 编辑映射文件

<!--查询记录总数  -->
    <select id="findItemCount" resultType="int">
        select count(*) from tb_item
    </select>
    
    <!--实现分页的查询  -->
    <select id="findItemByPage" resultType="Item">
        select * from tb_item order by updated desc limit #{begin},#{rows}
    </select>

3.4.5 商品价格的处理

 

 

3.5 格式化分类名称

3.5.1 编辑格式化方法

说明:通过js定义格式化方法

 

3.5.2 编辑js方法

 

3.5.3 编辑Controller

 

方法一:传统Ajax方法
/**
     * 1.采用传统的Ajax实现数据的回显
     * url:/item/cat/queryItemCatName
     */
    @RequestMapping("/cat/queryItemCatName")
    public void findItemCatNameById(Long itemCatId,HttpServletResponse response){
        
        String name = itemService.findItemCatName(itemCatId);
        
        //设定字符集编码
        response.setContentType("text/html;charset=utf-8");
        try {
            response.getWriter().write(name);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

方法二:采用注解形式
/**
     * @ResponseBody的注意事项
     * 1.如果使用该注解 返回的是String字符串则必须处理乱码问题.
     * 原因:springMVC源码中有如下的下发
     * 1.如果返回值是对象,解析的编码格式utf-8
     * 2.如果返回值是String类型,则采用ISO-8859-1的编码格式
     * 
     * 解决方法:
     *     1.将返回值封装为对象
     *  2.执行字符集
     * 
     * 总结:以后的返回值尽量使用对象封装
     * @param itemCatId
     * @return
     */
    @RequestMapping(value="/cat/queryItemCatName",produces="text/html;charset=utf-8")
    @ResponseBody   name 
    public String findItemCatNameById(Long itemCatId){
        
        return itemService.findItemCatName(itemCatId);
        
    }

 

 

 

3.5.4 编辑Service

 

3.5.5 编辑Mybatis

说明:根据接口文件,实现分类查询

原文地址:https://www.cnblogs.com/xiangyuqi/p/8570937.html