ATTEN:张经理
phone:13696432490
QQ:9618195
ADD:重庆市渝北区栖霞路18号金贸时代7-24
本文由重庆佰鼎科技有限公司提供,重点介绍了oa联盟相关内容。重庆佰鼎科技有限公司专业提供oa协同办公平台,oa与钉钉,oa教程等多项产品服务。公司专业性高,价格优惠,服务完善,是您的不二之选。
oa联盟1. 使用Echarts柱状图显示收入统计信息-业务层和DAO层
(1) 后台如何拼接对应的json字符串?
//将list转换为jsonStr
StringBuilder icTypeArr = new StringBuilder("[");
StringBuilder amountArr = new StringBuilder("[");
for(int i=0;i Object[] arr = list.get(i); if (i icTypeArr.append("\""+arr[0]+"\","); amountArr.append(arr[1]+","); }else { icTypeArr.append("\""+arr[0]+"\""); amountArr.append(arr[1]); } } icTypeArr.append("]"); amountArr.append("]"); //返回jsonStr String jsonStr = "["+icTypeArr.toString()+","+amountArr.toString()+"]"; 2. 收支管理-财务添加支出 (1) 当前审批人假如是财务,那么要进行什么操作,简述逻辑。 审核通过,添加支出记录,并修改报销单状态。 (2) 截止到这里,审批报销单功能彻底完成,再次概述整个审批逻辑。 判断是否审批通过 如果通过 判断是否是财务 如果是财务 添加支出记录,修改报销单状态为已打款 如果不是财务 判断报销单总金额是否大于2500 如果大于2500 判断当前审核人是否为总裁 如果是总裁 添加审核记录,更改报销单状态,设置下一个审核人是财务 如果不是总裁 添加审核记录,更改报销单状态,设置下一个审核人是总裁 如果小于2500 添加审核记录,更改报销单状态,设置下一个审核人是财务 如果不通过 判断是拒绝还是打回 如果是拒绝 添加审核记录,更改报销单状态为拒绝 如果是打回 添加审核记录,更改报销单状态为打回 3. 收支管理-查看支出 (1) 到这里,对于查看收支功能实现应该是不陌生了,重点就是查询收支的sql,请问这个sql怎么编写呢? String sql = "select item.type,sum(item.amount)" +" from payment pm" +" join expense exp" +" on pm.expid=exp.expid" +" join expenseitem item" +" on exp.expid=item.expid" +" where 1=1" +" group by item.type" +" order by item.type"; 4. 收支管理-使用饼图显示支出 (1) 如何使用Echarts完成饼图展示? $(function(e) { $(".select1").uedSelect({ width : 200 }); }); $(function(){ changePie(0); }); function changePie(val){ $.ajax({ url:"inout?method=getPieData", type:"POST", data:{type:val}, dataType:"text", success:function(data){ eval("var arr="+data); var myChart = echarts.init(document.getElementById('main')); var option = { title : { text: '拼饭平台支出统计', subtext: '报销统计', x:'center' }, tooltip : { trigger: 'item', formatter: "{a} }, legend: { orient: 'vertical', left: 'left', data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] }, series : [ { name: '访问来源', type: 'pie', radius : '55%',oa联盟 center: ['50%', '60%'], data:arr, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); } }); } (2) 如何将后台查出来的集合转换成为json字符串? //调用DAO层获取支出数据(List) PaymentDao paymentDao = new PaymentDaoImpl(); List //将list转换为jsonStr StringBuilder jsonStr = new StringBuilder("["); for (int i = 0; i < list.size(); i++) { Object[] arr = list.get(i); jsonStr.append("{"); jsonStr.append("\"value\":"+arr[1]+","); jsonStr.append("\"name\":\""+arr[0]+"\""); if (i jsonStr.append("},"); }else { jsonStr.append("}"); } } jsonStr.append("]"); //返回jsonStr return jsonStr.toString(); 5. 收支管理-使用饼图显示指定时间段的支出 (1) 如何在代码中加入逻辑:显示指定时间段的支出。 if (type==1) { sql.append(" and to_char(paytime,'YYYY-MM-DD HH:MI:SS')>'"+DateUtil.getNowMonthBeginTime()+"'"); }else if(type==2){ sql.append(" and to_char(paytime,'YYYY-MM-DD HH:MI:SS')<='"+DateUtil.getNowYearEndTime()+"'"); sql.append(" and to_char(paytime,'YYYY-MM-DD HH:MI:SS')>'"+DateUtil.getNowYearBeginTime()+"'"); }else if(type==3){ sql.append(" and to_char(paytime,'YYYY-MM-DD HH:MI:SS')<='"+DateUtil.getLastYearEndTime()+"'"); sql.append(" and to_char(paytime,'YYYY-MM-DD HH:MI:SS')>'"+DateUtil.getLastYearBeginTime()+"'"); } 1. sxtoa项目总结 (1) 项目中大量应用到请求转发和重定向,再次简述请求转发和重定向的区别。 请求转发:一次请求,浏览器地址不跳转,用req.getParameter()来获取相关的请求数据。 重定向:是服务器反馈给浏览器让其访问其他的网页。浏览器地址栏会变。是两次不同的请求。 (2) 简述MVC分层模式,并简述一下分层开发的优点。 Model,它负责业务领域状态的知识;View,负责业务领域的表示视图;Controller,负责控制用户输入的流和状态。 1、开发人员可以只关注整个结构中的其中某一层; 2、可以很容易的用新的实现来替换原有层次的实现; 3、可以降低层与层之间的依赖; 4、有利于标准化; 5、利于各层逻辑的复用。 (3) 总结JSP的四个作用域。 作用域是指变量使用的有效范围。这个周期可以是当前页面的执行时间,或是一次请求从创建到消亡的这段时间。 pageContext:当前页面作用域 pageContext相当于Java中的this,它代表着当前页面作用域。在这个作用域中存放的属性值,只能在当前页面中取出。 request:从请求创建到请求消亡这段时间 浏览器从发起请求开始,到服务器处理完成,返回响应的这段时间。request作用域可以跨越多个页面 。 另外,还可以使用 session:一段客户端和服务器持续连接的时间 当客户端浏览器第一次向服务器发出请求,服务器会为这个客户端分配一定的内存空间,这个客户端能在其中存取数据,任何客户端都不能操作其他客户端的内存空间中的数据,这块内存空间就称为session,它也是JSP的九大内置对象之一。 存放于session中的对象,将属于session作用域,或者叫会话作用域 application:服务器开始到服务器关闭为止 当服务器开启时,会创建一个公共内存区域,任何客户端都可以在这个公共内存区域存取值,这个公共内存区域,就称为application,它也是JSP的九大内置对象之一 (4) 简述 ajax异步请求的步骤 ajax异步访问,局部刷新,提高用户体验。 异步请求的步骤一般有四步: 1. 创建ajax异步对象 2. 绑定监听事件 3. 打开连接(创建请求) 4. 发送请求 (5) 概述我们在项目中用到过哪些插件? echarts制作图表 富文本编辑器KindEditor 文件导出XLS 日历插件 My97DatePicker (6) 项目整个做下来,最直观的感受是什么? 面对业务逻辑复杂的需求,应该先将业务层的逻辑框架写清楚再着手写具体的业务代码,否则一旦大方向错误,后期很难改回来。 当多个操作需要保持一致时,最好将数据库的事务提交设为手动提交。在业务层处理完相关联的业务后再提交事务,关闭数据库连接。为保证是同一个连接,应该将唯一连接对象存放在threadLocal中,每次都去threadLocal中获取connection对象。 (7) 在做项目中经常伴随着各种各样的错误,对于程序出错,你有哪些收获? 根据异常的表现和控制台的错误信息大概判断出错的位置,然后在该位置添加断点进行逐行代码的测试,发现错误代码并改正。 2. 分页意义和实现思路 (1) 为什么需要分页?分页跟增删改查中的哪个操作有关系? 数据量大,一页容不下;后台查询部分数据而不是全部数据;降低带宽使用,提高访问速度。 与查询操作有关。 (2) 简述分页的实现思路 MVC四个层次都需要参与分页操作。 3. 理解PageBean (1) PageBean中有哪些属性?作用是什么? 每页几条记录size 可以有默认值5 当前页号index 可以有默认值1 记录总数totalCount:每页默认值,需查询数据库获取真正记录总数。 一共多少页:totalPageCount=totalCount/size+1 上一页: index-1 当前页1,上一页1 下一页:index+1 当前页是最后一页 下一页:还是最后一页 4. 基本分页的后台操作 (1) 基本分页的后台操作控制层如何处理,业务层如何处理,数据访问层如何处理? 控制层: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收从页面传入的页面index String sindex = request.getParameter("index"); int index=1; try { index = Integer.parseInt(sindex); } catch (Exception e) { e.printStackTrace(); } //2 PageBean pageBean.setIndex(index); StudentService stuService = new StudentServiceImpl(); // List stuService.findStu(pageBean); request.setAttribute("pageBean",pageBean);//!!!!!!! //3com.bjsxt request.getRequestDispatcher("/jsp/showAll.jsp").forward(request, response); } 业务层: public void findStu(PageBean //查询数据库表,获取记录总数 int totalCount = this.stuDao.findAll().size(); //使用记录总数计算pageBean中的其他属性 totalPageCount numbers pageBean.setTotalCount(totalCount); //调用DAO层,获取指定页的学生数据,并放入指定的pageBean的list属性中。 /** * 每页5条记录 * * 第几页 起始记录号 结束记录号 * 1 0 4 * 2 5 9 * 3 10 14 */ // int start = (pageBean.getIndex()-1)*pageBean.getSize(); // int end = pageBean.getIndex()*pageBean.getSize(); int start = pageBean.getStartRow(); int end =pageBean.getEndRow(); List pageBean.setList(list); } 数据层: public List Connection conn =DBUtil.getConnection(); Statement stmt =null; ResultSet rs =null; List try { stmt =conn.createStatement(); String sql="select * from (select rownum rn,stu2.* " +" from (select stu.* from student stu order by score desc) stu2" +" where rownum<="+end+")" +" where rn> "+start; rs = stmt.executeQuery(sql); while(rs.next()){ Student stu = new Student(); stu.setId(rs.getInt("id")); stu.setName(rs.getString("name")); stu.setAge(rs.getInt("age")); stu.setScore(rs.getDouble("score")); stuList.add(stu);oa联盟 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.closeAll(rs, stmt, conn); } return stuList; } 5. 基本分页的前台操作 (1) 基本分页的前台操作,如何处理?贴出代码,并解释代码的含义 上一页 [${num }] 下一页 每页 条记录 直接跳到第 页 共${pageBean.totalCount }条记录 6. 基本分页的完善 (1) 本节课完善了分页的那些功能?是如何实现的,贴出前端代码,后端代码,并写出注释 StudentServiceImpl中的findStu方法中对获取记录总数的方法做了优化 int totalCount = this.stuDao.findCount(); StudentDaoImpl中实现查询所有记录的总数,利用count(*)提高效率 public int findCount() { Connection conn =DBUtil.getConnection(); Statement stmt =null; ResultSet rs =null; int count=0; try { stmt =conn.createStatement(); rs = stmt.executeQuery("select count(*) from student"); rs.next(); count=rs.getInt(1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.closeAll(rs, stmt, conn); } return count; } 改变每页显示的记录数: jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
{b} : {c} ({d}%)"
function changeIndex(index){
location.href="servlet/ShowAllServlet?index="+index;
}
function changeSize(size){
location.href="servlet/ShowAllServlet?size="+size;
}
function change(index,size){
location.href="servlet/ShowAllServlet?index="+index+"&size="+size;
}
学生 编号 | 学生姓名 | 学生年龄 | 学生成绩 | vs.index | 更新操作 | 删除操作 | ||||
---|---|---|---|---|---|---|---|---|---|---|
${stu.id } | ${stu.name } | ${stu.age } | ${stu.score } | ${vs.index } | 更新 | 删除 | ||||
上一页
[${num }]
下一页
每页
条记录 直接跳到第
页 共${pageBean.totalCount }条记录
|
Servlet中
//接收从页面传入的每页记录数
String ssize = request.getParameter("size");
int size=5;
try {
size = Integer.parseInt(ssize);
} catch (Exception e) {
e.printStackTrace();
}
pageBean.setSize(size);
7. 带查询条件的分页
(1) 带查询条件的分页跟不带查询条件的分页有什么区别?
带查询条件的分页需要先将符合条件的数据查询出来再做分页处理。需要传参数来设置查询的条件。
(2) 贴出带查询条件分页的前端代码,后端代码,并写出注释
Dao层
public int findCount(String name, double minScore) {
Connection conn =DBUtil.getConnection();
Statement stmt =null;
ResultSet rs =null;
int count=0;
try {
StringBuilder sql = new StringBuilder("select count(*) from student where 1=1 ");
if (name!=null&&!"".equals(name)) {
sql.append(" and name like '%"+name+"%'");
}
if (minScore>0) {
sql.append(" and score>="+minScore);
}
stmt =conn.createStatement();
rs = stmt.executeQuery(sql.toString());
rs.next();
count=rs.getInt(1);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.closeAll(rs, stmt, conn);
}
return count;
}
public List
double minScore) {
Connection conn =DBUtil.getConnection();
Statement stmt =null;
ResultSet rs =null;
List
try {
stmt =conn.createStatement();
StringBuilder sql = new StringBuilder("select stu.* from student stu where 1=1");
if (name!=null&&!"".equals(name)) {
sql.append(" and name like '%"+name+"%'");
}
if (minScore>0) {
sql.append(" and score>="+minScore);
}
sql.append("order by score desc");
String sql2="select * from (select rownum rn,stu2.* "
+" from ("+sql+") stu2"
+" where rownum<="+end+")"
+" where rn> "+start;
rs = stmt.executeQuery(sql2);
while(rs.next()){
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
stu.setScore(rs.getDouble("score"));
stuList.add(stu);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.closeAll(rs, stmt, conn);
}
return stuList;
}
JSP页面
ATTEN:张经理
phone:13696432490
QQ:9618195
ADD:重庆市渝北区栖霞路18号金贸时代7-24