1、课程名称: 组 件 技 术 设计题目: 简易论坛模型设计 课程设计要求:1、 掌握 Struts 开发流程2、 掌握 Action 的工作原理3、 掌握 Struts-config.xml 文件的配置4、 功能模块的完善与交互5、 实现论坛模型的几个主要基本功能,包括用户注册、用户信息修改、删除用户、主题编辑、回复编辑、删除主题和删除回复、权限管理、用户登录、查询用户资料工作计划及安排:此次设计共有一周时间分为四个阶段。第一个阶段:认真分析老师给的资料,读懂论坛模型的基本代码;第二个阶段:开始着手设计,进行所需软件的安装,接着进行环境配置(此过程需要查阅大量资料)软件汉化等调试前的准备工作;第
2、三的阶段:调试程序,修改错误,优化界面及功能;第四个阶段:总结实训,完成实验报告。总结:通过这次课程设计,我对 Struts 有了更深入的认识,Struts 是一个非常方便的 Web MVC 框架,基于这个框架能够更迅速便捷的进行 Web 的开发,掌握 Struts 的原理能够 帮助我们了解 JSF。课程设计(大作业)报告一、 题目分析1、掌握 Struts 开发流程2、掌握 Action 的工作原理3、掌握 Struts-config.xml 文件的配置4、功能模块的完善与交互5、实现论坛模型的几个主要基本功能二、 总体设计1、 用户注册用户注册模块用于添加基本的用户信息。目前,在用户注册模
3、块验证用户名是否重复时使用最多的技术是 Ajax,该技术基于无刷新页面的方式与数据库中的用户数据进行对比。2、 用户信息修改用户信息修改模块的技术关键点在于 Struts 中的 HTML 类型的标签与数据库中的数据交互。3、 删除用户删除用户模块仅仅是一个 DELETE 的操作,但其影响到相关的帖子及主题发表者与用户的关联性操作。设计时应注意做到如何删除用户但与这个用户相关的帖子中的信息不被破坏。4、 主题编辑主题编辑模块是在开发留言板、论坛类项目时必做的一个模块。在发表主题时,需要注意对特殊符号的安全处理。5、 回复编辑回复编辑和主题编辑的功能大体一样,它们的共同点是基于用户权限使用“编辑”
4、功能,只有管理员才能编辑,只有管理员才会出现“编辑”超链接,设计时要注意权限的判断。6、 删除主题和删除回复删除主题时要将回复一起删除,删除回复时要对回复与用户名之间关联做一些善后的处理。7、 权限管理设计时注意区别用户与管理员的权限。8、 用户登陆用户登录是典型的权限认证和数据库操作的实例。在主界面单击登录,出现登录界面后输入正确的用户名和密码后登录系统。9、 查询用户资料本模块具有一些 JDBC 与超级链接结合显示数据的基础实例。在 BBS 的使用过程中,经常需要对用户进行查询的操作,本项目也需要这样的模块。三、 实验器材Windows 操作系统,MyEclipse 软件1.配置 Ecli
5、pse 下的 Struts 开发环境需要以下软件:四、 制作步骤1. 安装顺序如下:(1) 安装 jdk-1_5_0_08-windows-i586-p.exe。(2) 配置 JDK 环境变量。(3) 解压 eclipse3.2.1.zip。(4) 安装 MyEclipseEnterpriseWorkbenchInstaller_5.1.0GA_E3.2.1exe。(5) 安装 apache-tomcat-5.5.20.exe。2.成功安装 MyEclipse 和 Tomacat 后需要将 Tomacat 和 MyEclipse 进行集成。单击“Window”“Preferences”菜单后出
6、现以下界面2. 选择“MyEclipse”节点中的“Tomcat5”节点,按图进行设置:3.在图示窗口中设置“Tomcat Server”的状态为“Enable” ,设置“Tomcat Home Directory”的内容,即 Tomcat 的安装目录,设置完成后单击“OK” 。4.在“one.jsp”文件的和之间加入 JSP 脚本:五、 程序代码1用户注册页面描述:单击首页的“注册”超级链接,即出现用户注册的界面,在界面中可以实现新用户的注册,填入必要的信息后单击“Submit”按钮,则在数据库中新添加一条用户信息的记录。其代码如下:location.reload;JSP for Users
7、Form form姓名:密码:确认密码:性别:男女年龄:地址:邮件:验证码:在该页中,为防止刷屏,还需要 Action 代码:package com.zjy.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.Action;import org.apache.struts.action.ActionE
8、rror;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import com.zjy.struts.form.UsersForm;import com.zjy.struts.mypackage.UserDao;public class UsersAction extends Actio
9、n public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) UsersForm usersForm = (UsersForm) form;/ TODO Auto-generated methodUserDao ud = new UserDao();HttpSession hs = request.getSession();String image = (String) hs.getAttribute(
10、“rand“);/取验证码if (usersForm.getYzm().equals(image) /判断int rst = ud.selectName(usersForm.getName();/查用户名是否已被注册System.out.println(“1“);if (rst = 1) /已被注册System.out.println(“3“);ActionErrors errors = new ActionErrors();errors.add(“name“, new ActionError(“namewrong1“);this.saveErrors(request, errors);ret
11、urn mapping.getInputForward(); else /未注册int rs = ud.insertUsers(usersForm);/注册if (rs = 1) System.out.println(“4“);hs.setAttribute(“keys“,“0“);hs.setAttribute(“dname“, usersForm.getName();request.setAttribute(“inf“, “2“);return mapping.findForward(“tomessage“);/ 正确 else System.out.println(“5“);reques
12、t.setAttribute(“inf“, “3“);return mapping.findForward(“tomessage“);/ 出错 else System.out.println(“2“);ActionErrors errors = new ActionErrors();errors.add(“yzm“, new ActionError(“yzmwrong“);this.saveErrors(request, errors);return mapping.getInputForward();使用 UserDao 的实例 ud 判断用户是否注册,如果注册过,则返回错误信息,如果没有注
13、册使用 JDBC 代码操作数据库添加用户记录。UserDao.Java 代码如下:package com.zjy.struts.mypackage;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.Date;impor
14、t java.util.List;import com.zjy.struts.form.UsersForm;public class UserDao public PreparedStatement ps = null;public Connection con = null;public UserDao() try Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();String url = “jdbc:microsoft:sqlserver:/localhost:1433;DatabaseN
15、ame=luntan“;String user = “sa“;String password = “;con = DriverManager.getConnection(url, user, password); catch (Exception e) / TODO: handle exceptionpublic int insertUsers(UsersForm usersForm) UsersForm uf = usersForm;int rs = 0;Date t = new Date();String ts = t.toLocaleString();try ps = con.prepa
16、reStatement(“insert into users(name, password, adds, sex, email, age, times) values(?,?,?,?,?,?,?)“);ps.setString(1, bx(uf.getName();ps.setString(2, uf.getPassword();ps.setString(3, bx(uf.getAdds();ps.setString(4, bx(uf.getSex();ps.setString(5, bx(uf.getEmail();ps.setString(6, uf.getAge();ps.setStri
17、ng(7, ts);rs = ps.executeUpdate();System.out.print(“insert right!“); catch (Exception e) System.out.println(e);rs = 0;System.out.print(“insert wrong!“);/ 关闭 Jdbcfinally try ps.close();con.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return rs;public int select
18、Name(String name) Statement stmt = null;ResultSet rs = null;int rst = 0;try stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);String sql = “select * from users where name=“ + bx(name) + “;rs = stmt.executeQuery(sql);if (rs.next() rst = 1;/ System.out.print(rst);
19、catch (Exception e) / TODO: handle exceptionSystem.out.print(e); finally try rs.close();stmt.close();/ con.close(); catch (Exception e) / TODO: handle exceptionreturn rst;public UsersForm selectInf(String name) Statement stmt = null;ResultSet rs = null;UsersForm uf = new UsersForm();try stmt = con.c
20、reateStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);String sql = “select * from users where name=“ + bx(name) + “;rs = stmt.executeQuery(sql);if (rs.next() uf.setId(rs.getInt(1);uf.setName(bx(name);uf.setAdds(rs.getString(4);uf.setSex(rs.getString(5);uf.setEmail(rs.getString(6
21、);uf.setAge(rs.getString(7);/ System.out.print(rst); catch (Exception e) / TODO: handle exceptionSystem.out.print(e); finally try rs.close();stmt.close();/ con.close(); catch (Exception e) / TODO: handle exceptionreturn uf;public int updateUsers(UsersForm usersForm) UsersForm uf = usersForm;Statemen
22、t stmt = null;int rst = 0;try stmt = con.createStatement();String sql = “update users set password=“ + uf.getPassword()+ “,adds=“ + uf.getAdds() + “,sex=“ + bx(uf.getSex()+ “,email=“ + uf.getEmail() + “,age=“ + uf.getAge()+ “ where name=“ + uf.getName() + “;rst=stmt.executeUpdate(sql);System.out.pri
23、nt(“insert right!“); catch (Exception e) System.out.println(e);rst = 0;System.out.print(“insert wrong!“);/ 关闭 Jdbcfinally try con.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return rst;public List selectAll ()List list =new ArrayList();Statement stmt = null;R
24、esultSet rs = null;try stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);String sql=“select * from users“;rs=stmt.executeQuery(sql);while(rs.next()UsersForm uf = new UsersForm();uf.setId(rs.getInt(1);uf.setName(rs.getString(2);uf.setAdds(rs.getString(3);uf.setSex(
25、rs.getString(4);uf.setEmail(rs.getString(5);uf.setAge(rs.getString(6);list.add(uf); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return list;public int deleteUser(String ids)Statement stmt = null;int rst=0;try int id=Integer.parseInt(ids);stmt=con.createStatement();Str
26、ing sql=“delete from users where id=“+id;rst=stmt.executeUpdate(sql); catch (SQLException e) / TODO Auto-generated catch blockrst=0;e.printStackTrace();finallytry stmt.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace(); return rst;public String bx(String s) try byte
27、 b = s.getBytes(“iso-8859-1“);s = new String(b); catch (Exception e) return s;在注册页面输入用户的必要信息后,单击“submit”提交按钮,进行数据的提交,如果验证码及数据库验证通过,则出现如图所示界面。2.显示主题列表:主题列表的模块,在这里使用左右分栏的框架来实现。在打开 index.jsp 地址的时候,默认在右边的框架中出现欢迎界面,左边出现主题列表及分页。发表新主题的表单、验证码、提交按钮等常用功能。Index.jsp 的代码如下:index.jsp/以下两行将 frame 的 src 属性设置为 Dispa
28、tchAction 类,使用参数 method 进行不同功能的处理,并且设置左右框架的 name 属性 zhutie.jsp 是框架左边的链接页面,代码如下:location.reload;JSP for ZhutieForm form标题发帖人回复/点击/第页/共页 共条首页上一页下一页尾页登陆注册修改个人信息查询注册用户姓名标题内容验证码 huitie.jsp 是框架右边的链接页面,代码如下:location.reload;JSP for HuitieForm form楼主标题:删除姓名:时间:内容:第楼回复删除姓名:时间:内容:第页/共页 共条首页上一页下一页尾页姓名内容“ /验证码 在
29、分栏的左右结构的框架中,数据其实都是从 show.do 中取得的。Show.do 代码如下:package com.zjy.struts.action;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.ActionForm;import org.apache.struts.actio
30、n.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import com.zjy.struts.form.UsersForm;import com.zjy.struts.form.ZhutieForm;import com.zjy.struts.mybean.Fenye;import com.zjy.struts.mypackage.FenyeDao;import com.zjy.struts.mypackage.HuitieD
31、ao;import com.zjy.struts.mypackage.UserDao;import com.zjy.struts.mypackage.ZhutiDao;import com.zjy.struts.mypackage.ZhutieDao;public class ShowAction extends DispatchAction public ActionForward showtie(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) /
32、 TODO Auto-generated method stubString sid = request.getParameter(“id“);/取主帖 idif (sid = null | “.equals(sid) return mapping.findForward(“tomessage“); else int id = Integer.parseInt(sid);ZhutieDao zd = new ZhutieDao();ZhutieForm zf = zd.setZhutie(id);/取主帖内容FenyeDao fd = new FenyeDao();Fenye hfy = fd
33、.selectHuitie(“1“, id);HuitieDao hd = new HuitieDao();List hlist = hd.setHuitie(hfy);/取回帖内容HttpSession hs = request.getSession();hs.setAttribute(“zf“, zf);hs.setAttribute(“huitiefy“, hfy);hs.setAttribute(“hlist“, hlist);return mapping.findForward(“tohuitie“);public ActionForward showhuitie(ActionMap
34、ping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / TODO Auto-generated method stubString showpage = request.getParameter(“showpage“);if(showpage=null|“.equals(showpage)showpage=“1“;HttpSession hs = request.getSession();Fenye hfy1 = (Fenye) hs.getAttribute(“huit
35、iefy“);FenyeDao fd = new FenyeDao();Fenye hfy = fd.selectHuitie(showpage, hfy1.getId();HuitieDao hd = new HuitieDao();List hlist = hd.setHuitie(hfy);/取回帖内容hs.setAttribute(“huitiefy“, hfy);hs.setAttribute(“hlist“, hlist);return mapping.findForward(“tohuitie“);public ActionForward showzhuti(ActionMapp
36、ing mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) String sp=request.getParameter(“showpage“);if(sp=null|“.equals(sp)sp=“1“;FenyeDao fd=new FenyeDao();Fenye zfy=fd.selectZhutie(sp);ZhutiDao zd=new ZhutiDao();List list=zd.selectZhuti(zfy);/取主题列表内容HttpSession hs=req
37、uest.getSession();String dname=(String)hs.getAttribute(“dname“);if(dname=null|“.equals(dname)dname=“customer“;hs.setAttribute(“zhutify“,zfy);hs.setAttribute(“zhutilist“,list);hs.setAttribute(“dname“,dname);return mapping.findForward(“tozhutie“);public ActionForward showuser(ActionMapping mapping, Ac
38、tionForm form,HttpServletRequest request, HttpServletResponse response) HttpSession hs=request.getSession();String dname=(String)hs.getAttribute(“dname“);UserDao ud=new UserDao();UsersForm ufi= ud.selectInf(dname);/取用户信息hs.setAttribute(“ufi“, ufi);return mapping.findForward(“toxiugai“);public Action
39、Forward showAllusers(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) String name=request.getParameter(“name“);UserDao ud=new UserDao();UsersForm uf=ud.selectInf(name);/取用户信息if(uf.getId()=0)request.setAttribute(“u“,“null“);request.setAttribute(“aul“,nu
40、ll);elserequest.setAttribute(“aul“,uf);return mapping.findForward(“tousers“);3.用户登录:单击主界面的登录超级链接,出现如图所示界面denglu.jsp 代码如下:location.reload;JSP for DengluForm form姓名:密码:验证码 : 与 denglu.jsp 相对应的 Action 代码如下:package com.zjy.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.ht
41、tp.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts.action.Action;import org.apache.struts.action.ActionError;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.stru
42、ts.action.ActionMapping;import org.apache.struts.action.ActionMessage;import org.apache.struts.action.ActionMessages;import com.zjy.struts.form.DengluForm;import com.zjy.struts.mypackage.DengluDao;public class DengluAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm
43、 form,HttpServletRequest request, HttpServletResponse response) DengluForm dengluForm = (DengluForm) form;/ TODO Auto-generatedHttpSession hs = request.getSession();String image = (String) hs.getAttribute(“rand“);if (dengluForm.getYzm().equals(image) /判断密码DengluDao dd = new DengluDao();int rst = dd.
44、denglu(dengluForm);if (rst = 0) /用户不存在ActionErrors errors = new ActionErrors();errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(“dengluwrong“);this.addMessages(request, errors);return mapping.getInputForward(); else if(rst=1)/普通用户hs.setAttribute(“dname“, dengluForm.getUsername();request.s
45、etAttribute(“inf“, “1“);hs.setAttribute(“keys“,“0“);/普通用户标记return mapping.findForward(“tomessage“);else/管理员hs.setAttribute(“dname“, dengluForm.getUsername();hs.setAttribute(“keys“,“1“);/管理员标记request.setAttribute(“inf“, “0“);return mapping.findForward(“tomessage“); else /验证码出错System.out.println(“2“);
46、ActionErrors errors = new ActionErrors();errors.add(“yzm“, new ActionError(“yzmwrong“);this.saveErrors(request, errors);return mapping.getInputForward(); 输入正确的用户名和密码后,出现如图所示界面;4.修改个人用户信息:登录成功后,可以单击“修改个人信息”超级链接来更改用户的个人资料信息。界面如下图:xiugai.jsp 代码如下:location.reload;“My JSP xiugai.jsp starting page姓名:“ /旧密码:新密码:确认密码:性别:男女年龄:“ /地址:“ /邮件:“ /验证码:返回主页5.查询用户:单击主页面中的“查询注册用户”超级链接,即可转到查询的模块。users.jsp 代码如下:users.jsp你无此权限!返回主页输入用户名!所查用户不存在!存储编号:姓名:性别:年龄:Email:联系地址:删除用户