文件一键上传,javaee物流项目

JAVAEE——BOS物流项目05:OCUpload、POI、pinyin4J、重构分页代码、分区增多、combobox,javaeeocupload

JAVAEE——BOS物流项目06:分页查询、分区导出Excel文件、定区增进、分页难点总括,javaee物流项目

1 区域数据批量导入成效


读书陈设

1、完毕区域导入效率

n OCUpload一键上传插件使用

n 将文件上传到Action

n POI简介

n 使用POI解析Excel文件

n 达成数据库操作

n 使用pinyin4J生成简码和都市编码

2、区域分页查询

n 页面调度

n 服务端完毕

3、重构分页代码

n BaseAction

n 子类Action

4、分区增添效果

n 什么是分区

n 页面调治(combobox使用)

n 服务端完结

 

 

学学安插

1、分区组合条件分页查询

n 分区分页查询(没有过滤条件)

n 分区分页查询(带有过滤条件)

2、分区导出

n 页面调度

n 使用POI将数据写到Excel文件

n 通过输出流进行文件下载

3、定区增进

n 定区概念

n 定区增添页面调解

n 服务端达成

4、定区分页查询

n 页面调度

n 服务端完结

n 分页难点总括

 

1.1 页面中引进插件并钦赐用作导入效能的开关实行开端化

美高梅开户网址 1

引入插件

美高梅开户网址 2

开首化钦赐导入功用的开关

[版权表达:本文系小编原创,转发请注脚出处] 
文章出处:
作者:朱培      ID:sdksdk0     

贯彻区域导入作用

分区组合条件分页查询

1.2 在RegionAction中提供myFile参数接收页面传入的xls文件并提供importXls方法剖判页面传入的xls文件;

美高梅开户网址 3

美高梅开户网址 4


2.1 jquery OCUpload一键上传插件使用

OCUpload(One Click Upload)

率先步:将js文件引入页面

<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.ocupload-1.1.2.js"></script>

第二步:在页面中提供放肆一个成分

 美高梅开户网址 5

其三步:调用插件提供的upload方法,动态修改HTML页面成分

<script type="text/javascript">
    $(function(){
        //页面加载完成后,调用插件的upload方法,动态修改了HTML页面元素
        $("#myButton").upload({
            action:'xxx.action',
            name:'myFile'
        });
    });
</script>

美高梅开户网址 6

 

 

2.1 分区分页查询(未有过滤条件)

页面:WEB-INF/pages/base/subarea.jsp

第一步:修改jsp页面中datagrid的URL地址

 美高梅开户网址 7

 

其次步:在SuareaAction中提供分页查询艺术pageQuery

 美高梅开户网址 8

 

第三步:修改subarea.hbm.xml

 美高梅开户网址 9

 

1.3 在RegionServiceImpl中提供saveBatch方法批量保存xls数据到数据库中

美高梅开户网址 10

前几天要分享的职能是一键上传excel文件,然后突显在页面中,以及将网页上的数额已excel文件的花样下载下来。使用的是Apache的POI,本文分享的实例是SSH框架完毕的三个档案的次序中的三个功用模块之一,使用了Maven,所以相关的jar包都贴出了maven的相干jar坐标。因为那几个种类规划了好多ssh的布局,这里本文就不在一一列出,只写了重在的代码,文末提供源码下载,希望得以扶助到有亟待的开荒者。

2.2 在服务端接收上传的文本

在Action中提供贰个File类型的属性,名称和上传的文书输入框名称一致regionFile

@Controller
@Scope("prototype")
public class RegionAction extends BaseAction<Region>{
    //属性驱动,接收上传的文件
    private File regionFile;

    public void setRegionFile(File regionFile) {
        this.regionFile = regionFile;
    }

    /**
     * 区域导入
     */
    public String importXls(){
        System.out.println(regionFile);
        return NONE;
    }
}

 

2.2 分区分页查询(带有过滤条件)

文件一键上传,javaee物流项目。1.4 在BaseDaoImpl中开展通用saveOrUpdate方法

美高梅开户网址 11

一、POI简介

