1、 快递员的条件分页查询-noSession,条件查询

2、 快递员删除(逻辑删除)

3、 基于Apache POI实现批量导入区域数据

a) Jquery OCUpload上传文件插件使用

b) Apache POI读取excel文件数据

1.1 快递员的条件分页查询 --关键 需要将查询条件 和分页条件都绑定到一次请求中

1、 提供工具方法:将表单序列化为json对象

//工具方法:将表单中输入项格式化为json对象 {"input的name":"input的value",}

$.fn.serializeJson=function(){

var serializeObj={};

var array=this.serializeArray();

var str=this.serialize();

$(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;

};

1、 给弹出查询窗口,查询按钮绑定单击事件

1.1.1 服务端完成查询

1、 将页面提交参数获取到,查询数据中符合条件数据

2、 现在Dao继承接口JpaRepository接口,没有根据条件查询,返回分页数据方法。故需要让dao接口继承另外接口

1、 改造action中分页方法

/**

* @Description: 快递员分页查询

*/

@Action("courierAction_pageQuery")

public String pageQuery() throws Exception {

Pageable pageable = new PageRequest(page-1, rows);

//通过模型驱动model将查询条件获取到

Page<Courier> page = courierService.pageQuery(model, pageable);

Map<String, Object> map = new HashMap<>();

map.put("total", page.getTotalElements());

map.put("rows", page.getContent());

//需要将一些不要转json属性排除掉

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setExcludes(new String[]{"fixedAreas"});

String json = JSONObject.fromObject(map, jsonConfig).toString();

System.out.println(json);

//通过response对象向浏览器响应json

ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");

ServletActionContext.getResponse().getWriter().write(json);

return NONE;

}

2、 Service层中进行条件封装

/**

* @Description: 条件查询(单表查询,多表关联查询)

* @param model :查询条件

* @param pageable :分页需要参数

ORM框架查询:通过查询实体 设置查询条件 最终发出sql: select * from tableName where c1 = ? and|or c2 = ? or c3 like '%'?'%'

*/

public Page<Courier> pageQuery(Courier model, Pageable pageable) {

final String courierNum = model.getCourierNum();

final String company = model.getCompany();

final String type = model.getType();

final Standard standard = model.getStandard();

//Specification对象封装查询条件

Specification<Courier> spec = new Specification<Courier>() {

//predicate查询条件: 等同于 where c1 = ?

//Root:代表Criteria查询的根对象, 相当于sql : from talbeName

//CriteriaQuery接口:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by等

//CriteriaBuilder接口:用来构建CritiaQuery的构建器对象: 工厂对象:创建Predicate工厂实例

public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

List<Predicate> list = new ArrayList<>();

//cb.equal 运算符 使用等于=

//p1:查询根实体中属性 p2:查询条件值

if(StringUtils.isNotBlank(courierNum)){

Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courierNum);

list.add(p1);

}

if(StringUtils.isNotBlank(company)){

Predicate p2 = cb.like(root.get("company").as(String.class), "%"+company+"%");

list.add(p2);

}

if(StringUtils.isNotBlank(type)){

Predicate p3 = cb.equal(root.get("type").as(String.class), type);

list.add(p3);

}

//快递员表跟收派标准表关联查询

if(standard!=null && StringUtils.isNotBlank(standard.getName())){

//创建收派标准关联对象 默认内连接

Join<Object, Object> join = root.join("standard", JoinType.INNER);

Predicate p4 = cb.equal(join.get("name").as(String.class), standard.getName());

list.add(p4);

}

if(list!=null && list.size()==0){

return null;

}

Predicate[] restrictions = new Predicate[list.size()];

//将list集合转为数组

restrictions = list.toArray(restrictions);

//cb.and 相对多个条件 并且 cb.or--或者

return cb.and(restrictions);

}

};

return courierDao.findAll(spec , pageable);

1.1.1 JpaSpecificationExecutor查询接口说明

参数:Criteria查询基本概念

Criteria 查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。

CriteriaQuery接口:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by等

注意:CriteriaQuery对象只对实体类型或嵌入式类型的Criteria查询起作用

参数:Root接口:代表Criteria查询的根对象,Criteria查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中的FROM子句类似

1:Root实例是类型化的,且定义了查询的FROM子句中能够出现的类型。

2:查询根实例能通过传入一个实体类型给 AbstractQuery.from方法获得。

3:Criteria查询,可以有多个查询根。

4:AbstractQuery是CriteriaQuery 接口的父类,它提供得到查询根的方法。

参数:CriteriaBuilder接口:用来构建CritiaQuery的构建器对象

返回值:Predicate:一个简单或复杂的谓词类型,其实就相当于条件或者是条件组合。

Criteria查询

基本对象的构建

1:通过EntityManager的getCriteriaBuilder或EntityManagerFactory的getCriteriaBuilder方法可以得到CriteriaBuilder对象

