下载模板
userList.jsp
<a href="downloadUserExcel">下载模板</a>
DownloadUserServlet.java
/**
* 下载
*/
@WebServlet("/downloadUserExcel")
public class DownloadUserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//因为是给前端响应文件,不是字符串,所以需要设置ContentType和Header信息
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("用户导入模板.xls","utf-8"));
//获得服务器上模板文件的路径
String path=request.getSession().getServletContext().getRealPath("/upload/template/用户导入模板.xls");
//按照设置的mime类型和头部信息,把文件响应给前端
InputStream inputStream=new FileInputStream(path);//定义输入流读取path路径对应的模板文件
OutputStream outputStream= response.getOutputStream();//定义输出流为响应输出流
//读取服务器文件 写入到前端响应流
byte[] buffer=new byte[8*1024];//缓冲区
int length=-1;//每次读取的实际长度
while( (length=inputStream.read(buffer)) !=-1){
outputStream.write(buffer,0,length);
}
//关闭字节流
outputStream.close();
inputStream.close();
}
}
效果图,下载成功
批量导入
POI的定义
JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel。而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。
POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本,首先去官网下载如下界面:
下载完后,打开“poi-bin-3.15-20160924.tar.gz”获取操作excel需要的jar包,并将这些jar包复制到项目中。对于只操作2003 及以前版本的excel,只需要poi-3.15.jar ,如果需要同时对2007及以后版本进行操作则需要复制
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
userList.jsp
<form action="userImport" method="post" enctype="multipart/form-data">
<input type="file" name="userExcel" value="">
<input type="submit" value="导入">
</form>
dao层:UserDao
public interface UserDao {
//根据用户名查询用户信息
User selectByName(String uname) throws SQLException;
//根据用户id查询用户的菜单权限
List<Map<String ,Object>> getMenuByUid(int uid)throws SQLException;
//获取用户表的总条数
int selectCount() throws SQLException;
//分页查询
List<User> selectByPage(int pageNo,int pageSize) throws SQLException;
//批量导入
int insert(User user) throws SQLException;
//批量删除
int delete(int uid) throws SQLException;
}
userDaoImpl实现类
public class UserDaoImpl implements UserDao {
private QueryRunner queryRunner=new QueryRunner();
private Connection conn= JDBCUtil.getCon();
private String sql=null;
@Override
public User selectByName(String uname) throws SQLException {
sql="select * from user where uname=?";
BeanHandler<User> userBeanHandler=new BeanHandler<>(User.class);
User user= queryRunner.query(conn,sql,userBeanHandler,uname);
return user;
}
@Override
public List<Map<String, Object>> getMenuByUid(int uid) throws SQLException {
sql="select mname from user u " +
"inner join user_role ur on u.uid=ur.uid " +
"inner join role_menu rm on ur.rid=rm.rid " +
"inner join menu m on rm.mid=m.mid " +
"where u.uid=?";
MapListHandler mapListHandler=new MapListHandler();
List<Map<String,Object>> list=queryRunner.query(conn,sql, mapListHandler,uid);
return list;
}
/**
* 获取用户表的总条数
* @return
* @throws SQLException
*/
@Override
public int selectCount() throws SQLException {
sql="select count(uid) num from user";
MapHandler mapHandler=new MapHandler();
Map<String, Object> map = queryRunner.query(conn, sql, mapHandler);
int count=(int) (long)map.get("num");
return count;
}
/**
* 分页查询
* @param pageNo
* @param pageSize
* @return
*/
@Override
public List<User> selectByPage(int pageNo, int pageSize) throws SQLException {
sql="select * from user limit ?,?";
BeanListHandler<User> beanListHandler=new BeanListHandler<>(User.class);
List<User> userList=queryRunner.query(conn,sql,beanListHandler,(pageNo-1)*pageSize,pageSize);
return userList;
}
/**
* 批量导入
* @param user
* @return
* @throws SQLException
*/
@Override
public int insert(User user) throws SQLException {
sql="insert into user(uname,pwd,address,state) values(?,?,?,?)";
return queryRunner.update(conn,sql,user.getUname(),user.getPwd(),user.getAddress(),user.getState());
}
/**
* 批量删除
* @param uid
* @return
* @throws SQLException
*/
@Override
public int delete(int uid) throws SQLException {
sql="delete from user where uid =?";
return queryRunner.update(conn,sql,uid);
}
}
service层:UserService
public interface UserService {
User selectByName(String uname);
List<Map<String ,Object>>getMenuByUid(int uid);
int selectCount();
//分页查询
PageResult selectByPage(int pageNo, int pageSize);
//批量导入
boolean insertList(List<User> userList);
boolean deleteList(String[] idList);
}
UserServiceImpl实现类
public class UserServiceImpl implements UserService {
UserDao userDao=new UserDaoImpl();
@Override
public User selectByName(String uname) {
try {
return userDao.selectByName(uname);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Map<String, Object>> getMenuByUid(int uid) {
try {
return userDao.getMenuByUid(uid);
}catch (SQLException e){
e.printStackTrace();
}
return null;
}
@Override
public int selectCount(){
try {
return userDao.selectCount();
}catch (SQLException e){
e.printStackTrace();
}
return 0;
}
@Override
public PageResult selectByPage(int pageNo, int pageSize) {
PageResult pageRes=new PageResult();
pageRes.setPageNo(pageNo);
pageRes.setPageSize(pageSize);
try {
int totalcount = userDao.selectCount();
List<User> userList = userDao.selectByPage(pageNo, pageSize);
pageRes.setTotalCount(totalcount);
pageRes.setPageTotalCount();
pageRes.setDataList(userList);
} catch (SQLException e) {
e.printStackTrace();
}
return pageRes;
}
/**
* 批量导入
* @param userList
* @return
*/
@Override
public boolean insertList(List<User> userList) {
int count=0;
for (User user : userList) {
try {
count+= userDao.insert(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
//判断成功插入的计数 等于 集合大小,说明全部插入
if(count==userList.size()){
return true;
}else{
return false;
}
}
/**
* 批量删除
*/
@Override
public boolean deleteList(String[] idList) {
int count=0;
for (String id : idList) {
//把字符串id转换为整数uid
int uid = Integer.parseInt(id);
try {
int n = userDao.delete(uid);
count+=n;//把每次删除受影响的行数累加
} catch (SQLException e) {
e.printStackTrace();
}
}
//累加成功的行数 和 数组长度一致,说明全部删除成功
if(count==idList.length){
return true;
}else{
//事务回滚
return false;
}
}
}
ExcelUtil.java批量导入工具类
public class ExcelUtil {
public static List<User> getUserListFromExcel(String fileName, InputStream inputStream) throws IOException {
List<User> userList = new ArrayList<>();
//判断文件名后缀是否为excel
if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
//判断是否为老版本.xls
boolean flag = fileName.endsWith(".xls");
//poi中对待两种版本的excel会有不同的类进行处理,创建工作簿
Workbook workbook = flag ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
//获取工作簿中第一张sheet
Sheet sheet = workbook.getSheetAt(0);
//如果sheet表中物理行 大于2说明有数据
if (sheet.getPhysicalNumberOfRows() > 2) {
//从索引2 即第三行 开始循环所有表中的行
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
//根据索引获得当前行
Row row = sheet.getRow(i);
//获取行中的索引 0的列,即第一列
Cell cell0 = row.getCell(0);
cell0.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
//获取列中的字符串并打印
String uname = cell0.getStringCellValue();
Cell cell1 = row.getCell(1);
cell1.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
String pwd = cell1.getStringCellValue();
Cell cell2 = row.getCell(2);
cell2.setCellType(Cell.CELL_TYPE_STRING);//设置列格式为文本类型
String address = cell2.getStringCellValue();
Cell cell3 = row.getCell(3);
int state = 0;
if (cell3.getCellType() == Cell.CELL_TYPE_NUMERIC) {
state = (int) cell3.getNumericCellValue();
if (state >= 1) {
state = 1;
} else {
state = 0;
}
}
//定义user对象,把行中的每一列的数据存储到对象中
User user = new User();
Digester md5 = new Digester(DigestAlgorithm.MD5);
user.setUname(uname);
user.setPwd(md5.digestHex(pwd));
user.setAddress(address);
user.setState(state);
//再把user对象存入到集合中
userList.add(user);
}
}
}
return userList;
}
}
servlet层:UserImportServlet.java
/**
* 导入
*/
@WebServlet("/userImport")
@MultipartConfig
public class UserImportServlet extends HttpServlet {
UserService userService=new UserServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户提交的Excel文件
Part userExcel =request.getPart("userExcel");
//获得提交的文件名
String fileName = userExcel.getSubmittedFileName();
//调用工具类进行excel文件解析
List<User> userList= ExcelUtil.getUserListFromExcel(fileName,userExcel.getInputStream());
//System.out.println(userList);
boolean mark = userService.insertList(userList);
if(mark){
response.sendRedirect("userList");
}
}
}
效果图
echars图表
ECharts最基本的代码结构:
引入js文件,DOM容器,初始化对象,设置option
X轴数据:
数组1:[‘张三’,‘李四’,‘王五’,‘闰土’,‘小明’,‘茅台’,‘二妞’,‘大强’]
Y轴数据:
数组2:[88,92,63,77,94,80,72,86]
图表类型:在series设置type:bar //bar是柱状图,line是线状,pie是饼状
- 最大值/ 最小值 markPoint
- 平均值 markLine
- 数值显示 label
- 柱宽度 barWidth
代码示例
ComplainChart.java
package com.zhan.nationaltax.servlet.front.complain;
import com.alibaba.fastjson.JSON;
import com.zhan.nationaltax.service.ComplainService;
import com.zhan.nationaltax.service.impl.ComplainServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/nsfw/complainChart.do")
public class ComplainChart extends HttpServlet {
ComplainService complainService = new ComplainServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String year = request.getParameter("year");
List<Map<String,Object>> mapList = complainService.selectCountByYear(year);
// for (Map<String, Object> map : mapList) {
// System.out.println(map.get("month")+"---"+map.get("num"));
// }
// List<int[]> data = new ArrayList<>();
int[] month = new int[mapList.size()];
int[] num = new int[mapList.size()];
for (int i = 0; i < mapList.size(); i++) {
month[i] = Integer.parseInt(mapList.get(i).get("month").toString());
num[i] = Integer.parseInt(mapList.get(i).get("num").toString());
}
Map<String, Object> data = new HashMap<>();
data.put("month",month);
data.put("num",num);
response.getWriter().println(JSON.toJSON(data));
// for (int i:month) {
// System.out.println(i);
// }
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
ChartTest.jsp
<%--
Created by IntelliJ IDEA.
User: chz
Date: 2023/6/9
Time: 22:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>chart入门</title>
<script src="js/jquery.min.js"></script>
<script src="js/echarts/echarts.min.js"></script>
<style>
#container{
width: 800px;
height: 600px;
}
</style>
</head>
<body>
<div style="text-align:center;width:100%;">
<select id="year" name="year" onchange="doAnnualStatistic()"></select>
</div>
<!--创建个容器 -->
<div id="container"></div>
</body>
<script>
$(function () {
//文档就绪后动态生成当前年份的后五年
var currentYear = new Date().getFullYear(); // 拿到当前的年份
for (var i = currentYear ; i > currentYear- 5 ; i -- ){
$("#year").append('<option value="'+i+'">'+i+'</option>');
}
function doAnnualStatistic(){
var year=$("#year").val();
var month;
var num;
//获得数据
$.ajax({
url:"/nsfw/complainChart.do",
type:"post",
data:{"year":year},
dataType:"json",
success:function(response){
console.log(response);
}
});
//04 实例化echarts
// 定义渐变
var linear = {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#02bcff' // 0% 处的颜色
}, {
offset: 1, color: '#5555ff' // 100% 处的颜色
}],
global: false // 缺省为 false
}
// 4.1 创建一个实例
var echart = echarts.init(document.getElementById("container"));
// 4.2 定义配置项
var option = {
// 图表的标题
title:{
text:"投诉统计图"
},
// 图表的提示
tooltip:{},
// 图例
legend:{data:["投诉量"]},
// x轴线
xAxis:{data:response.month},
// y轴线
yAxis:{},
// 设置数据
series:[
{
// 数据名称
name:"睡眠时长",
// 类型为柱状图
type:"bar",
//设置颜色
// color: [
// '#ac4cff'
// ],
// 数据data
data:response.num,
itemStyle:{
color:linear,
borderRadius:[30,30,0,0]
}
}
]
}
// 4.3 更新配置
echart.setOption(option);
}
});
</script>
</html>