Apache POI 是用Java编写的无需付费开源的跨平台的 Java API,Apache
POI提供API给Java程式对Microsoft Office格式档案读和写的作用。POI为“Poor
Obfuscation Implementation”的首字母缩写,意为“可怜的混淆达成”。
Apache POI 是开创和维护操作各类切合Office Open
XML(OOXML)规范和微软的OLE 2复合文书档案格式(OLE2)的Java
API。用它能够利用Java读取和创办,修改MS
Excel文件.何况,还足以选取Java读取和创建MS Word和MSPowerPoint文件。Apache
POI 提供Java操作Excel实施方案(适用于Excel97-二〇〇八)。

网址是

       <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

2.3 apache POI技术

Apache
POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft
Office格式档案读和写的效率。

 

下载开荒包:

 美高梅开户网址 12美高梅开户网址 13

 

解压上边的zip文件:

 美高梅开户网址 14

 

 

在类型中引进POI的注重性:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.11</version>
        </dependency>

 

POI使用:

@Test
    public void test1() throws FileNotFoundException, IOException{
        String filePath = "C:\\Users\\zhaoqx\\Desktop\\BOS项目(黑马32期)\\BOS-day05\\资料\\区域导入测试数据.xls";
        //包装一个Excel文件对象
        HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(filePath)));
        //读取文件中第一个Sheet标签页
        HSSFSheet hssfSheet = workbook.getSheetAt(0);
        //遍历标签页中所有的行
        for (Row row : hssfSheet) {
            System.out.println();
            for (Cell cell : row) {
                String value = cell.getStringCellValue();
                System.out.print(value + " ");
            }
        }
    }

 

2.2.1 页面调节

 美高梅开户网址 15

 

datagrid提供的议程:用于重新发送ajax供给,而且能够付出参数

 美高梅开户网址 16

 

 

率先步:提供贰个工具方法,能够将点名的form表单中有所的输入项转为json数据,用于参数提交

        //定义一个工具方法,用于将指定的form表单中所有的输入项转为json数据{key:value,key:value}
        $.fn.serializeJson=function(){  
            var serializeObj={};  
            var array=this.serializeArray();
            $(array).each(function(){  
                if(serializeObj[this.name]){  
                    if($.isArray(serializeObj[this.name])){  
                        serializeObj[this.name].push(this.value);  
                    }else{  
                        serializeObj[this.name]=[serializeObj[this.name],this.value];  
                    }  
                }else{  
                    serializeObj[this.name]=this.value;   
                }  
            });  
            return serializeObj;  
        };

 

其次步:为查询窗口中查询按键绑定事件

 

$("#btn").click(function(){
            //将指定的form表单中所有的输入项转为json数据{key:value,key:value}
            var p = $("#searchForm").serializeJson();
            console.info(p);
            //调用数据表格的load方法,重新发送一次ajax请求,并且提交参数
            $("#grid").datagrid("load",p);
            //关闭查询窗口
            $("#searchWindow").window("close");
        });

美高梅开户网址 17

 

末尾测量检验成功将数据导入数据库截图

美高梅开户网址 18

美高梅开户网址 19

二、实例图谋

页面效果如下:

(这里的数量本人是不管写的,仅作为参照数据,不是实在数据)

美高梅开户网址 20

经过点击页面上的批量导入开关,能够完结分界面无刷新叁回性导入写好的数目。大家先excel中打算好数据:注意的是在excel中的数字都要改为文本格式的,不可能是“常规”,不然导入会失利的。

美高梅开户网址 21

2.4 pinyin4J

 美高梅开户网址 22

        <!-- 引入pinyin4J的依赖 -->
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>

 

@Test
    public void test1(){
        //河北省    石家庄市    桥西区
        String province = "河北省";
        String city = "石家庄市";
        String district = "桥西区";
        //简码---->>HBSJZQX

        province = province.substring(0, province.length() - 1);
        city = city.substring(0, city.length() - 1);
        district = district.substring(0, district.length() - 1);

        String info = province + city + district;

        String[] headByString = PinYin4jUtils.getHeadByString(info);
        String shortcode = StringUtils.join(headByString);
        System.out.println(shortcode);

        //城市编码---->>shijiazhuang
        String citycode = PinYin4jUtils.hanziToPinyin(city, "");
        System.out.println(citycode);
    }

 

 

