软件开发生产实习报告

软件开发生产实习报告
软件开发生产实习报告

软件开发生产实习报告

信息科学与工程学院

2015年7 月24 日

目录

软件开发生产 (1)

实习报告 (1)

软件开发生产实习报告 (1)

1.实习目的 (1)

2. 实习计划 (1)

3.实习过程 (2)

3.1 技术准备 (2)

3.2 项目实施 (2)

3.2.1 功能需求 (2)

3.2.2 总体设计 (2)

3.2.3 详细设计与编码 (5)

1.网页初始设计 (5)

2.数据库详细设计 (6)

3.页面展示 (8)

4.源代码 (10)

3.2.4 测试 (20)

1.测试用例详细说明 (20)

2.测试结果说明 (20)

4.总结与建议 (21)

软件开发生产实习报告

1.实习目的

1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本

素质和技术能力要求。

1.2重点培养学生的团队精神和协作意识,提高其口头和书面的沟通能力。

1.3使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决

问题的能力

1.4重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编

程习惯。

2. 实习计划

本次实习主要分两部分:

第一周由老师讲解本次实习项目的主要内容,包括Java,JSP,Servlet,Oracle数据库的基础知识。并由老师利用实例讲解相关技术的实践应用。

第二周根据老师讲解的基础知识以及实践应用完成一个学生信息的管理,包括信息的增删改查,以及使用JSP与Servlet技术对页面进行其他相关的实现。

本项目的全部内容均由本人完成。其中主要任务包括:

1)对学生信息进行建模,利用逻辑模型完成数据库的设计,保证学生

表的字段不少于20个,由于本次实习的主要内容是JavaWeb方向,

所以对数据库设计不做严格要求,只要满足JavaWeb的功能点需求

即可;

2)利用JSP和Servlet技术完成对数据表(学生表)的增删改查操作;

3)利用JSP和Servlet技术实现页面跳转之间的状态维持(如A页面

跳转到B页面,再由B页面返回到A页面时,A页面中仍然保留着客

户跳转到B页面之前输入的信息);

4)在删除功能点上实现“全选”的子功能点。

3.实习过程

3.1 技术准备

1)回顾Java语言的语法;

2)学习HTML5的相关知识,并能基本熟悉其用法;

3)学习JavaScript脚本语言,并能较熟练应用其完成对网页一定的操

作与控制;

4)学习JSP相关的技术(包括JSP,Servlet),同时了解EL表达式,

JSTL的相关知识与基本用法;

5)针对Oracle数据库,学习相关的SQL语句;

6)Oracle数据库的安装与配置,以及使用PLSQL Developer完成对

Oracle数据库的基本操作;

7)学习JDBC相关技术,并通过Java语言正确地连接Oracle数据库。

8)HTML,JSP,Java的编码规范。

3.2 项目实施

3.2.1 功能需求

1)实现对学生信息的无条件查询和条件查询(包括模糊查询);

2)实现对学生信息的录入;

3)实现对学生信息的修改;

4)实现对选定的记录进行删除(包括在页面中实现“全选”功能)

5)实现页面跳转之间的状态维持(如A页面跳转到B页面,再由B页

面返回到A页面时,A页面中仍然保留着客户跳转到B页面之前输入

的信息);

6)完成相应的操作给出相应的提示。

3.2.2 总体设计

该信息管理系统主要完成学生通讯录的管理,对学生信息能够进行增删

改查,并完成功能需求中的一些相关细节。系统的功能模块图如下图所示。

此外,网站的总体设计如下图所示:

网站总设计

该系统的主要目标是建立学生信息的增删改查四种基本操作,并对网页中的各种细节进行优化。主页面为查询页面,分为条件查询和非条件查询,并在查询到记录的基础上进行删除操作和修改操作,添加操作作为独立的一部分,系统总体设计的流程图如下图所示。

学生通讯录管理系统

添加学生信息修改学生信息查询学生信息

删除学生信息系统功能模块图

系统总体流程图

总体数据流图如下图所示。

系统总体数据流图

3.2.3 详细设计与编码

1.网页初始设计

其中A002.JSP与A003.JSP类似。

2.数据库详细设计

建表语句如下:

