冲刺总结(三)
完成任务:单位管理模块。
一、设计思路:
公文系统管理者在管理系统的时候,肯定会涉及单位的管理,于是我就负责我们小组这一块的内容。
首先是管理者界面的排布:

点进去的单位管理的界面如图

我需要做的就是如何把这个功能实现。
二、功能设计:本功能包括以下几个模块
添加单位、删除单位、单位列表、这个模块需要连接的数据部分
添加的效果如图:

page 指令可以定义下面这些大小写敏感的属性(大致按照使用的频率列出):import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
<base href="value">为页面上所有相对 URL 规定基准 URL,href 属性规定页面中所有相对链接的基准 URL。
<base href="<%=basePath%>">
定义判断输入的值函数:如果为空则弹出警告,不为空则调用。这是jsp的内容,也是该模块的核心。
function checkValue(){ if(document.form.departmentname.value==""||document.form.departmentname.value==null) { alert("不能为空!"); document.form.departmentname.focus(); return false; } return true;
之后再进行页面的设计就可以了

其次就是如何把我需要添加的内容进行整个模块的配合,检测调用:
PreparedStatement psm = null; try { psm = conn.prepareStatement("insert into t_department (departmentname) values(?)"); psm.setString(1, request.getParameter("departmentname")!=null?request.getParameter("departmentname"):""); psm.executeUpdate(); response.sendRedirect("list.jsp?flag=success"); } catch (Exception e) { out.print(e.getMessage()); } finally { if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } if (psm != null) { try { psm.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
我们在添加单位系统的时候肯定会涉及删除我们不需要的单位
代码核心:
PreparedStatement psm = null; try { psm = conn.prepareStatement("delete from t_department where id = "+request.getParameter("ID")); psm.executeUpdate(); response.sendRedirect("list.jsp?flag=success"); } catch (Exception e) { out.print(e.getMessage()); } finally { if (psm != null) { try { psm.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
下图为单位管理设计的页面:

script处理部分(有注释介绍):
<%
int count = 0;//记录数
// 进行乱码处理
request.setCharacterEncoding("GB2312");
// 定义如下分页变量
// 1、定义没页要显示的记录数
int lineSize = 5;
// 2、定义一个当前是第几页
int currentPage = 1;
// 计算出总页数
int pageSize = 0;
// 总记录数 / 每页显示的记录数
int allRecorders = 30;
// 加入查询关键字变量
// 接收查询关键字
String keyWord1 = null;
keyWord1 = request.getParameter("fname");
if(keyWord1==null){
keyWord1="";
}else{
try{
//String(byte[] bytes, Charset charset)
//通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String
//keyWord1=(new String(keyWord1.getBytes("iso-8859-1"),"UTF-8")).trim();
}catch(Exception e){
e.printStackTrace(System.err);
}
}
// 接收传过来的当前页
try {
currentPage = Integer.parseInt(request.getParameter("cp"));
} catch (Exception e) {
}
try {
PreparedStatement pstmt = null;
String sql = null;
if (keyWord1 == null||"".equals(keyWord1)) {
// 如果为空则没有查询,表示查询出全部
sql = "select count(*) from t_department c ";
} else {
//如果KeyWord有值 则执行模糊查询
sql = "select count(*) from t_department c where c.departmentname like '%"+keyWord1+"%'";
}
System.out.println(sql);
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
allRecorders = rs.getInt(1);
}
rs.close();
pstmt.close();
// 计算总页数
pageSize = (allRecorders + lineSize - 1) / lineSize;
if (keyWord1 == null||"".equals(keyWord1)) {
// 如果为空则没有查询,表示查询出全部
sql = "select * from t_department c ";
} else {
//如果KeyWord有值 则执行模糊查询
sql = "select * from t_department c where c.departmentname like '%"+keyWord1+"%'";
}
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
%>
接下来就是数据的添加和删除,毕竟我们要达到的效果就是能够去把这些全部整合起来。
<% } } catch (Exception e) { out.print(e.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } %>
三、遇到的问题
数据库SQL语句方面:
1.java通过JDBC连接MySql数据库方法
参见:http://hzy3774.iteye.com/blog/1689525
2.出现错误java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
注意sql语句如果是查询,用executeQuery(),要对表产生修改的话则使用executeUpdate()
3.选取前N条数据时,sqlserver数据库用select top n from table order by class desc,而mysql数据库使用select * from table order by class desc limit n
4.sum()求和函数,注意sum和括号之间不能有空格
5.将一张大表分割成几个小表:CREATE TABLE weibo1 SELECT * FROM weibo ORDER BY mid LIMIT 1,3000000;
出现错误:[Err] 3 - Error writing file 'C:\Windows\TEMP\MY29' (Errcode: 28)。解决方案参见:www.111cn.net/database/mysql/45657.htm。我的问题是因为C盘空间不足
6.将数据导入Mysql,出现ERROR 1406 : Data too long for column 解决办法:
在my.ini里找到 sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION”
把其中的STRICT_TRANS_TABLES,去掉,然后重启mysql就ok了。
重启Mysql方法:在CMD下,输入 net stop mysql 可以停止mysql,输入net start mysql可以启动mysql,先停止,再启动
java语句方面:
1.向量的定义。向量初始化不能使用Vector<String> orimid =null,会导致在像该向量添加元素时发生空指针错误。正确方法:Vector<String> orimid =new Vector<String>();
2.ArrayList和Vector的区别:Vector是同步的, 而ArrayList不是,因为Vector是同步的, 所以它是线程安全的。同样, 因为Vecotr是同步的, 所以他需要额外的开销来维持同步锁, 所以它要比ArrayList要慢.(理论上来说)
Vector允许用户设置capacityIncrement这样在每次需要扩充数组的size的时候, Vector会尝试按照预先设置的capacityIncrement作为增量来设置, 而ArrayList则会把数组的大小扩大一倍;如果capacityIncrement设为0或者负值, Vector就会做和ArrayList一样, 每次都将数组大小扩大一倍.
3.java.lang.OutOfMemoryError: Java heap space异常。因为要选择的表太大了,造成内存溢出。参考http://my.oschina.net/cimu/blog/175691。更改参数,在eclipse.ini中增加:
-Xms128M
-Xmx4096M
然而我的表太大了,还是溢出了,决定将该表分成几个小表。

浙公网安备 33010602011771号