2.2.2 修改Action中分页查询格局

 

    /**
     * 分页查询
     */
    public String pageQuery(){
        DetachedCriteria dc = pageBean.getDetachedCriteria();
        //动态添加过滤条件
        String addresskey = model.getAddresskey();
        if(StringUtils.isNotBlank(addresskey)){
            //添加过滤条件,根据地址关键字模糊查询
            dc.add(Restrictions.like("addresskey", "%"+addresskey+"%"));
        }

        Region region = model.getRegion();
        if(region != null){
            String province = region.getProvince();
            String city = region.getCity();
            String district = region.getDistrict();
            dc.createAlias("region", "r");
            if(StringUtils.isNotBlank(province)){
                //添加过滤条件,根据省份模糊查询-----多表关联查询,使用别名方式实现
                //参数一:分区对象中关联的区域对象属性名称
                //参数二:别名,可以任意
                dc.add(Restrictions.like("r.province", "%"+province+"%"));
            }
            if(StringUtils.isNotBlank(city)){
                //添加过滤条件,根据市模糊查询-----多表关联查询,使用别名方式实现
                //参数一:分区对象中关联的区域对象属性名称
                //参数二:别名,可以任意
                dc.add(Restrictions.like("r.city", "%"+city+"%"));
            }
            if(StringUtils.isNotBlank(district)){
                //添加过滤条件,根据区模糊查询-----多表关联查询,使用别名方式实现
                //参数一:分区对象中关联的区域对象属性名称
                //参数二:别名,可以任意
                dc.add(Restrictions.like("r.district", "%"+district+"%"));
            }
        }
        subareaService.pageQuery(pageBean);
        this.java2Json(pageBean, new String[]{"currentPage","detachedCriteria","pageSize",
                        "decidedzone","subareas"});
        return NONE;
    }

 

修改BaseDao中的分页查询艺术

 美高梅开户网址 23

 

 

2 使用pinying4J生成简码和城市编码

三、一键上传

jsp页面代码:

必要起初入:jquery.ocupload-1.1.2.js

下一场再页面中给你的按键的id加多upload的不二等秘书诀。
 (以下一些在文末项目中的地方是:/BOS/src/main/webapp/WEB-INF/pages/base/region.jsp)

        // 对批量导入添加一键上传效果 
        $('#button-import').upload({
            name : 'upload', 
            action : '${pageContext.request.contextPath}/region_OCimport', // 表单提交路径
            onComplete : function(response){
                var data = eval("("+response+")");
                $.messager.alert('信息',data.msg,'info');
                $('#grid').datagrid('reload');
            }
        });

以此小编转到的是Action中:

那边的话小编正是加了pinyin4j来将汉字转为拼音,那样的话做的正是简码了;

在pom.xml中加多maven依赖:(以下一些在文末项目中的地方是:/BOS/pom.xml)

        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>

在Action中拍卖:(以下一些在文末项目中的地点是:/BOS/src/main/java/cn/tf/bos/web/action/bc/RegionAction.java)

//接收上传的数据
    public String OCimport() throws IOException{

        // 1、 工作薄对象
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(upload));
        // 解析工作薄
        hssfWorkbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK); // 避免空指针异常

        // 2、 获得Sheet
        HSSFSheet sheet = hssfWorkbook.getSheetAt(0); // 获得第一个sheet


        // 3、遍历每一行
        for (Row row : sheet) {

            if (row.getRowNum() == 0) {
                continue;
            }
            // 从第二行 开始解析
            Region region = new Region();
            String id = row.getCell(0).getStringCellValue(); // 获得第一个单元格信息
            if (id.trim().equals("")) {
                // id 无值,跳过
                continue;
            }
            region.setId(id);
            region.setProvince(row.getCell(1).getStringCellValue());
            region.setCity(row.getCell(2).getStringCellValue());
            region.setDistrict(row.getCell(3).getStringCellValue());
            region.setPostcode(row.getCell(4).getStringCellValue());

            //使用pinyin4j生成编码和简码
            String str=region.getProvince()+region.getCity()+region.getDistrict();
            str=str.replaceAll("省", "").replaceAll("市", "").replaceAll("区", "").replaceAll("县", "");
            String[]  arr=PinYin4jUtils.getHeadByString(str);
            StringBuffer sb = new StringBuffer();
            for (String headChar : arr) {
                sb.append(headChar);
            }
            region.setShortcode(sb.toString()); // 简码

            // 生成城市编码
            region.setCitycode(PinYin4jUtils.hanziToPinyin(region.getCity(), ""));

            //保存数据时出错
            try {
                regionService.saveRegion(region);
            } catch (Exception e) {
                // 导入region失败,记录日志
                LOG.error("区域导入失败,编号:" + region.getId(), e);
            }

        }

        //返回json
        Map<String,Object>  map=new HashMap<String,Object>();
        map.put("result", "success");
        map.put("msg", "区域导入完成");
        ActionContext.getContext().put("map", map);

        return "OCimport";
    }


    private File upload;
    public void setUpload(File upload) {
        this.upload = upload;
    }

