2020冬课程设计实验报告
一.实验项目名称
实验项目名称:.团队调度系统
二.需求分析:
创建一个系统存储所有员工信息,普通成员可以查看所有员工部分信息;管理员可以查看所有员工的所有信息、修改、删除、新增员工信息;现在需要从员工表中挑选一部分人组建一个开发团队,团队中只能有一个产品经理,管理员拥有对该团队的最高权限;普通成员对该团队没有权限。
三.实验项目功能描述
1.员工权限:
a.查看所有员工部分信息列表
2.管理员权限:
a.查看所有员工部分信息列表
b.查看员工详细信息
c.修改员工信息
d.删除员工
e.新增员工信息
f.查看团队信息列表
g.删除团队成员
h.新增团队成员
四.详细功能描述
1.显示员工部分信息列表:分页显示,sql语句实现。列表中只显示员工的编号、姓名、年龄、性别、职位。
2.查看员工详细信息、修改员工信息和删除员工:这三个功能在同一个页面实现,该页面显示某一个员工的所有信息,包括所用设备和是否加入团队。用XML和javaScript实现,让<input>标签既可以显示员工信息,也可以直接修改。
3.新增员工信息:用xml、JavaScript和正则表达式验证输入框中的输入是否正确,并提示。除离职日期可以不填以外,其它信息都必须填写。
4.删除团队成员:在员工详细页面,显示该员工是否加入了团队,若加入了团队,显示该员工在团队中的所有信息。并可以在该页面删除该团队成员。
5.新增员工信息:在员工详细页面,若该员工没有加入团队,选择好该员工在团队中担任的职位以后,可以将该员工加入团队,用JavaScript、session和EL判断该团队中是否有已有产品经理,若有,则不能再加入一个产品经理,若没有,则能加入产品经理。
五.项目模块结构介绍:
六.实现界面展示:
管理员登录界面
员工列表
员工详情页面
新增员工界面
团队列表
七.代码托管链接:
https://gitee.com/liuwei990714
八.所用技术:
html、JavaScript、css、jsp、javabean、servlet、EL、Tomcat数据源、jsp标签编程、jsp标准标签库、三层设计模式
九.实验总结
1.遇到的问题及解决办法:
1.因为RsoultSet rs=...是通过Statement/PraparedStatement stmt=....获取的,而Statement/PraparedStatemen又是通过Connection cno.get...,所以在使用完rs之前不能关闭stmt端口,在使用完stmt之前不能关闭cno端口,否则在使用rs的时候会报RsoultSet已关闭的错误。
2.要判断rs里是否有数据,不能用if(rs!=null)...的方法来判断,这样是错误的;要用if(rs.next())....的方式来判断,若有数据则rs.next()返回true,否则返回false。
3.idea启动tomcat时乱码:
第一步:file - settings - 搜File Encodings,改为utf-8。
第二步:打开idea工作目录(D:IntelliJ IDEA 2019.3.3in),在idea64.exe.vmoptions和idea.exe.vmoptions最后追加-Dfile.encoding=UTF-8(注意:也有可能是c盘下的C:Users26874.IntelliJIdea2019.3config配置下还有一个idea64.exe.vmoptions文件,idea是以这个配置为准的,你idea安装目录下的改了没用,被这个覆盖了,所以起不了作用)。
第三步:配置tomcat的页面中:VM option设置:-Dfile.encoding=UTF-8。
第三步:若此时System.out.println(“”);输出中文是乱码:
a、打开到Tomcat安装目录下的conf/文件夹 修改logging.properties文件 b、找到 java.util.logging.ConsoleHandler.encoding = GBK 3、更改为 java.util.logging.ConsoleHandler.encoding = UTF-8。
借鉴的网页
4.问题:oracle多张表可以都用一个序列吗?
解答:序列和表一样都是一个对象。用的时候只是从序列中取出当前的序列值,放到表中的某一列的记录中去。
如果为了唯一性上来说。只要程序控制好了,多个表用一个序列也不会重复。但是这样会导致序列的值1,2,3,4,。。。n,是分散在所有你用的表中的,而不是每个表都从1开始到n;比如一个表时从1到3,那么另一表就是从4到n,反正是几个表的下标合起来是才从1到n。
序列和表是独立的关系。
建议一张表的一个主键对应一个序列
5.java.util.date和java.sql.date比有什么区别?
java.util.Date表示特定的瞬间,精确bai到毫秒。java.sql.Date 是 java.util.Date的子类;java.util.Date可以用于日期计算等。java.sql.Date主要运用在与数据库的日期类型交互上,通过它的包名可以看出来。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。
6.一个jsp文件中引入了一个css文件,而且该css文件引入的图片作为背景图片:
1.如果直接通过地址重写 或通过servlet的重定向 访问该jsp页面,那么该css文件的引入地址为 相对该jsp文件的地址。
如:
2.如果通过servle文件的请求转发 访问该jsp文件,那该css文件的引入地址为 相对该servlet文件的地址。
如:
3.不管是通过哪种方式访问该jsp,引入的css文件中的图片地址都是相对于该css文件的地址。
如:background: url("../img/bg.jpg");
注意:如果直接在jsp文件中引入照片,则该照片的地址只能写相对于该jsp文件的地址,如:background: url("../img/bg.jpg"); 不然会报错。也就是说,如果通过servlet请求转发访问该jsp文件,不能读取到该图片,背景图片设置无效。只能通过重定向或者地址重写直接访问。
原因:因为请求转发是一次请求,地址栏是不会改变的,当servlet文件请求转发到jsp文件,然后jsp文件去访问css文件,也就相当于servlet去访问该css文件,所以该css文件引入地址要写相对于该servlet文件的地址,不然servlet文件找不到该css文件。
而重定向相当于两次请求,地址栏改变了,当重定向到jsp页面时,也就相当于地址重写直接访问该jsp文件,所以该css文件引入地址要写相对于该jsp文件的地址。
6.问题:
servlet通过请求转发到jsp页面时,jsp页面的js代码的window.onload=function (){}这个方法会失效;可以通过和function load(){}方法解决。
7.js中“使用”el表达式:
2.总结:
这次是我第一次做的一个比较大的项目,基本上把我现阶段所学的java web的所有的知识点都用上了,虽然用的都不是很深,但都有用到;这次项目我在前端界面上花的时间比较多,所以在界面细节上实现的也比较好,主要是JavaScript和css在运行时不会报错,出现错误时,只能自己一步一步的去试,然后找到错误的位置,分析错误的原因,然后改正,在找到错误的位置上花费的时间比较大;所以原先想好的很多功能后来都没时间实现了,感觉有点像捡了芝麻,丢了西瓜。
以后做项目时,要先把要实现的功能的基本框架都做出来,然后去慢慢优化界面,改善代码。不能每做完一个功能就去优化,等这个功能优化完了,别人项目的所有功能都已经基本可以实现了;而且当后面的功能和先前实现的功能有联系时,那先前所做的优化可能又要改变。改来该去,既费时间,有费精力,而且错误会越改越多。