/*==============================================================* /

/* Table: STUDENT */ /*==============================================================* /

create table STUDENT (

AB001 NUMBER not null, AB002 NVARCHAR2(10) not null, AB003 NVARCHAR2(4) not null, AB004 NVARCHAR2(2) not null, AB005 NVARCHAR2(20) not null, AB006 NVARCHAR2(20) not null, AB007 NVARCHAR2(11) not null,

AB008 NVARCHAR2(50) not null,

AB009 DATE not null, AB010 NVARCHAR2(18) not null, AB011 NVARCHAR2(50) not null, AB012 NVARCHAR2(50) not null, AB013 NVARCHAR2(10) not null, AB014 NVARCHAR2(20) not null, AB015 NVARCHAR2(7) not null, AB016 NVARCHAR2(10) not null, AB017 NVARCHAR2(20),

AB018 NVARCHAR2(20),

AB019 NVARCHAR2(20),

AB020 NVARCHAR2(20),

AB021 NVARCHAR2(3) not null, AB022 NVARCHAR2(2) not null, constraint PK_STUDENT primary key (AB002)

);

3.页面展示

下图是无条件查询的结果(即查询全部记录)。

下图是条件查询的结果(其中四项均为模糊查询)。

下图是选定后进行删除的页面效果(请结合上图查询页面和下图选定记录将要删除的页面,观察“删除按钮的”状态变化)。

下图是修改页面(添加页面基本相同,不再列举)。

4.源代码

a.连接数据库

public class DBUtils

{

private static final String

driver="oracle.jdbc.driver.OracleDriver";

private static final String

url="jdbc:oracle:thin:@localhost:1521:orcl";

//静态块

static

{

try

{

Class.forName(driver);

}

catch(Exception e)

{

e.printStackTrace();

}

}

//建立与数据库连接

public static final Connection getConnection()throws Exception

{

return DriverManager.getConnection(url, "admin", "admin1234");

}

//关闭结果集

public static void close(ResultSet rs)

{

try

{

if(rs!=null)

{

rs.close();

}

}

catch (SQLException e)

{

e.printStackTrace();

}

}

//关闭SQL语句

public static void close(PreparedStatement pstm)

{

try

{

if(pstm!=null)

{

pstm.close();

}

}

catch (SQLException e)

{

e.printStackTrace();

}

}

//关闭与数据库的连接

public static void close(Connection conn)

{

try

{

if(conn!=null && !conn.isClosed())

{

conn.close();

}

}

catch (SQLException e)

{

e.printStackTrace();

}

}

}

b.从JSP页面获取数据

Tools类主要是作为一个工具类,其中的createDto()函数功能为从页面获取数据并交给Servlet进行处理(Dto表示数据传输对象)。

public class Tools

{

public static Map createDto (HttpServletRequest request)

{

Map dto = new HashMap();

Map temp =

request.getParameterMap();

Set> entrySet =

temp.entrySet();

String val[] = null;

for(Map.Entry entry:entrySet)

{

val = entry.getValue();

if(val.length == 1)

dto.put(entry.getKey(), val[0]);

else

dto.put(entry.getKey(), val);

}

return dto;

}

}

c.对数据库进行查询和更新

JdbcSupport为一个抽象类,由A001Service继承来完成具体的操作。在此类中query()为查询数据函数,update()为更新数据函数。

public abstract class JdbcSupport

{

protected final List> query(String sql,Object...val)throws Exception

{

Connection conn = null;

PreparedStatement pstm = null;

ResultSet rs = null;

try

{

conn = DBUtils.getConnection();

pstm = conn.prepareStatement(sql);

for(int i = 0; i < val.length; ++i)

{

pstm.setObject(i+1, val[i]);

rs = pstm.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

int cols = rsmd.getColumnCount();

List> records = new

ArrayList>();

while(rs.next())

{

Map row = new HashMap();

for(int i = 1; i <= cols; ++i)

{

row.put(rsmd.getColumnLabel(i),

rs.getString(i));

}

records.add(row);

}

return records;

}

finally

{

DBUtils.close(rs);

DBUtils.close(pstm);

DBUtils.close(conn);

}

}

protected final boolean update(String sql,

Object...val)throws Exception

{

Connection conn = null;

PreparedStatement pstm = null;

try

{

System.out.println(val[1]);

conn = DBUtils.getConnection();

pstm = conn.prepareStatement(sql);

System.out.println(sql);

for(int i = 0; i < val.length; ++i)

{

pstm.setObject(i + 1, val[i]);

return pstm.executeUpdate() > 0;

}

finally

{

DBUtils.close(pstm);

DBUtils.close(conn);

}

}

}

d.具体操作函数(数据的增删改查)

public class A001Service extends JdbcSupport { public boolean delete(Map dto)throws Exception

{

Connection conn = null;

PreparedStatement pstm = null;

try

{

String sql = "DELETE FROM STUDENT WHERE AB002=?";

conn = DBUtils.getConnection();

//编译sql语句

pstm = conn.prepareStatement(sql);

//得到要删除对象的主键

String list[] = (String[]) dto.get("list");

for(int i = 0; i < list.length; ++i)

{

if(list[i]!=null && !list[i].equals(""))

{

pstm.setObject(1, list[i]);

pstm.addBatch();

}

}

//开启事务

conn.setAutoCommit(false);

boolean flag = false;

try

{

pstm.executeBatch();

https://www.360docs.net/doc/a713224550.html,mit();

flag = true;

catch(Exception e)

{

conn.rollback();

e.printStackTrace();

}

finally

{

conn.setAutoCommit(true);

}

return flag;

}

finally

{

DBUtils.close(pstm);

DBUtils.close(conn);

}

}

public boolean modify(Map dto)throws Exception

{

StringBuilder sql=new StringBuilder()

.append("UPDATE STUDENT A")

.append(" SET

A.AB002=?,A.AB003=?,A.AB004=?,A.AB005=?,A.AB006=?,")

.append("

A.AB007=?,A.AB008=?,A.AB009=TO_DATE(?,'YYYY-MM-DD'),A.AB0 10=?,")

.append("

A.AB011=?,A.AB012=?,A.AB013=?,A.AB014=?,A.AB015=?,")

.append("

A.AB016=?,A.AB017=?,A.AB018=?,A.AB019=?,A.AB020=?,")

.append(" A.AB021=?,A.AB022=?")

.append(" WHERE A.AB002=?")

;

List val = new ArrayList();

for(int i = 2; i <= 22; ++i)

{

String key = "AB0";

if(i < 10)

key += "0";

key += i;

val.add(dto.get(key));

}

val.add(dto.get("PK"));

return this.update(sql.toString(), val.toArray());

}

public boolean add(Map dto)throws Exception

{

StringBuilder sql = new StringBuilder()

.append("INSERT INTO STUDENT")

.append(" VALUES(S_STUDENT.NEXTVAL,?,?,?,?,?,?,?,")

.append("TO_DATE(?,'YYYY-MM-DD'),?,?,?,?,?,?,?,?,?,?,? ,?,?)")

;

System.out.println(dto);

List val = new ArrayList();

//需要传递的参数列表

for(int i = 2; i <= 22; ++i)

{

String key = "AB0";

if(i < 10)

key += "0";

key += i;

val.add(dto.get(key));

}

return this.update(sql.toString(), val.toArray());

}

public Map findById(Object id)throws Exception

{

StringBuilder sql = new StringBuilder()

.append("SELECT

A.AB002,A.AB003,A.AB004,A.AB005,A.AB006,")

.append("

A.AB007,A.AB008,TO_CHAR(A.AB009,'YYYY-MM-DD')

AB009,A.AB010,A.AB011,")

.append("

A.AB012,A.AB013,A.AB014,A.AB015,A.AB016,")

.append("

A.AB017,A.AB018,A.AB019,A.AB020,A.AB021,")

.append(" A.AB022")

.append(" FROM STUDENT A")

.append(" WHERE AB002=?")

;

List val = new ArrayList();

val.add(id);

return this.query(sql.toString(),

val.toArray()).get(0);

}

public List>

queryByConditions(Map dto)throws Exception {

StringBuilder sql = new StringBuilder()

.append("SELECT

A.AB002,A.AB003,A.AB004,A.AB005,A.AB007,A.AB008,TO_CHAR(A .AB009,'YYYY-MM-DD') AB009")

.append(" FROM STUDENT A")

.append(" WHERE 1=1")

;

Object AB002 = dto.get("QAB002");

Object AB003 = dto.get("QAB003");

Object AB005 = dto.get("QAB005");

Object AB008 = dto.get("QAB008");

List val = new ArrayList();

if(checkVal(AB002))

{

sql.append(" AND AB002 LIKE ?");

val.add("%"+ AB002 + "%");

}

if(checkVal(AB003))

{

sql.append(" AND AB003 LIKE ?");

val.add("%" + AB003 + "%");

}

if(checkVal(AB005))

{

sql.append(" AND AB005 LIKE ?");

val.add("%"+AB005+"%");

}

if(checkVal(AB008))

{

sql.append(" AND AB008 LIKE ?");

val.add("%"+ AB008 + "%");

}

sql.append("ORDER BY AB002 ASC");

return this.query(sql.toString(), val.toArray());

}

private boolean checkVal(Object val)

{

return val!=null && !val.equals("");

}

e.编码过滤器

此过滤器解决网页与Servlet之间的中文乱码问题。

@WebFilter("/*")

public class CodeFilter extends HttpServlet implements Filter {

private static final long serialVersionUID = 1L;

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding("GBK");

chain.doFilter(request, response);

}

public void init(FilterConfig fConfig) throws ServletException {

// TODO Auto-generated method stub

}

}

f.“全选功能”(JavaScript)

当选中“全选”后,所有记录将被选中,“删除”按钮解除锁定;再“全选”状态下,再次单击“全选”后,所有记录全部不选中,“删除”按钮变为锁定状态。在“全选”状态下,解除任何一条记录的选定,“全选”复选框将变为“未选中”状态。当依次选中所有记录时(不使用“全选”),“全选”复选框将变为“选中”状态。