汉字转变为拼音的工具类为:(以下一些在文末项目中的地点是:/BOS/src/main/java/cn/tf/bos/utils/PinYin4jUtils.java)

public class PinYin4jUtils {
    /**
     * 将字符串转换成拼音数组
     * 
     * @param src
     * @return
     */
    public static String[] stringToPinyin(String src) {
        return stringToPinyin(src, false, null);
    }

    /**
     * 将字符串转换成拼音数组
     * 
     * @param src
     * @return
     */
    public static String[] stringToPinyin(String src, String separator) {

        return stringToPinyin(src, true, separator);
    }

    /**
     * 将字符串转换成拼音数组
     * 
     * @param src
     * @param isPolyphone
     *            是否查出多音字的所有拼音
     * @param separator
     *            多音字拼音之间的分隔符
     * @return
     */
    public static String[] stringToPinyin(String src, boolean isPolyphone,
            String separator) {
        // 判断字符串是否为空
        if ("".equals(src) || null == src) {
            return null;
        }
        char[] srcChar = src.toCharArray();
        int srcCount = srcChar.length;
        String[] srcStr = new String[srcCount];

        for (int i = 0; i < srcCount; i++) {
            srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);
        }
        return srcStr;
    }

    /**
     * 将单个字符转换成拼音
     * 
     * @param src
     * @return
     */
    public static String charToPinyin(char src, boolean isPolyphone,
            String separator) {
        // 创建汉语拼音处理类
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        // 输出设置,大小写,音标方式
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        StringBuffer tempPinying = new StringBuffer();

        // 如果是中文
        if (src > 128) {
            try {
                // 转换得出结果
                String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,
                        defaultFormat);

                // 是否查出多音字,默认是查出多音字的第一个字符
                if (isPolyphone && null != separator) {
                    for (int i = 0; i < strs.length; i++) {
                        tempPinying.append(strs[i]);
                        if (strs.length != (i + 1)) {
                            // 多音字之间用特殊符号间隔起来
                            tempPinying.append(separator);
                        }
                    }
                } else {
                    tempPinying.append(strs[0]);
                }

            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }
        } else {
            tempPinying.append(src);
        }

        return tempPinying.toString();

    }

    public static String hanziToPinyin(String hanzi) {
        return hanziToPinyin(hanzi, " ");
    }

    /**
     * 将汉字转换成拼音
     * 
     * @param hanzi
     * @param separator
     * @return
     */
    public static String hanziToPinyin(String hanzi, String separator) {

        // 创建汉语拼音处理类
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        // 输出设置,大小写,音标方式
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        String pinyingStr = "";
        try {
            pinyingStr = PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat,
                    separator);
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pinyingStr;
    }

    /**
     * 将字符串数组转换成字符串
     * 
     * @param str
     * @param separator
     *            各个字符串之间的分隔符
     * @return
     */
    public static String stringArrayToString(String[] str, String separator) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length; i++) {
            sb.append(str[i]);
            if (str.length != (i + 1)) {
                sb.append(separator);
            }
        }
        return sb.toString();
    }

    /**
     * 简单的将各个字符数组之间连接起来
     * 
     * @param str
     * @return
     */
    public static String stringArrayToString(String[] str) {
        return stringArrayToString(str, "");
    }

    /**
     * 将字符数组转换成字符串
     * 
     * @param str
     * @param separator
     *            各个字符串之间的分隔符
     * @return
     */
    public static String charArrayToString(char[] ch, String separator) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < ch.length; i++) {
            sb.append(ch[i]);
            if (ch.length != (i + 1)) {
                sb.append(separator);
            }
        }
        return sb.toString();
    }

    /**
     * 将字符数组转换成字符串
     * 
     * @param str
     * @return
     */
    public static String charArrayToString(char[] ch) {
        return charArrayToString(ch, " ");
    }

    /**
     * 取汉字的首字母
     * 
     * @param src
     * @param isCapital
     *            是否是大写
     * @return
     */
    public static char[] getHeadByChar(char src, boolean isCapital) {
        // 如果不是汉字直接返回
        if (src <= 128) {
            return new char[] { src };
        }
        // 获取所有的拼音
        String[] pinyingStr = PinyinHelper.toHanyuPinyinStringArray(src);

        // 创建返回对象
        int polyphoneSize = pinyingStr.length;
        char[] headChars = new char[polyphoneSize];
        int i = 0;
        // 截取首字符
        for (String s : pinyingStr) {
            char headChar = s.charAt(0);
            // 首字母是否大写,默认是小写
            if (isCapital) {
                headChars[i] = Character.toUpperCase(headChar);
            } else {
                headChars[i] = headChar;
            }
            i++;
        }

        return headChars;
    }

    /**
     * 取汉字的首字母(默认是大写)
     * 
     * @param src
     * @return
     */
    public static char[] getHeadByChar(char src) {
        return getHeadByChar(src, true);
    }

    /**
     * 查找字符串首字母
     * 
     * @param src
     * @return
     */
    public static String[] getHeadByString(String src) {
        return getHeadByString(src, true);
    }

    /**
     * 查找字符串首字母
     * 
     * @param src
     * @param isCapital
     *            是否大写
     * @return
     */
    public static String[] getHeadByString(String src, boolean isCapital) {
        return getHeadByString(src, isCapital, null);
    }

    /**
     * 查找字符串首字母
     * 
     * @param src
     * @param isCapital
     *            是否大写
     * @param separator
     *            分隔符
     * @return
     */
    public static String[] getHeadByString(String src, boolean isCapital,
            String separator) {
        char[] chars = src.toCharArray();
        String[] headString = new String[chars.length];
        int i = 0;
        for (char ch : chars) {

            char[] chs = getHeadByChar(ch, isCapital);
            StringBuffer sb = new StringBuffer();
            if (null != separator) {
                int j = 1;

                for (char ch1 : chs) {
                    sb.append(ch1);
                    if (j != chs.length) {
                        sb.append(separator);
                    }
                    j++;
                }
            } else {
                sb.append(chs[0]);
            }
            headString[i] = sb.toString();
            i++;
        }
        return headString;
    }
}

