华 北 科 技 学 院
课程考查报告
班 级: 计科B123 姓名: 董帅帅 课程名称: JSP网络编程 课程性质: 专业选修 开设学期考核成绩:______________________________ 任课教师: 李永飞
20xx年5月19日
1 任务描述
学生根据新闻发布系统的需求文档,选用某种关系型数据库,采用JSP技术开发实现一个Web应用程序。
2 系统分析与设计 2.1 数据库设计
数据需要数据库的管理,数据的结构将影响整个系统。本实验是新闻发布系统的简单实现,所以使用简单的个人数据库管理软件mysql实现,数据库名称为testdata,共有三个表:news表,user表,comment表。
user表结构:
news表结构:
2.2 用户界面设计
用户界面是进入系统呈现在用户面前的界面,反映了这个系统的风格,本系统是简单的新闻发布系统,本着简约的设计理念设计,运用css+div的布局设计。如下为注册用户登录界面,页面上部由top.jsp页面实现,页面左部由hot.jsp页面实现热点新闻和最新评
comment表结构:
论,页面下部为页脚部分,由foot.jsp页面实现。如下为页面实现:
图1:主页面
2.3 功能模块设计
2.3.1 查看新闻列表模块
本模块主要实现查看新闻列表的功能,此功能是所有用户共有的功能,通过从数据库news表中查找新闻标题和内容,以列表的形式将新闻标题顺序显示在表格中。 主要代码如下:
连接数据库和执行sql语句通过封装的javabean实现,将从数据库中查出的新闻存放在列表中,以便之后的调用。
public List<News> NewsList() {
Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = DBget.getConnection(); String sql = "select * from news"; ps = con.prepareStatement(sql); rs = ps.executeQuery(); ArrayList<News> list = new ArrayList<News>(); News news; while (rs.next()) { news = new News(); news.setN_id(rs.getInt("n_id"));
} } } news.setN_title(rs.getString("n_title")); news.setN_author(rs.getString("n_author")); list.add(news); return list; e.printStackTrace(); DBget.closeResultSet(rs); DBget.closePreparedStatement(ps); DBget.closeConnection(con); } catch (Exception e) { } finally { return null;
jsp页面主要实现业务逻辑的功能,将从数据库查出来的数据显示在页面的表格中。 如下所示:
<body>
<h3> 新闻列表 </h3> <table align="center" border="1" cellspacing="0" <tr> <% %> <tr> <td><%=i + 1%></td> <td><%=news.getN_title()%></td> NewsDao newslist=new NewsDao(); List<News> list = new ArrayList<News>(); list = newslist.NewsList(); for (int i = 0; i < list.size(); i++) { News news = (News) list.get(i); <th> 新闻编号 </th> <th> 新闻标题 </th> <th> 操作 </th> width="50%"> </tr>
<% %> <td> </td> <a href="news/disNews.jsp?n_id=<%=news.getN_id()%>">view</a> </tr> } </table>
</body>
2.3.2 阅读新闻内容模块
本模块主要实现阅读新闻的功能,此功能是所有用户共有的功能,通过从数据库中news表中查出新闻的内容,在页面上显示新闻的标题,新闻的作者,发布日期,新闻内容。
主要代码如下:
数据库连接和sql语句的查询封装在javabean中,主要实现从数据库中按新闻Id查找新闻内容并封装在对象News中以便之后的调用。
public News getNewsById(int n_id) {
Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = DBget.getConnection(); String sql = "select * from news where n_id=?"; ps = con.prepareStatement(sql); ps.setInt(1, n_id); rs = ps.executeQuery(); News news = new News(); if (rs.next()) { } return news; e.printStackTrace(); DBget.closeResultSet(rs); DBget.closePreparedStatement(ps); news.setN_title(rs.getString("n_title")); news.setN_author(rs.getString("n_author")); news.setN_content(rs.getString("n_content")); news.setN_date(rs.getDate("n_date")); news.setN_lastdate(rs.getDate("n_lastdate")); news.setN_ishot(rs.getString("n_ishot")); } catch (Exception e) { } finally {
} } DBget.closeConnection(con); return null;
jsp新闻界面完成业务逻辑,实例化对象News并将查找的内容显示在页面上,如下所示
<body>
NewsDao disNews=new NewsDao();
<%
%>
<h2><%=news.getN_title()%></h2> 作者:<%=news.getN_author()%> 发布日期:<%=news.getN_date()%><br /> <div style="text-align: right"> int n_id Integer.parseInt(request.getParameter("n_id")); News news = new News(); news = disNews.getNewsById(n_id);
<a href="comment/disComment.jsp?n_id=<%=n_id%>">查看评
()</a>
</div><br /> <div class="div1"> <%=news.getN_content()%> </div><br /><br />
</body>
2.3.3 评论新闻内容模块
本模块主要实现对新闻进行评论的功能,此功能是所有用户共有的功能,通过在页面输入评论内容,向数据库comment表中插入数据来实现评论的功能。
主要代码如下:
数据库连接和sql语句的执行封装在javaBean中, 主要实现向数据库中插入从业务逻辑层得到的评论内容并通过执行sql语句将内容插入到数据库中
public boolean addComment(Comment comment) { Connection con = null; PreparedStatement ps = null; try { con = DBget.getConnection();
String sql = "insert into
comment(c_id,c_content,c_date,n_id) values
(null,?,now(),?)";
ps = con.prepareStatement(sql); ps.setString(1, comment.getC_content()); ps.setInt(2, comment.getN_id());
} int num = ps.executeUpdate(); if (num > 0) { } e.printStackTrace(); if (con != null) { } DBget.closePreparedStatement(ps); DBget.closeConnection(con); return true; } catch (Exception e) { } finally { }return false;
如下chkAddComment.jsp页面主要实现将表单中输入的评论的内容通过业务逻辑调用数据连接层中的addComment方法来进行操作。
<% String c_content = request.getParameter("c_content"); int n_id = Comment com = new Comment(); com.setC_content(c_content); com.setN_id(n_id); CommentDao dao=new CommentDao(); if(dao.addComment(com)){ response.sendRedirect("success.jsp"); } else{ out.println("评论添加出现错误,请<a Integer.parseInt(request.getParameter("n_id"));
href=\"news/newsAdd.jsp\">返回</a>");
}
%>
2.3.4 用户注册模块
本模块主要实现用户的登录功能,通过从登录界面输入用户名和密码实现系统的登录,并对登录名称和密码进行验证。
主要代码如下:
以下为注册表单userRegister.jsp主要实现在页面上输入表单中各个项的内容,然后通过传值将表单中的值传给业务逻辑层进行操作。
<h3>
用户注册: </h3>
<form name="form2" method="post" onSubmit="return checkForm()"> 用 户 名: <input name="u_no" type="text" /> <br /> 密 码: <input name="u_pwd" type="password" /> <br /> 确认密码: <input name="u_pwd2" type="password" /> <br /> 电子邮箱: <input name="email" type="text" id="email" <font color="red">*</font> <br /> <span>安全问题:</span> <select name='safequestion' id='safequestion'> <option value='0' selected> 没安全提示问题 </option> <option value='我的大学是哪所?'> 我的大学是哪所? </option> <option value='我是什么专业?'> 我是什么专业? </option> <option value='我的生日是哪天?'> 我的生日是哪天? </option> <option value='我母亲的名字是什么?'> 我母亲的名字是什么? </option> <option value='我父亲的名字是什么?'> 我父亲的名字是什么? </option> action="user/chkRegister.jsp" class="text" /> </select> <font color="red">(重设密码用)</font> <br /> <span>问题答案:</span> <input name="safeanswer" type="text" <span>性 别id="safeanswer" class="text" value="" /><br />
</span>
<input type="radio" name="sex" value="男" /> 男 <input type="radio" name="sex" value="女" /> 女 <input name="sex" type="radio" value="" 保密 <br /> <input name="submit" type="submit" value="提交" /> checked="checked" /> <input name="reset" type="reset" value="清空" /> </form>
以下为业务逻辑层chkRegister.jsp主要实现将得到的表单值通过调用数据库连接层的addUser方法来向数据库中插入数据,如果插入成功就输出提示插入成功,如果失败则跳转回注表单界面。
<%
String u_no = request.getParameter("u_no"); String u_pwd = request.getParameter("u_pwd"); User user = new User(); user.setU_no(u_no); user.setU_pwd(u_pwd); UserDao dao = new UserDao(); if (dao.addUser(user) == 1) { out.println("已经注册成功,请%><%
<href=\"user/userLogin.jsp\">登录</a>");
} else {
%><% %> response.setHeader("refresh", } "3;url=userRegister.jsp");
2.3.5 用户登录模块
本模块主要实现用户的注册,通过在页面提交的表单,通过验证之后向数据库插入相关项,实现用户注册的功能。
登录功能流程图如下:
主要代码如下:
以下为数据库连接和sql语句执行部分,主要实现查询数据库中是否存在此用户。 public boolean login(User user) {
Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = DBget.getConnection(); String sql = "select * from user where u_no=? and ps = con.prepareStatement(sql); ps.setString(1, user.getU_no()); ps.setString(2, user.getU_pwd()); rs = ps.executeQuery(); if (rs.next()) { } e.printStackTrace(); DBget.closeResultSet(rs); DBget.closePreparedStatement(ps);
return true; u_pwd=?"; } catch (Exception e) { } finally {
} } DBget.closeConnection(con); return false;
chkLogin.jsp页面如下,主要实现登录功能的业务逻辑。
<body> <% String name=request.getParameter("u_no"); String password=request.getParameter("u_pwd"); %> <jsp:useBeanid="user"class="com.news.model.User"scope="ses <jsp:setProperty property="*" name="user" /> <%UserDao dao = new UserDao();
session.setAttribute("admin","ok"); sion" /> if(name.equals("admin")&&password.equals("admin")){
response.sendRedirect("/News2/adminindex.jsp");
%>
<% }else{
%> <% } else { out.println("用户名或者密码错误,请<a if (dao.login(user)) { session.setAttribute("login","ok"); response.sendRedirect("/News2/index.jsp");
href=\"user/userLogin.jsp\">重新登录</a>");
}}%>
</body>
2.3.6 用户管理模块
本模块蛀牙实现注册用户对用户信息的修改和管理员用户对用户的删除,通过对页面中的操作对数据库中的值进行操作,最后将结果显示出来。
主要代码乳如下:
用户信息管理分为用户的修改,此功能为注册用户和管理员特有的功能,这里省略用户的删除,下面为用户的修改的业务逻辑部分,页面名称为chkmodiUser.jsp,主要接收修改修改表单页面modiUser.jsp传来值,并调用数据库连接部分的updateUser方法来实现用户的修改。
<%
int u_id1 =
Integer.parseInt(request.getParameter("u_id"));
%> String u_no1 = request.getParameter("u_no"); String u_pwd1 = request.getParameter("u_pwd"); User user1 = new User(); user1.setU_no(u_no1); user1.setU_pwd(u_pwd1); UserDao dao1 = new UserDao(); if (dao1.updateUser(user1)==1) { user1.setU_id(u_id1); <jsp:forward page="userManage.jsp" /> <% %> } else { } response.sendRedirect("/default.jsp");
2.3.7 新闻发布模块
本模块主要实现管理员用户发布新闻的功能,通过表单输入新闻的内容向数据库中插入数据并输出结果。
主要代码如下:
新闻发布类似于用户注册功能,接收表单输入的值并调用数据库连接部分的AddNews方法来将新闻内容插入数据库。以下为新闻发布的业务逻辑部分chkaddNews.jsp功能界面。
NewsDao dao = new NewsDao(); if (dao.addNews(news)) { response.sendRedirect("success.jsp"); out.println("发布新闻出现错误请<a } else { <% String n_title = request.getParameter("n_title"); String n_author = request.getParameter("n_author"); String n_content = request.getParameter("n_content"); String n_ishot = request.getParameter("n_ishot"); String n_key = request.getParameter("n_key"); News news = new News(); news.setN_title(n_title); news.setN_author(n_author); news.setN_content(n_content); news.setN_ishot(n_ishot); news.setN_key(n_key);
href=\"news/newsAdd.jsp\">重新填写</a>");
%> }
3 系统实现
下面将对登录模块进行分析
3.1 接收用户输入的实现
接收用户输入的界面如下:
表单代码如下:
<form action="user/chklogin.jsp" method="post" name="userLogin"
onSubmit="return checkLogin()"> <h3> 用户登录: </h3> 用户名: <input name="u_no" type="text" /> <br> <p></p> 密 码: <input name="u_pwd" type="password" /> <br /> <br /> <input name="login" type="submit" value="登录" /> <a href="user/userRegister.jsp" target="content">注册用户</a>
</form>
通过上述表单输入用户名和密码之后,调用user.js中的checkLogin()方法进行表单验证,验证完成之后才会将值传入功能界面chkLogin.jsp,表单验证代码如下:
function checkLogin() {
if (document.userLogin.u_no.value == "") { } if (document.userLogin.u_pwd.value == "") { alert("密码不能为空!"); alert("用户名不能为空!"); document.form2.u_no.focus(); return false;
document.form2.u_pwd.focus(); return false; }}
3.2 数据库访问的实现
数据库访问功能实现界面为chkLogin.jsp,主要实现接收表单输入的值,再调用数据库连接部分的login(user)方法来实现数据库的访问。
其中连接数据库代码如下:
public class DBget {
public static Connection getConnection(){ Connection con=null; try{ Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:33 }catch(Exception e){ } e.printStackTrace(); 06/testdata","root","123456"); return con;} public static void closeConnection(Connection con){ } public static void } public static void closeResultSet(ResultSet rs){ try{ if(rs!=null){ } rs.close(); try{ } if(ps!=null){ } e.printStackTrace(); ps.close(); if(con!=null){ } try { } con.close(); // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { closePreparedStatement(PreparedStatement ps){ }catch(SQLException e){
} } }catch(SQLException e){ e.printStackTrace();}
数据库访问方法login(user)如下:
public boolean login(User user) {
<%
User user=new User();
{
%> <% } else { if (dao.login(user)) { session.setAttribute("login", "ok"); response.sendRedirect("/News2/index.jsp"); session.setAttribute("admin", "ok"); response.sendRedirect("/News2/adminindex.jsp"); UserDao dao = new UserDao(); if (name.equals("admin") && password.equals("admin")) Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { } return false; } con = DBget.getConnection(); String sql = "select * from user where u_no=? and ps = con.prepareStatement(sql); ps.setString(1, user.getU_no()); ps.setString(2, user.getU_pwd()); rs = ps.executeQuery(); if (rs.next()) { } e.printStackTrace(); DBget.closeResultSet(rs); DBget.closePreparedStatement(ps); DBget.closeConnection(con); return true; u_pwd=?"; } catch (Exception e) { } finally { chkLogin.jsp页面内容如下:
%> <% } else {
out.println("用户名或者密码错误,请<a
href=\"user/userLogin.jsp\">重新登录</a>");
}
}%>
3.3 运行结果显示的实现 ? 管理员用户登录成功直至跳转到管理员界面,使用如下代码跳转,将用户标识存入session,以便之后调用。 session.setAttribute("admin", "ok"); response.sendRedirect("/News2/adminindex.jsp");
? 注册用户登录成功直至跳转到管理员界面,使用如下代码跳转,将用户标识存入session,以便之后调用。 session.setAttribute("login", "ok"); response.sendRedirect("/News2/adminindex.jsp"); 登录失败界面如下两种:
图2错误有表单验证实现,
图3错误由如下代码实现
out.println("用户名或者密码错误,请<a href=\"user/
userLogin.jsp\">重新登录</a>");
图2:无输入错误
图3:用户名或密码错误
4 系统功能
4.1新闻列表功能
如下,此功能可显示数据库中的所有新闻显示在表格中,并提供查看新闻的超链接,可点击进入查看新闻和查看评论。
图4:新闻列表
4.2 新闻查看功能
界面如下,本界面主要显示新闻的标题、作者、发表日期、和内容,并提供查看评论的链接。
图5:新闻内容显示
4.3 评论功能
界面如下,本功能界面主要提供查看评论和发表评论的功能。
图6:评论界面
4.4 用户注册功能
如下,界面为输入表单,每个输入项都有提示功能,可根据要求注册用户。
图7:用户注册界面
4.5 用户管理和新闻管理功能
界面如下,主要提供显示所有用户和显示所有新闻的功能,并有修改用户和修改新闻以及删除用户和新闻的链接,可根据用户的ID值删除用户,根据新闻的ID值删除新闻。
图8:用户管理
图9:新闻管理
4.6 新闻发布功能:
界面如下,主要提供新闻的输入表单,输入完成之后可提交新闻完成新闻的发布。
图10:发布新闻
5 课程总结
两个多月的java web课程的学习到此结束,在这个过程中,我学到了很多,尤其是这一次的实验让我对一个完整的动态web网站设计过程有了更深的了解。
首先,对于需求分析,老师已经给了具体的要求,我们要做的就是实现其功能。在老师的指导下,我们开始一个一个模块的开发。在我第一遍做各个模块的时候,对工程的总体把握不好,以至于做出的网站系统看起来非常凌乱,哪里出现错误需要好半天才能找到错误的地方。借鉴第一次的教训,我将各个模块的内容重新整理了一下,使工程看起来错落有致,这样开发的过程就很有层次性,这让我对程序开发时的工程的布局有了注重。另外,从实现用户的注册和登录到用户信息和新闻信息的增删改查,我们的任务不再是单单只制作一个简单的页面,而引入了连接数据库和对数据库的操作。对数据库的操作只要学会对一个实例的增删改查,那么其他的功能都轻而易举的实现。在实现对数据库的操作过程中,我对页面的传值也有了更加深刻的理解,在页面的跳转过程中,值的传递至关重要,如果对访问数据库的机制不清楚,就不好把握。在对数据库实例的了解之后这个功能的实现就变的很简单。最后对页面布局进行整合,至此实现了新闻发布系统的基本功能。
在完成课设的同时,也遇到了很多的困难,如新闻列表的实现中用到列表的知识,但我对列表还不太了解,就花了很长的时间完成新闻列表的功能。再如用户的标识问题,作为匿名用户也可以进入主页的情况,采用了封装session的方法,将用户表示封装在session中,在每个需要用到登录用户的时候验证用户标识。还有就是主页面的查找功能,由于刚开始的数据库设计的不合理,导致主界面的关键字查找出现问题。
在实验的过程中遇到了很多的困难,也让我学到了很多解决问题的办法,课程设计不仅是对一学期学习的总结,也是我们学习网站设计必须经历的过程。“千里之行,始于足下”,只有我们认真对待每一件事,脚踏实地地迈出这一步,才能稳健地为以后的实战浪潮中打下坚实的基础。