1、 大型软件项目实训报告 教学单位 软件学院 专 业 软件工程 班 级 学生姓名 学 号 指导教师 一、实训目的 1、增强自己的专业水平 2、积累大型项目的开发经验 3、学习不同的面试技巧 4、培养职场道德及行为规范 5、通过培训寻找一份适合自己的工作 二、实训时间和地点 1实训时间:2013 年 11 月 29 月2014 年 3 月 29 日 2实训地点:达内(沈阳)盛京中心 三、实训单位简介 达内,全称达内时代科技集团有限公司,是中国高端 IT 培训的领先品牌,致力于培养面向电信何金融领域的 java、c+、c#/.Net、软件测试、嵌入式、PHP、android等方面的中高端软件人才,由
2、美国国际数据集团、集富亚洲和高盛集团共同投资,是国内首家获得国际风险投资的 IT 培训机构。经过 10 多年的运营,达内科技实现了 90%的专业就业率,78%的口碑就业率,学员毕业首月平均工资 3800 元。2002年起,达内软件技术有限公司已经发展成为集培训、咨询、开发、人才服务于一体的高新科技集团公司 达内时代科技集团有限公司以中关村科技园区为依托,在中国软件发达城市北京、上海、珠海、重庆、广州、深圳、哈尔滨、南京武汉、杭州、西安、苏州、沈阳、大连等城市建立了近 100 家培训中心,年培训 1.2 万多名软件人才,累计为IBM、微软、华为、中软、用友、阿里巴巴、新浪、搜狐、百度、联想、大唐
3、电信、亚信等知名 IT 企业输送了 12 万多名中高级软件人才,全国拥有 3000 多名员工,合作企业达 3 万多家,是中国领先的中高端软件人才培训机构 四、实训内容 1实训期间完成的学习任务实训期间完成的学习任务 本次实训中主要学习了 java 基础,javase,javaee,oracle,jdbc,html/css/js、jsp、servlet 等目前正在使用且流行的编程技术。实训是通过远程视频教学进行的。讲师首先讲解一些基础知识,随后通过项目实战的方式,教授我们如何运用这些知识,如何编写一个好的程序。在整个实训过程中我们先后完成了俄罗斯方块,坦克大战、即时聊天、数据库连接、员工信息管理
4、等实际项目,在开发中,了解了程序开发的具体过程,及基础知识在实际中如何应用。每当遇到程序出现异常,项目经理组织我们集体讨论并寻找问题所在,培养了我们的团队合作能力。在每个月的月末,我们还会进行模拟企业面试中的笔试,通过笔试发现自己的缺陷及不足。2实训期间完成的实践项目实训期间完成的实践项目 在长达 3 个多月的培训中,我们完成了多个项目,其中包括使用 java 基础语言及 javaAWT 控件编写的俄罗斯方块,使用 socket 编程完成的简化即时聊天系统,以及使用 java 企业级开发思想及 MVC 结构思想编写的员工表管理系统等等。因为很多技术目前已经过时,在未来程序开发中不会被继续使用,
5、所以在本报告中将详细介绍员工管理系统。2.1 需求分析 1、用户打开网页之后将显示目前已有员工的各项信息 2、用户可以进行添加员工操作,添加员工后需要直接显示新的员工信息表 3、用户可以进行员工删除操作,但是在修改之前需要进行确认 4、用户可以进行员工信息修改操作 2.2 总体设计 1、在数据库中新建员工信息表 2、使用 PhotoShop 及 css 技术设计网页显示的样式 3、编写后台控制 java 程序,用于连接数据库和控制前端操作 4、编写 jsp 页面用于显示在用户不同的操作下,应该显示的页面 5、项目调试 2.3 详细设计 1:新建员工信息表 因为在本项目中使用的数据库为 mysq
6、l 数据库,所以在创建数据表时应注意变量类型与 oracla 数据库的区别。另外必须处理数据库中出现的中文问题 建立员工信息表 create database servletemp default character set utf8;(这段代码用于设置数据库的字符集,字符集为 utf-8,该字符集支持中文,如果不设置字符集数据库会默认采用ISO-8859-1 字符集,但是该字符集不支持中文)create table emp_a(id int(10)primary key auto_increment,name varchar(20),salary double,age int );其中 id
7、 为主键,且设置为自动增长,所以在执行插入操作时不用设置 id 的值,这样便于程序运行及员工表管理 为了便于程序调试,先向表中添加几条数据 Insert into emp_a(name,salary,age)value(emp01,20000,20);Insert into emp_a(name,salary,age)value(emp02,20000,21);Insert into emp_a(name,salary,age)value(emp03,20000,22);Insert into emp_a(name,salary,age)value(emp04,20000,23);2:设计页面
8、显示样式即美工操作 网页显示样式 1:css 编写 body margin:0;font-size:62.5%;font-family:Verdana,Arial,Helvetica,sans-serif;padding:15px 0;background:#eeeeee;#wrap width:820px;margin:0 auto;background:url(./img/bg.gif)top center repeat-y#FFFFFF;#top_content padding:0 10px;#topheader padding:25px 15px 15px 15px;margin:0
9、auto 0 auto;background:url(./img/top_left.gif)top left repeat-x#85C329;#rightheader float:right;width:375px;height:40px;color:#FFFFFF;text-align:right;#rightheader p padding:35px 15px 0 0;margin:0;text-align:right;#rightheader p span font-weight:bold;#rightheader a:link,#rightheader a:visited color:
10、#FFFFFF;text-decoration:underline;#title padding:0;margin:0;font-size:2.5em;color:#FFFFFF;#title span font-size:0.5em;font-style:italic;#title a:link,#title a:visited color:#FFFFFF;text-decoration:none;#title a:hover color:#E1F3C7;#navigation background:#74A8F5;border-top:1px solid#ffffff;height:25p
11、x;clear:both#navigation ul padding:0;margin:0;list-style:none;font-size:1.1em;height:25px;#navigation ul li display:inline;#navigation ul li a color:#FFFFFF;display:block;text-decoration:none;float:left;line-height:25px;padding:0 16px;border-right:1px solid#ffffff;#navigation ul li a:hover backgroun
12、d:#5494F3;#content padding:0 15px;margin:0 auto 0 auto;background:url(./img/content_bg.gif)repeat-x left top#ffffff;color:#666666;#content p#whereami padding:20px 0 15px 0;margin:0;#whereami a:link,#whereami a:visited color:#73A822;text-decoration:underline;#content h1,#content h2,#content h3,#conte
13、nt h4,#content h5 color:#74A8F5;#content h1 font-family:Trebuchet MS,Arial,Helvetica;padding:0;margin:0 0 15px 0;font-size:2em;#content h2 font-family:Trebuchet MS,Arial,Helvetica;padding:0;margin:0 0 15px 0;font-size:1.5em;#top_body,#content_body padding:0 25px;#footer background:url(./img/footer.g
14、if)no-repeat center bottom;color:#FFFFFF;padding:0 10px 13px 10px;#footer p padding:0;margin:0;#footer p a:link,#footer p a:visited color:#FFFFFF;font-style:italic;text-decoration:none;#footer#footer_bg background:url(./img/footer_bg.gif)repeat-x left bottom#85C329;padding:15px 15px 25px 15px;border
15、-top:1px solid#7BB425;#footer#design display:block;width:150px;height:30px;float:right;line-height:20px;padding:0 5px;text-align:right;color:#E1F3C7;#footer#design a color:#FFFFFF;text-decoration:underline;.table margin-bottom:15px;width:100%;border-collapse:collapse;.table_header td background:url(
16、./img/tableheader-bg.gif)no-repeat left top;padding:5px 10px;color:rgb(70,122,167);border-top:1px solid#CBD6DE;border-bottom:1px solid#ADBECB;font-size:1.1em;font-weight:bold;.table_header td a:link,.table_header td a:visited text-decoration:underline;color:rgb(70,122,167);.table_header td a:hover t
17、ext-decoration:underline;color:#73A822;.table_header td border:1px solid#CBD6DE;.row1 td,.row2 td,.row_hover td,.paging_row td padding:5px 10px;color:#666666;border:1px solid#CBD6DE;.row1 td background:#ffffff;.row2 td background:#eeeeee;.row_hover td background:#FBFACE;color:#000000;.hidden display
18、:none;.little font-size:10px;.clear clear:both;.img_left float:left;padding:1px;border:1px solid#cccccc;margin:0 10px 10px 0;width:110px;height:150px;/*#content ul basic style for unordered lists-*/#content ul font-size:1.1em;line-height:1.8em;margin:0 0 15px 0;padding:0;list-style-type:none;/*#cont
19、ent p paragraphs-*/#content p font-size:1.2em;margin:0;padding:0 0 15px 0;/*#content p a links in paragraphs-*/#content p a:link,#content p a:visited,.table a:link,.table a:visited,.link a color:#73A822;text-decoration:none;#content p a:hover,.table a:hover,.link a:hover text-decoration:underline;/*
20、#content ul.green(73A822)-*/#content ul.green li padding:0 0 0 20px;margin:0;background:url(./img/bullet_green.gif)no-repeat 1px 3px;font-size:1.1em;#content ul.green li a:link,#content ul.green li a:visited color:#73A822;text-decoration:none;#content ul.green li a:hover color:#73A822;text-decoratio
21、n:underline;/*#content ul.black(73A822)-*/#content ul.black li padding:0 0 0 20px;margin:0;background:url(./img/bullet_grey.gif)no-repeat 1px 3px;font-size:1.1em;#content ul.black li a:link,#content ul.black li a:visited color:#666666;text-decoration:none;#content ul.black li a:hover color:#999999;t
22、ext-decoration:underline;/*#content ol-*/#content ol padding:0 0 0 25px;margin:0 0 15px 0;line-height:1.8em;#content ol li font-size:1.1em;#content ol li a:link,#content ol li a:visited color:#73A822;text-decoration:none;#content ol li a:hover color:#73A822;text-decoration:underline;/*#content p.pag
23、ing -*/#content p.paging padding:5px;border:1px solid#CBD6DE;text-align:center;margin-bottom:15px;background:#eeeeee;/*.small_input smaller text in inputs/combos-*/.small_input font-size:10px;/*.form_table style for table used in forms-*/.form_table margin-bottom:15px;font-size:1.1em;.form_table p m
24、argin:0;padding:0;.form_table td padding:5px 10px;/*.checkbox_nomargins clear all margins from a checkbox-*/.checkbox_nomargins /*margin:0;width:13px;height:13px;overflow:hidden;font-size:10px;*/margin:0;padding:0;/*.button some buttons style-inspired from wordpress-*/input.button margin:0;padding:2
25、px;border:3px double#999999;border-left-color:#ccc;border-top-color:#ccc;background:url(./img/button.gif)repeat-x left top;font-size:11px;font-family:Verdana,Arial,Helvetica,sans-serif;/*form style for forms-*/form padding:0;margin:0;/*input.inputgri-some style for inputs-*/input.inputgri,select.inp
26、utgri,textarea.inputgri background:#eeeeee;font-size:14px;border:1px solid#cccccc;padding:3px;input.inputgri:focus,select.inputgri:focus,textarea.inputgri:focus background:#ffffff;border:1px solid#686868;/*.notice-messages to user-*/.notice background:#CAEA99;border:1px solid#70A522;padding:15px 15p
27、x 15px 15px;margin-bottom:15px;font-size:1.2em;color:#333333;.notice_error background:#FEDCDA;border:1px solid#CE090E;padding:15px 15px 15px 15px;margin-bottom:15px;font-size:1.2em;color:#333333;#notice a color:#333333;text-decoration:underline;/*Other links -*/.other_links background:#eeeeee;border
28、-top:1px solid#cccccc;padding:5px;margin:0 0 15px 0;#content.other_links h2 color:#999999;padding:0 0 0 3px;margin:0;#content.other_links ul padding:0;margin:0;#content.other_links ul li padding:0 0 0 20px;background:url(./img/bullet_grey.gif)no-repeat left center;#content.other_links a,#content.oth
29、er_links a:visited color:#999999;text-decoration:underline;#content.other_links a:hover color:#666666;/*code*/code font-size:1.2em;color:#73A822;网页显示样式 2:最终网页样式(图片)图 1 图 2 因为 css 样式设计属于美工的任务,这里不做过多解释及叙述 3:设计静态网页及编写后台 java 控制程序 作为整个 web 项目的核心,java 后台控制程序负责连接数据库,针对用户的操作对员工表进行增删改操作,控制前端页面跳转。这里使用网络应用程序架
30、构中的三层 c/s,三层 c/s 结构开发效率很高,可移植性好,适合大型企业级开发,是目前非常流行的开发模式。三层 c/s 结构特点是:应用服务器负责所有的业务运算,客户端只提供操作界面,数据库负责所有数据的管理 3.1 创建 util 包,并在 util 包下创建 DBUtil 类 该类负责提供连接数据库的方法,及关闭数据库链接的方法,以下是具体程序内容:(注意以下为静态方法,也就是不需要创建对象直接使用类名就可以直接调用)package util;import java.sql.Connection;import java.sql.DriverManager;import java.sql
31、.SQLException;public class DBUtil public static Connection getConnection()throws Exception Connection conn=null;try Class.forName(com.mysql.jdbc.Driver);conn=DriverManager .getConnection(jdbc:mysql:/localhost:3306/jsd1310db+?useUnicode=true&characterEncoding=utf8,root,1234);catch(Exception e)e.print
32、StackTrace();throw e;return conn;public static void close(Connection conn)if(conn!=null)try conn.close();catch(SQLException e)public static void main(String args)throws Exception System.out.println(getConnection();3.2 创建 entity 包,并在该包下创建 Employee 实体类 为了开发方便 Employee 实体类严格参照 emp_a 表创建,变量名及变量类型要与表中的字段
33、名及字段类型保持一致,并将实例变量私有化。在实体类中添加 get()和 set()方法,用来获取和设置变量值,并重写 toString()方法 package entity;public class Employee private int id;private String name;private double salary;private int age;public String toString()return name+salary+age;public int getAge()return age;public void setAge(int age)this.age=age;p
34、ublic int getId()return id;public void setId(int id)this.id=id;public String getName()return name;public void setName(String name)this.name=name;public double getSalary()return salary;public void setSalary(double salary)this.salary=salary;3.3 创建 dao 包并在包中创建 EmployeeDAO 类 该类负责封装针对数据表的增删改操作 package da
35、o;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import util.DBUtil;import entity.Employee;public class EmployeeDAO public void update(Employee e)throws Exception Connection conn=null;PreparedStatement prep=null
36、;try conn=DBUtil.getConnection();prep=conn.prepareStatement(update t_emp set name=?,salary=?,age=?+where id=?);prep.setString(1,e.getName();prep.setDouble(2,e.getSalary();prep.setInt(3,e.getAge();prep.setInt(4,e.getId();prep.executeUpdate();catch(Exception e1)e1.printStackTrace();throw e1;finally DB
37、Util.close(conn);public Employee findById(int id)throws Exception Employee e=null;Connection conn=null;PreparedStatement stat=null;ResultSet rst=null;try conn=DBUtil.getConnection();stat=conn.prepareStatement(select*from t_emp where id=?);stat.setInt(1,id);rst=stat.executeQuery();if(rst.next()String
38、 name=rst.getString(name);double salary=rst.getDouble(salary);int age=rst.getInt(age);e=new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);catch(Exception e1)e1.printStackTrace();throw e1;finally DBUtil.close(conn);return e;public void delete(int id)throws Exception Connect
39、ion conn=null;PreparedStatement prep=null;try conn=DBUtil.getConnection();prep=conn.prepareStatement(delete from t_emp where id=?);prep.setInt(1,id);prep.executeUpdate();catch(Exception e)e.printStackTrace();throw e;finally DBUtil.close(conn);public void save(Employee e)throws Exception Connection c
40、onn=null;PreparedStatement prep=null;try conn=DBUtil.getConnection();prep=conn.prepareStatement(insert into t_emp(name,salary,age)+values(?,?,?);prep.setString(1,e.getName();prep.setDouble(2,e.getSalary();prep.setInt(3,e.getAge();prep.executeUpdate();catch(Exception e1)e1.printStackTrace();throw e1;
41、finally DBUtil.close(conn);public List findAll()throws Exception List employees=new ArrayList();Connection conn=null;PreparedStatement stat=null;ResultSet rst=null;try conn=DBUtil.getConnection();stat=conn.prepareStatement(select*from t_emp);rst=stat.executeQuery();while(rst.next()int id=rst.getInt(
42、id);String name=rst.getString(name);double salary=rst.getDouble(salary);int age=rst.getInt(age);Employee e=new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);employees.add(e);catch(Exception e)e.printStackTrace();throw e;finally DBUtil.close(conn);return employees;3.4 创建 we
43、b 包,并在该包下创建 ActionServlet 类 该类负责用户的前端操作,根据用户发送的不同请求调用相应的方法对数据库进行相应打的增删改操作,并根据请求的 url 跳转等到不同的 jsp 页面。特别需要注意的是应该针对程序中出现的异常进行捕获,并且需要有相应的输出 核心实现过程:1、绑定数据到 request 对象上:request.setAttribute(String name,Object obj);2、获得转发器:RequestDispatcher rd=request.getRequestDispatcher(String url);3、转发:rd.forward(reques
44、t,response);转发的特点:转发之后浏览器地址栏的地址不变 转发的地址必须是同一个应用内部的地址 具体程序:package web;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRe
45、quest;import javax.servlet.http.HttpServletResponse;import dao.EmployeeDAO;import entity.Employee;public class ActionServlet extends HttpServlet public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException request.setCharacterEncoding(utf-8);respons
46、e.setContentType(text/html;charset=utf-8);PrintWriter out=response.getWriter();String uri=request.getRequestURI();String action=uri.substring(uri.lastIndexOf(/),uri.lastIndexOf(.);if(action.equals(/list)EmployeeDAO dao=new EmployeeDAO();try List employees=dao.findAll();/使用转发 request.setAttribute(emp
47、loyees,employees);RequestDispatcher rd=request.getRequestDispatcher(empList2.jsp);rd.forward(request,response);catch(Exception e)e.printStackTrace();out.println(稍后重试);else if(action.equals(/add)String name=request.getParameter(name);String salary=request.getParameter(salary);String age=request.getPa
48、rameter(age);/参数检查.EmployeeDAO dao=new EmployeeDAO();Employee e=new Employee();e.setName(name);e.setSalary(Double.parseDouble(salary);e.setAge(Integer.parseInt(age);try dao.save(e);response.sendRedirect(list.do);catch(Exception e1)e1.printStackTrace();out.println(稍后重试);else if(action.equals(/del)int
49、 id=Integer.parseInt(request.getParameter(id);EmployeeDAO dao=new EmployeeDAO();try dao.delete(id);response.sendRedirect(list.do);catch(Exception e)e.printStackTrace();out.println(稍后重试);else if(action.equals(/load)int id=Integer.parseInt(request.getParameter(id);EmployeeDAO dao=new EmployeeDAO();try
50、 Employee e=dao.findById(id);request.setAttribute(e,e);request.getRequestDispatcher(updateEmp.jsp).forward(request,response);catch(Exception e)e.printStackTrace();out.println(稍后重试);else if(action.equals(/modify)int id=Integer.parseInt(request.getParameter(id);String name=request.getParameter(name);S