在struts.xml中配备再次回到:(以下一些在文末项目中的地点是:/BOS/src/main/resources/struts.xml)

     <action name="region_*"  class="regionAction"  method="{1}">
            <result  name="OCimport" type="json">
                <param name="root">map</param>
            </result>   </action>

这样的话就整个落实了上传的功力了。

区域数据分页查询

 利用在此之前已经写好的pageQuery

 

分区数据导出功用

2.1 导入pinying4J的jar包以及工具类

美高梅开户网址 24

美高梅开户网址 25

四、文件下载

接下去说一下下载的职能:

例如我们要将以此页面中的内容变为excel文件下载下来。

美高梅开户网址 26

在下载的jsp页面中:

点击开关触发那个下载的函数,大家有三个函数:点击后跳转到action中。(以下部分在文末项目中的地方是:/BOS/src/main/webapp/WEB-INF/pages/base/subarea.jsp)

  function doExport(){
        location.href="${pageContext.request.contextPath}/subarea_exportFile";
    }

在action中:(以下部分在文末项目中的地点是:/BOS/src/main/java/cn/tf/bos/web/action/bc/SubareaAction.java)

   public String exportFile() throws IOException{
        // 对文件名进行编码
        String downloadFileName = "分区数据.xls";
        // 获得用户使用浏览器类型
        String agent = ServletActionContext.getRequest().getHeader("user-agent");

        // 对下载文件名编码
        downloadFileName = FileUtils.encodeDownloadFilename(downloadFileName, agent);
        // 将结果放入值栈
        ActionContext.getContext().put("downloadFileName", downloadFileName);

        return "exportFile";
    }


    //文件下载流
    public InputStream  getInputStream() throws IOException{
        PageResponseBean pageResponseBean=(PageResponseBean) ServletActionContext.getRequest().getSession().getAttribute("pageResponseBean");
        List<Subarea>  subareas=pageResponseBean.getRows();

        HSSFWorkbook  hssfWorkbook=new HSSFWorkbook();

        HSSFSheet sheet=hssfWorkbook.createSheet("分区数据");
        HSSFRow  headRow=sheet.createRow(0);
        headRow.createCell(0).setCellValue("分区编号");
        headRow.createCell(1).setCellValue("关键字");
        headRow.createCell(2).setCellValue("起始号");
        headRow.createCell(3).setCellValue("结束号");
        headRow.createCell(4).setCellValue("是否区分单双号号");
        headRow.createCell(5).setCellValue("位置信息");

        // 向excel写数据
        for (Subarea subarea : subareas) {
            // 每个分区一行
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(subarea.getId());
            dataRow.createCell(1).setCellValue(subarea.getAddresskey());
            dataRow.createCell(2).setCellValue(subarea.getStartnum());
            dataRow.createCell(3).setCellValue(subarea.getEndnum());
            dataRow.createCell(4).setCellValue(subarea.getSingle());
            dataRow.createCell(5).setCellValue(subarea.getPosition());
        }

        // 将数据缓存到字节数组
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        hssfWorkbook.write(arrayOutputStream);
        arrayOutputStream.close();
        byte[] data = arrayOutputStream.toByteArray();

        // 再通过字节数组输入流读取数据
        return new ByteArrayInputStream(data);

    }