2:通过调用CriteriaBuilder的createQuery或createTupleQuery方法可以获得CriteriaQuery的实例

3:通过调用CriteriaQuery的from方法可以获得Root实例

过滤条件

1:过滤条件会被应用到SQL语句的FROM子句中。在criteria 查询中,查询条件通过Predicate或Expression实例应用到CriteriaQuery对象上。

2:这些条件使用 CriteriaQuery .where 方法应用到CriteriaQuery 对象上

3:CriteriaBuilder也作为Predicate实例的工厂,通过调用CriteriaBuilder 的条件方法( equal,notEqual, gt, ge,lt, le,between,like等)创建Predicate对象。

4:复合的Predicate 语句可以使用CriteriaBuilder的and, or andnot 方法构建。

构建简单的Predicate示例:

Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+uqm.getName()+“%”);

Predicate p2=cb.equal(root.get("uuid").as(Integer.class), uqm.getUuid());

Predicate p3=cb.gt(root.get("age").as(Integer.class), uqm.getAge());

构建组合的Predicate示例:

Predicate p = cb.and(p3,cb.or(p1,p2));

当然也可以形如前面动态拼接查询语句的方式,比如:

java代码:

查看复制到剪贴板打印

Specification<UserModel> spec = new Specification<UserModel>() {

public Predicate toPredicate(Root<UserModel> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

List<Predicate> list = new ArrayList<Predicate>();

if(um.getName()!=null && um.getName().trim().length()>0){

list.add(cb.like(root.get("name").as(String.class), "%"+um.getName()+"%"));

}

if(um.getUuid()>0){

list.add(cb.equal(root.get("uuid").as(Integer.class), um.getUuid()));

}

Predicate[] p = new Predicate[list.size()];

return cb.and(list.toArray(p));

}

};

也可以使用CriteriaQuery来得到最后的Predicate,示例如下:

java代码:

查看复制到剪贴板打印

Specification<UserModel> spec = new Specification<UserModel>() {

public Predicate toPredicate(Root<UserModel> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

Predicate p1 = cb.like(root.get("name").as(String.class), "%"+um.getName()+"%");

Predicate p2 = cb.equal(root.get("uuid").as(Integer.class), um.getUuid());

Predicate p3 = cb.gt(root.get("age").as(Integer.class), um.getAge());

//把Predicate应用到CriteriaQuery中去,因为还可以给CriteriaQuery添加其他的功能,比如排序、分组啥的

query.where(cb.and(p3,cb.or(p1,p2)));

//添加排序的功能

query.orderBy(cb.desc(root.get("uuid").as(Integer.class)));

return query.getRestriction();

}

逻辑删除

、页面:调整

function doDelete(){

//判断选中记录数

var rows = $("#grid").datagrid("getSelections");

if(rows.length==0){

$.messager.alert('系统信息',"请至少选中一条记录操作!","warning");

}else{

console.info(rows);

//创建js数组对象

var array = new Array();

//将选中快递员json数组中id获取出来

for(var i=0;i<rows.length;i++){

var id = rows[i].id;

//push() 方法可向数组的末尾添加一个或多个元素

array.push(id);

}

//元素是通过指定的分隔符进行分隔的。

var ids = array.join(",");

//发送请求,将快递员id提交

window.location.href="${pageContext.request.contextPath}/courierAction_delete.action?ids="+ids;

//或者发送ajax请求

}

}

};

1.1 方式二:ajax请求提交

function doDelete(){

//判断选中记录数

var rows = $("#grid").datagrid("getSelections");

if(rows.length>0){

$.messager.confirm('提示信息','是否进行删除!',function(r){

if(r){

// 将删除快递员id获取到

//创建数组

var array = new Array();

for(var i=0;i<rows.length;i++){

var id = rows[i].id;

//向数组中添加数据

array.push(id);

}

//设置数组内容拼接符 默认使用逗号分隔

var ids = array.join(",");

//发送请求:提交快递员的id 删除数据

//方式一:location.href="xxx.action?ids="+ids; 会刷新页面,需要在服务端配置结果视图

//方式二:发送ajax请求,不需要结果视图

$.post("${pageContext.request.contextPath}/courierAction_deleteBatch.action",{“ids”:ids},function(data){

//让datagrid重新加载数据

$("#grid").datagrid("reload");

})

}

})

}else{

$.messager.alert('提示信息','请至少选中一条记录操作!','warning');

}

}

1、 ocUpload使用:

a) 引入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/ocupload/jquery.ocupload-1.1.2.js"></script>

b) 在页面提供任意的元素 给出id

c) 在页面加载完成后调用uplaod方法:动态修改html元素

 

public static void main(String[] args) throws Exception {

//解析本地磁盘exel文件 后缀名:xls

//文件目录

String pathname = "H:\\北京Java271期_速运快递\\速运快递项目-day04\\资料\\03_区域测试数据\\区域导入测试数据.xls";

//使用POI提供API读取文件

//:excel文件对象

//07版本 XSSFWorkbook

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(pathname)));

