比赛在不知不觉中落下帷幕,以下就来总结这次比赛经历、反思其中暴露出来的问题。
一、首先说一下整体架构问题。
- 设计论坛系统的目标有两个,一个是初级功能的实现,二是尽可能实现非功能性需求。论坛系统之所以称之为论坛系统,首先,其初级功能势必要过硬(发贴,删帖,评论,回复等),具有良好的可交互性。尽于此却是不够的,非功能性需求一定程度上决定着你的论坛是否出彩出新。如何在有限的时间里,把握好这二者之间的关系是值得考虑的。当然,不仅仅局限于要求上提到的那些功能性,非功能性需求,自己新颖的想法付诸于实践也很可能加分。
- 说一下系统实现的架构思路。整体上采取“先搭框架,后填充”的版式。先创建一些jsp或html用以显示相应功能的内容,再创建相应的包、在其中创建对应的servlet用以实现相应的功能。考虑到论坛中帖子的发表、删除、修改、查看等势必要频繁调用数据库中的数据,我们在这里创建一个opendatabase的jsp用以打开数据库链接,创建Connection Statement Resultset等对象。以此,可以避免后续冗余的代码。
二、 下面是分部功能实现中遇到的问题及反思。
- 此块说一说我主要写的帖子部分。首先,是发帖模块的servlet
可以看到,自己去写的时候并没有想到用已经include 的opendatabase的jsp,而是又写了一遍打开数据库的部分,极其难看。其次,是如果没有成功插入的处理方法没有考虑,让它跳转到一个专门显示错误,具有报错信息的(比如)fail.jsp可能会更好一些。发帖部分还是用form表单传值,学一下用ajax异步传值就能把各块分开,使用户获得更好的体验。public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Mysql 的驱动 // 先定义变量,后使用和关闭 Connection conn = null;// 数据库连接 Statement stm = null;// 数据库表达式 ResultSet rs = null;// 结果集 String sql; // 2. 获取数据库的连接 try { conn = java.sql.DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8","root", "123456"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // root是用户名,密码为空 // 3. 获取表达式 try { stm = conn.createStatement(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } PrintWriter out = response.getWriter(); String name = request.getParameter("name"); String email = request.getParameter("email"); String subject = request.getParameter("subject"); String content = request.getParameter("content"); int year, month, day, hour, minute, second; String time; GregorianCalendar calendar; calendar = new GregorianCalendar(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1; day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); second = calendar.get(Calendar.SECOND); time = year + "年" + month + "月" + day + "日" + hour + ":" + minute + ":" + second; /*name = convert(name); subject = convert(subject); content = convert(content); content = Replace(content);*/ HttpSession session=request.getSession();//创建一个session实例 String username = session.getAttribute("username").toString(); sql = "insert into discuss(name,email,subject,content,time,username,id,great)values('" + name + "','" + email + "','" + subject + "','" + content + "','" + time + "','" + username + "',"+ null +","+'0'+")"; try { stm.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //插入数据库中 response.sendRedirect("index.jsp"); out.flush(); out.close(); }
- 接下来是帖子的显示页面questionAnswer.jsp,这部分样式设计分布感觉还是勉强可以接受,模糊查询那一块的自动补齐还可以是做的更科学,比如数据源的扩大,不只是写死的一个数组,而是可以调一下数据库,都能有所提高。
- 查看个人发帖的这一部分,就感觉设计的不是那么走心,样式没想到又特别好的,于是沿用了之前questionAnswer.jsp的这一块版式,不灵动,如果个人帖子发的少了,还会有大片的空缺。
- 除上述之外,还可以设计一些小功能,不求一点不落但求做什么像什么。比如增加收藏帖子功能,按照点赞数加精品贴等等,都是可以纳入实践的范畴之内。
三、总结展望
这次比赛收获了很多,同时也暴露了很多不足与问题所在。必须承认,我不是一个很OK的队长,在功能所需时间的分配上还是有精进的地方,一些小功能的设计的思路也没有完全打开,队员泄气的时候要更加鼓励队员,团队的力量是无穷的,永远胜过单干的蛮力。这次结果不尽人意的时候就应当适时作出反思,查漏补缺,不断完善自己,争取下次比赛创佳绩吧!