在struts.xml中配置:

<result name="exportFile"  type="stream">
                    <param name="contentType">application/vnd.ms-excel</param>
                    <param name="contentDisposition">attachment;filename=${downloadFileName}</param>
                </result>

那般我们就可以把数量下载出来了:

美高梅开户网址 27

计算:文本使用的都是拾叁分优秀的本领来落到实处了文件一键上传、汉字转拼音、文件上传、文件下载的意义,具备非常好的实际意义,属于开采者必备技艺之一。

品种地址:  

重构分页代码

将重新分代码统一抽出到BaseAction中

 美高梅开户网址 28

美高梅开户网址 29

 

美高梅开户网址 30

美高梅开户网址 31

 

3.1 页面调解

为页面中程导弹出按键绑定事件

 美高梅开户网址 32

 

2.2 在RegionAction中的importXls方法中增多自动生成简码和都市编码的代码

美高梅开户网址 33

分区数据增进效果

区域限制非常大,对区域开展分割产生疏区

 

3.2 服务端落成

首先步:查询全体的分区数据

其次步:使用POI将数据写到Excel文件中

其三步:使用输出流进行文件下载

/**
     * 分区数据导出功能
     * @throws IOException 
     */
    public String exportXls() throws IOException{
        //第一步:查询所有的分区数据
        List<Subarea> list = subareaService.findAll();

        //第二步:使用POI将数据写到Excel文件中
        //在内存中创建一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建一个标签页
        HSSFSheet sheet = workbook.createSheet("分区数据");
        //创建标题行
        HSSFRow headRow = sheet.createRow(0);
        headRow.createCell(0).setCellValue("分区编号");
        headRow.createCell(1).setCellValue("开始编号");
        headRow.createCell(2).setCellValue("结束编号");
        headRow.createCell(3).setCellValue("位置信息");
        headRow.createCell(4).setCellValue("省市区");

        for (Subarea subarea : list) {
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(subarea.getId());
            dataRow.createCell(1).setCellValue(subarea.getStartnum());
            dataRow.createCell(2).setCellValue(subarea.getEndnum());
            dataRow.createCell(3).setCellValue(subarea.getPosition());
            dataRow.createCell(4).setCellValue(subarea.getRegion().getName());
        }

        //第三步:使用输出流进行文件下载(一个流、两个头)

        String filename = "分区数据.xls";
        String contentType = ServletActionContext.getServletContext().getMimeType(filename);
        ServletOutputStream out = ServletActionContext.getResponse().getOutputStream();
        ServletActionContext.getResponse().setContentType(contentType);

        //获取客户端浏览器类型
        String agent = ServletActionContext.getRequest().getHeader("User-Agent");
        filename = FileUtils.encodeDownloadFilename(filename, agent);
        ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename="+filename);
        workbook.write(out);
        return NONE;
    }

 

 

