项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
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文件数据的更多相关文章
- jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)
这篇文章主要是对前两篇关于ajaxfileupload.js插件的文章 <ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload. ...
- jquery头像上传剪裁插件cropper的前后台demo
因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...
- jquery.ocupload上传文件到指定目录
首先引入两个js <script type="text/javascript" src="${pageContext.request.contextPath }/r ...
- PHPExcel读取excel文件示例
PHPExcel读取excel文件示例PHPExcel最新版官方下载网址:http://phpexcel.codeplex.com/PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包 ...
- asp.net读取excel文件多种方法
asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取. 方法一:采用OleDB读取Excel文件 把Excel文件 ...
- .NET读取Excel文件的三种方法的区别
ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...
- 使用jxl,poi读取excel文件
作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...
- 使用POI读取excel文件内容
1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...
- jspsmart(保存文件)+poi(读取excel文件)操作excel文件
写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...
随机推荐
- Win7打开新的文件夹总会以新窗口的形式打开
首先可以在 组织-->文件夹和搜索选项 中设置“在同一窗口中打开每个文件夹” 如果设置后不起作用还可以 管理员方式执行以下两条命令 在开始菜单-运行中输入regsvr32 "%Sy ...
- Java+MySql图片数据保存
之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧! 1.创建表: drop table if exists photo; CREATE TA ...
- Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类
1. 成员内部类分为 静态内部类 和 非静态内部类. 非静态内部类 和 外部类的其他成员一样处理, 非静态内部类可以访问外部类的private的属性,而外部类不能访问非静态内部类的属性,需要实例非静 ...
- 防止未登录用户操作—struts2拦截器简单实现(转)
原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址 一般,我们的web应用都是只有在用户登录之后才允许操作 ...
- 6 Python 数据类型—字符串
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. var1 = 'Hello World!' var2 = ...
- Idea_学习_07_Idea常用配置
二.参考资料 1.Android Studio 入门级教程(一)
- 将jsp页面内容保存到excel(转)
在此,强调一下搜索时关键词的重要性,这样一下子可以定位到文章,否则处于盲人摸象,毫无目的尴尬境地.本篇就是通过export jsp to excel找到的. 原文地址:How to Export We ...
- flex 和bison的安装和使用
1.在ubutu上安装 yacc的命令: sudo apt-get install flex bison flex:词法分析器 flex是一个词法分析器.用来将一个.l文件生成一个.c程序文件.即生成 ...
- linux命令学习笔记(39):grep 命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. grep全称是Global Regular Expression Print,表示全局正则表 ...
- SQLite优化方法
1.建表优化 SQLite的数据库本质文件读写操作,频繁操作打开和关闭是很耗时和浪费资源的: 优化方法事务机制: 这里要注意一点:事务的开启是要锁定DB的,其他对DB的写入操作都是无法成功的. db. ...