//解析文件中数据

//从文件对象中获取标签页

HSSFSheet sheet = workbook.getSheetAt(0);

//遍历标签页中行

for (Row row : sheet) {

//遍历每一行中单元格中数据

System.out.println();

for (Cell cell : row) {

System.out.print(cell.getStringCellValue()+" ");

}

}

}

1.1.1 在项目中使用POI

//定义变量接收上传文件

private File upload;

//接收文件MIME类型,文件名称

private String uploadContentType;

private String uploadFileName;

public void setUpload(File upload) {

this.upload = upload;

}

public void setUploadContentType(String uploadContentType) {

this.uploadContentType = uploadContentType;

}

public void setUploadFileName(String uploadFileName) {

this.uploadFileName = uploadFileName;

}

/**

* @Description: 通过POI解析excel文件中数据

*/

@Action("areaAction_importXls")

public String importXls() throws Exception {

List<Area> list = new ArrayList<>();

//创建excel文件对象

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(upload));

//获取标签页

HSSFSheet sheet = workbook.getSheetAt(0);

//遍历标签页获取行

for (Row row : sheet) {

//忽略标题行

if(row.getRowNum()==0){

continue;

}

String id = row.getCell(0).getStringCellValue();

String province = row.getCell(1).getStringCellValue();

String city = row.getCell(2).getStringCellValue();

String district = row.getCell(3).getStringCellValue();

String postcode = row.getCell(4).getStringCellValue();

//创建区域对象

Area area = new Area(id, province, city, district, postcode, null, null);

list.add(area);

}

areaService.save(list);

//释放资源

workbook.close();

//由于提交表单到Iframe中,故配置结果视图也看不到

return NONE;

}

1.1 Pinyin4j

汉字跟拼音转换。

1.1.1 Demo

项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据的更多相关文章

  1. jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)

    这篇文章主要是对前两篇关于ajaxfileupload.js插件的文章 <ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload. ...

  2. jquery头像上传剪裁插件cropper的前后台demo

    因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...

  3. jquery.ocupload上传文件到指定目录

    首先引入两个js <script type="text/javascript" src="${pageContext.request.contextPath }/r ...

  4. PHPExcel读取excel文件示例

    PHPExcel读取excel文件示例PHPExcel最新版官方下载网址:http://phpexcel.codeplex.com/PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包 ...

  5. asp.net读取excel文件多种方法

    asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取.   方法一:采用OleDB读取Excel文件 把Excel文件 ...

  6. .NET读取Excel文件的三种方法的区别

    ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...

  7. 使用jxl,poi读取excel文件

    作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...

  8. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  9. jspsmart(保存文件)+poi(读取excel文件)操作excel文件

    写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...

随机推荐

  1. pro git 使用积累

    http://www.zhihu.com/question/20070065 git相关问题的收集 Git 是 Linux 之父 Linus Trovalds,为管理 Linux 内核代码而建立的,被 ...

  2. 初始React Native

    1.何是React Native: React-Native是:Facebook 在2015年初React.js技术研讨大会上公布的一个开源项目.支持用开源的JavaScript库React.js来开 ...

  3. 函数lock_rec_get_n_bits

    /*********************************************************************//** Gets the number of bits i ...

  4. java 中的异常处理

    一. 异常的概念和Java异常体系结构  异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,     是Java语言健壮性的一个重要体现. Java把 ...

  5. DIV布局之道三:DIV块的覆盖,DIV层遮盖其他DIV

    DIV布局网页的第三种方式:覆盖.DIV覆盖方式经常应用于网页弹出框的制作,例如在网店系统中,当用户没有登录时,点击购买,系统弹出一个登陆框. 请看代码: HTML部分: XML/HTML Code复 ...

  6. easyui formatter 返回easyui组件

    <table id="dg2" title="标题" style="width:400px;float: left;"> < ...

  7. Python开发 基礎知識 (未完代補)

    一.Python基本知識 1.Python屬高階語言,所編築的是字節碼 2.一般狀態statement 終止於換行,如需使用多數行編寫,可在行末加上 \,以表延續 但在 parentheses ( ) ...

  8. 《算法导论》——MergeSort

    前言: 在今后的日子里,我将持续更新博客,讨论<算法导论>一书中的提到的各算法的C++实现.初来乍到,请多指教. 今日主题: 今天讨论<算法导论>第二章算法基础中的归并排序算法 ...

  9. 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序

    0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...

  10. WordPress的SEO插件——WordPress SEO by yoast安装及使用

    插件:WordPress SEO by yoast 使用方法: 做好网站SEO一直是站长们的愿望,说简单也简单,但是说难也难,因为需要注意的地方太多,一个不小心被百度K了你都不知道怎么回事.这里和大家 ...