测验成功调换简码和都市编码的截图

美高梅开户网址 34

5.1 easyUI combobox下拉框使用

制作三个json文件:

 美高梅开户网址 35

    <input data-options="url:'${pageContext.request.contextPath }/json/combobox_data.json',
            valueField:'id',
            textField:'name'" 
            class="easyui-combobox">

美高梅开户网址 36

美高梅开户网址 37

 

 

定区拉长

定区是进行物流分配的中央单位,能够将取派员、分区、客商音讯举办关联,为活动分单提供数据。

页面:WEB-INF/pages/base/decidedzone.jsp

 美高梅开户网址 38

 

 

3 重构分页代码

5.2 选拔combobox浮现区域数据

页面:WEB-INF/pages/base/subarea.jsp

 美高梅开户网址 39

 

 

第一步:修改页面中combobox:

 美高梅开户网址 40

美高梅开户网址 41

 

充足收获name的法门

 美高梅开户网址 42

美高梅开户网址 43

 

 

第二步:在RegionAction中提供listajax方法

 美高梅开户网址 44

 

其三步:在RegionDao中扩大方法

 美高梅开户网址 45

 

第四步:为加多窗口中保存开关绑定事件

 美高梅开户网址 46

美高梅开户网址 47

 

 

4.1 页面调度

3.1 将StaffDaoImpl中的分页方法与分页参数抽取到BaseDaoImpl中作为叁个通用的分页方法和参数使用

美高梅开户网址 48

抽出通用参数

美高梅开户网址 49

安装查询条件对象

美高梅开户网址 50

收取通用分页查询艺术

5.3 服务端实现

创造分区对应的Action、Service、Dao

 

4.1.1 使用combobox显示取派员数据

第一步:修改定区页面中combobox下拉框UENCOREL地址

 美高梅开户网址 51

 

 

其次步:在StaffAction中提供listajax方法,查询全部未删减的取派员,重返json

/**
     * 查询所有未删除的取派员,返回json
     */
    public String listajax(){
        List<Staff> list = staffService.findListNotDelete();
        this.java2Json(list, new String[]{"decidedzones"});
        return NONE;
    }

 

其三步:在BaseDao中扩大多个通用查询格局

 美高梅开户网址 52

 

第四步:在StaffService中增加方法,查询未删减的取派员

 美高梅开户网址 53

 美高梅开户网址 54

 

3.2 在StaffAction和RegionAction中调用收取的通用分页查询办法成功各自的分页查询央求

美高梅开户网址 55

在StaffAction中调用抽取的分页查询办法

美高梅开户网址 56

在RegionAction中调用抽取的分页查询办法

分页查询难题

将Java对象转为json进度中,因为对象时期有互相援引关系,会爆发死循环难点,解决格局,排除在那之中属性

 美高梅开户网址 57

 

1 学习安排 1 、完成区域导入成效 nOCUpload 一键…

4.1.2 动用datagrid彰显分区数据

首先步:修改页面中datagrid的UENCOREL地址

 美高梅开户网址 58

其次步:在SubareaAction中提供listajax方法,查询全部未涉嫌到定区的分区,重回json

 美高梅开户网址 59

 

其三步:在SubareaService中扩充方法,查询未涉嫌到定区的分区

 美高梅开户网址 60

美高梅开户网址 61

 

 

 

3.3 在region.jsp中期维修改表格数据央浼地址为RegionAction中对应的分页查询艺术地址

美高梅开户网址 62

4.1.3 为保存按键绑定事件提交表单

 美高梅开户网址 63

 

难点一:提交的表单中存在多少个id参数

 美高梅开户网址 64

 

美高梅开户网址 ,杀鸡取蛋方案:将datagrid的filed由id改为subareaid

 美高梅开户网址 65

 

难点二:提交的表单中subareaid参数的值为null

 美高梅开户网址 66

 

减轻方案:在分区类中提供getSubareaid方法

 美高梅开户网址 67

美高梅开户网址 68

 

4 增多分区效应

4.2 服务端完结

创制订区的Action、瑟维斯、Dao

 美高梅开户网址 69

 

Service代码:

 美高梅开户网址 70

 

 

配置struts.xml

 美高梅开户网址 71

 

 

