Home
>
宁夏oa协同办公平台
>
宁夏oa联盟
宁夏oa联盟

time:2020-08-20 10:04:02

author:重庆佰鼎科技有限公司

【Font size: big medium smail

本文由重庆佰鼎科技有限公司提供,重点介绍了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完成饼图展示?

(2) 如何将后台查出来的集合转换成为json字符串?

//调用DAO层获取支出数据(List)

PaymentDao paymentDao = new PaymentDaoImpl();

List list = paymentDao.findStaticsData(type);

//将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作用域可以跨越多个页面 。

另外,还可以使用两个方法转向或包含另一个页面, 这个时候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 = new PageBean();

pageBean.setIndex(index);

StudentService stuService = new StudentServiceImpl();

// List stuList =stuBiz.findAll();

stuService.findStu(pageBean);

request.setAttribute("pageBean",pageBean);//!!!!!!!

//3com.bjsxt

request.getRequestDispatcher("/jsp/showAll.jsp").forward(request, response);

}

业务层:

public void findStu(PageBean 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 list = this.stuDao.findStu(start,end);

pageBean.setList(list);

}

数据层:

public List findStu(int start, int end) {

Connection conn =DBUtil.getConnection();

Statement stmt =null;

ResultSet rs =null;

List stuList = new ArrayList();

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 }]

${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+"/";

%>

查询并显示所有学生信息

学生 编号学生姓名学生年龄学生成绩vs.index更新操作删除操作
${stu.id }${stu.name }${stu.age }${stu.score }${vs.index }更新删除

首页

上一页

上一页

[${num }]

${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 findStu(int start, int end, String name,

double minScore) {

Connection conn =DBUtil.getConnection();

Statement stmt =null;

ResultSet rs =null;

List stuList = new ArrayList();

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页面

姓名

分数>=

Reprint please indicate:http://oybw.cnsoftweb.com/OA-4477.html