4.1 在页面加多分区的窗口设置选用分区所在区域的下拉框数据央浼地址

美高梅开户网址 72

定区分页查询

第一步:修改定区jsp页面中datagrid的U奥迪Q3L地址

 美高梅开户网址 73

 

第二步:在定区Action中提供pageQuery方法

 美高梅开户网址 74

 

其三步:在Decidedzone.hbm.xml中期维修改,查询定区对象时须要立即加载关联的取派员对象

 美高梅开户网址 75

 

4.2 在RegionAction中增多区域列表查询格局并收取相关代码是到BaseAction中作为三个通用的列表数据查询办法

美高梅开户网址 76

在RegionAction中增加区域列表查询办法

美高梅开户网址 77

抽出列表数据查询代码到BaseAction中作为贰个通用的列表查询艺术

美高梅开户网址 78

抽出分区管战胜务层对象实例到BaseAction中

分页查询死循环难点

1、页面不供给体现关联数据时

焚薮而田:将涉嫌对象属性排除掉

 

2、页面要求展现关联数据时

消除:将涉嫌对象改为那时加载,而且将涉嫌对象中的属性排除

 

1 学习布署 1 、分区组合条件分页查询 n分…

5 组合条件分页查询分区效率

5.1 给查询分区窗口的询问开关增添事件,用于拍卖顾客的询问操作。

美高梅开户网址 79

体系化查询表单数据,提交ajax查询央浼

5.2 在SubareaAction中付出pageQuery分页查询艺术,并对相应的询问条件实行管理,最终将查询出的数码调用BaseAction中的通用分页数据转json方法对页面再次来到相应的json数据。

美高梅开户网址 80

6 分区数据导出功用

6.1 在页面给导出开关绑定事件跳转后台用于拍卖导出数据的章程

美高梅开户网址 81

6.2 在SubareaAction中开辟exportXls方法用于拍卖导出数据的央求

美高梅开户网址 82

6.3 测量试验导出分区数据成功

美高梅开户网址 83

美高梅开户网址 84

谬误日志:

后天清晨付出项指标时候运维一直战败,报以下截图中张冠李戴。

美高梅开户网址 85

随之小编在境内的csdn等各大开垦者论坛网址到处寻觅,把标题锁定在jar争辩和缺少jar包那多少个地点。接下来花了一个三十分钟依然没搜索难题所在,然后作者东方之珠外的Stack
Overflow找寻难点并一眼瞧见了和自己难点一样的发问。步向之后开采了以下截图中的第一个答案就消除了自己的难题,注明是作者后边的可行性有误,那是jdk版本与项目框架版本争执导致的。

美高梅开户网址 86

假定项目中的jdk版本形成了1.8,而spring和hibernate等框架还是是3.xx的低版本就会晤世那些主题素材。而以此种类本身就布署的是jdk版本1.7,而且方今作者平素都用的1.7开支没出现难点。而前些天意想不到形成了1.8所以就招致了这种怪诞的气象,具体原因小编眼下光景推算是因为前日win10世间工具栏失灵点击无效,笔者在职务管理注重启了能源浏览器。那变成了myeclipse的经过强制甘休并非常规退出,所以也就使专门的工作空间本来设置的jdk版本为1.7被重新载入参数成了暗中同意的1.8。

在支付增加分区作用的时候调控台出现上边截图中的错误,而且数据增加退步。

美高梅开户网址 87

前边肯定实体属性名与表单参数名完全对应之后在浏览器中利用开拓工具抓取增添分区时发出的互联网央求开掘变成这些主题材料应运而生的缘故是呼吁地址错误,修改为科学的表单提交地址然后成功消除该难题。

在支付分页查询分区中央调节制台报出以下截图中的错误,而且询问数据退步。

美高梅开户网址 88

美高梅开户网址 89

之后采纳debug的点子鲜明了不当爆发在BaseAction中通用的分页数据转json方法少将对象类别化json的时候,又依照错误新闻结尾的空指针极度音信排查到在pageBean对象中的分页数据subArea对象中的一本性质是region对象,而应该为hibernate框架暗许懒加载重返的region的代理对象,所以region对象内的装有属性值均为空导致连串化json退步。然后在Subarea对象的xml映射文件中在region的标签中增进lazy=false属性后成功化解该难题。

美高梅开户网址 90

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图