




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
案例:用户管理系统(基于JSP、JDBC和JavaBean)本讲将基于之前介绍的JSP、MySQL、JDBC和JavaBean等知识,设计和实现一个综合的用户注册登录及信息管理系统。具体内容如下:l JSP、MySQL、JDBC和JavaBean的基础知识及其运用过程、方法1.1 系统功能本系统中,只有一类用户,即注册用户。用户注册到系统中后,可以登录到系统中,并可以查看个人信息、查询/浏览和删除系统中的其他人员信息。概括后,我们将主要提供以下功能:1)用户注册;2)用户登录;3)浏览所有用户信息;4)按条件查询用户信息;5)删除某个用户;1.2 系统概要设计系统设计是新系统的物理设计阶段。根据系统分析阶段所确定的新系统的功能要求,设计出一个能实施的方案,即建立新系统的物理模型。这个阶段的任务是:设计软件系统的模块层次结构、设计数据库的结构以及设计模块的控制流程,其目的是明确软件系统“如何做”。这个阶段又分两个步骤:概要设计和详细设计。概要设计解决软件系统的模块划分和模块的层次机构以及数据库设计;详细设计解决每个模块的控制流程、内部算法和数据结构的设计。1系统架构设计该程序主要由JSP、JavaBean和JDBC实现。这三种技术中,JSP主要用于与用户的交互界面;JavaBean用于封装数据,即JSP中提交的数据或从数据库中读取的数据都将封装在JavaBean中;JDBC用于实现对数据库的读写操作。Error! Reference source not found.给出了本系统的主要技术架构。客户端浏览器数据库JSP(JDBC)JavaBeanTomcat请求响应调用返回操作结果系统架构2系统页面和类设计我们针对上述系统需求的功能进行逐个设计。1)用户注册为实现用户注册,我们需要设计一个界面以便用户输入其基本信息;用户录入基本信息后,系统将这些基本信息存到数据库中。因此,我们将设计如Error! Reference source not found.所示页面流程实现该功能。其中,index.jsp为系统首页;register.jsp提供一个信息输入界面,registerProcess.jsp接收用户所输入的数据,并调用User类的register方法将数据保存到数据库中。为了向用户及时反馈注册成功/失败信息,register方法将返回一个逻辑值。register.jspregisterProcess.jspUser.register()提交数据调用方法提示结果成功失败login.jsp用户注册流程2)用户登录用户注册后,数据库中将保存用户的登录用户名和密码,因此,要实现该功能,只需要提供一个登录界面,然后接收用户输入的用户名和密码并与数据库中保存的信息进行比对即可,其具体页面和流程如Error! Reference source not found.所示。login.jsp和loginProcess.jsp的功能同注册流程;login方法同样将返回一个逻辑值以反映用户登录是否成功。register.jspregisterProcess.jspUser.register()提交数据调用方法提示结果成功失败login.jsploginProcess.jspUser.login()调用方法main.jsp成功失败提交数据用户登录流程3)用户信息管理用户登录成功后,可以查看所有用户信息,可以按一定条件查询用户,在查看用户信息时,可以删除某个用户。main.jsplistUsers.jspqueryUsers.jspqueryProcess.jsp查询条件为空查询条件通过request的属性传递User.query()deleteUser.jspQueryCondition.generateSQLStr()用户查询流程查看所有用户和查询用户的结果形式是一样的,所以可以统一到listUsers.jsp页面中去显示,将查看所有用户看作是没有查询条件的查询。查询条件由queryUsers.jsp页面输入,输入后由queryProcess.jsp页面处理,全部参数由一个QueryCondition对象(JavaBean)接收,并传递给listUsers.jsp页面。在listUsers.jsp页面,调用QueryCondition对象的generateSQLStr()方法生成查询语句。在查询结果中,以表格的形式将用户信息显示在网页上,每一行为一个用户。为了增加删除用户的操作,在每一行的后面添加一个删除按钮(实际为超级链接),调用deleteUser.jsp,具体删除哪个用户由用户的id确定,因为每个用户的id是唯一的,不会出现错删的情况。要删除的用户的id通过一个参数传递给deleteUser.jsp。1.3 详细设计和实现基于以上概要设计内容,这里给出系统的详细设计和具体实现步骤。1.3.1 创建数据库表首先使用MySQL-Front创建一个数据库login,并指定其编码方式为gbk,然后按下列表结构创建相关数据表。1用户信息表为了有效存储用户相关信息,设计用户基本信息表如下:表 01 user表结构字段名字段类型宽度字段说明idInt关键字,自增1userNameVarchar10用户名passwordVarchar10密码trueNameVarchar10真实姓名sexInt性别,0表示男,1表示女1.3.2 创建login.jsp和register.jsp创建login.jsp页面,主要代码如下:用户名:口令:注册创建register.jsp页面,代码如下:用户名:口令:真实姓名:性别:男女返回登录页面1.3.3 创建JavaBean:User、DAO创建beans包。注意,所有JavaBean都必须放到某个包中,在缺省包中的类在JSP页面中无法使用。在beans包中创建User类,添加属性:int id;String userName;String password;String trueName;int sex;生成getter/setter方法:在源代码空白处点右键,选择Source generate Getters/Setters。在beans包中创建DAO类,添加静态(static)方法:getConnection,代码如下:public static Connection getConnection() throws ClassNotFoundException, SQLExceptionConnection conn = null;Class.forName(com.mysql.jdbc.Driver);String dburl = jdbc:mysql:/127.0.0.1:3306/login?user=root&password=&characterEncoding=gbk;conn = DriverManager.getConnection(dburl);return conn;1.3.4 实现注册流程创建registerProcess.jsp页面,代码如下:用户名: 口令: 真实姓名: 性别: % if(user.register()out.print(注册成功);out.print(登录); else out.print(注册失败);out.print(返回注册页面);%为User类编写register()方法public boolean register() throws ClassNotFoundException, SQLExceptionboolean ret = false;String sql = INSERT INTO user (userName, password, trueName, sex) VALUES(+ userName + , + password + , + trueName + , + sex + );ret = DAO.executeUpdate(sql);return ret;为DAO类编写executeUpdate()方法public static boolean executeUpdate(String sql) throws ClassNotFoundException, SQLExceptionboolean ret = false;Connection conn = getConnection();Statement stat = conn.createStatement();if(stat.executeUpdate(sql)0)ret=true;stat.close();conn.close();return ret;测试运行,此时会出现找不到jdbc驱动的异常,解决方法是将mysql-connector-java-5.1.18-bin.jar加入项目的库中,并设置为发布时也使用,具体方法如下:1) 选择Project Properties,在项目属性对话框左边的选项中选择Java Build Path,在右边选择Libraries分页,从右边的按钮中选择Add External JARs;在文件选择对话框中选中mysql-connector-java-5.1.18-bin.jar文件,选打开。2) 在项目属性对话框左边的选项中选择J2EE Module Dependencies,在右边的表格中将mysql-connector-java-5.1.18-bin.jar前面选中,然后点右下角的应用。1.3.5 实现登录流程创建loginProcess.jsp页面,代码如下:%if(user.login()out.print(登录成功);out.print(进入主页面); else out.print(登录失败);%返回登录页面注册为User类编写login()方法public boolean login() throws ClassNotFoundException, SQLExceptionisLogin = false;String sql = SELECT * FROM user WHERE userName= +userName+ and password= + password +;ResultSet rs = null;Connection conn = DAO.getConnection();Statement stat = conn.createStatement();rs = stat.executeQuery(sql);if(rs.next()isLogin = true;trueName = rs.getString(trueName);sex = rs.getInt(sex);rs.close();stat.close();conn.close();return isLogin;注意,需要同时为User类声明isLogin属性和isLogin()方法,用于以后的其他页面判断用户是否登录用。代码如下:boolean isLogin = false;public boolean isLogin()return isLogin;思考:此处为什么没有象注册流程中的executeUpdate()方法那样,先为DAO类编写executeQuery()方法,再从User类的login()方法中调用?原因如下:如果设计一个executeQuery()方法,需要返回一个ResultSet对象;要使用这个ResultSet对象,就不能关闭其所属的Connection和Statement;因此不能在executeQuery()方法中关闭Connection和Statement,只能是由executeQuery()方法的调用者在使用完ResultSet对象后再关闭;这样会使得Connection和Statement对象需要由两个以上的方法维护,容易出现忘记关闭的问题,而且使得代码的不易读懂。1.3.6 注册时检查userName是否存在为User类添加isUserExist()方法,代码如下:boolean isUserExist(String name) throws ClassNotFoundException, SQLExceptionboolean ret = false;Connection conn = DAO.getConnection();Statement stat = conn.createStatement();String sql = SELECT * FROM user WHERE userName= + name + ;ResultSet rs = stat.executeQuery(sql);if(rs.next() ret = true;rs.close();stat.close();conn.close();return ret;为User类添加errorStr属性传递出错原因String errorStr;public String getErrorStr() return errorStr;修改User类的register()方法public boolean register() throws ClassNotFoundException, SQLExceptionboolean ret = false;if(!isUserExist(userName) String sql = INSERT INTO user (userName, password, trueName, sex) VALUES(+ userName + , + password + , + trueName + , + sex + );ret = DAO.executeUpdate(sql); else errorStr = 用户名 + userName + 已经存在;return ret;为registerProcess.jsp添加对出错原因的显示用户名: 口令: 真实姓名: 性别: % if(user.register()out.print(注册成功);out.print(登录); else out.print(注册失败);out.print(失败原因: + user.getErrorStr() + );out.print(返回注册页面);%1.3.7 列出所有用户添加main.jsp页面,主要代码如下:用户管理列出所有用户查找用户前面五行是防止用户不登录就访问此页。同理,后面的所有页面也都需要这些代码。如无特殊需要,这些代码将不再列出。为User类添加query()方法public static List query() throws ClassNotFoundException, SQLExceptionList users = new ArrayList();String sql = SELECT * FROM user ;Connection conn = DAO.getConnection();Statement stat = conn.createStatement();ResultSet rs = stat.executeQuery(sql);while(rs.next()User user = new User();user.setId(rs.getInt(id);user.setUserName(rs.getString(userName);user.setPassword(rs.getString(password);user.setTrueName(rs.getString(trueName);user.setSex(rs.getInt(sex);users.add(user);rs.close();stat.close();conn.close();return users;此方法中将数据库中的记录读出来,然后每一条记录放入一个User对象中,所有User对象放入一个List中,作为结果返回。思考为什么这样做?添加listUsers.jsp页面,主要代码如下:用户列表用户名姓名性别%List users = beans.User.query();Iterator iter = users.iterator();while(iter.hasNext() beans.User u = (beans.User)iter.next();/out.print( + u.getUserName() + + u.getTrueName() + + (u.getSex()=0?男:女) + );% 返回主页面此页面中使用了html的table来显示批量数据。使用了一个while循环来把记录一条一条放到table中,每条记录一行。一行中,可以用out.print的形式输出,也可以采用将html代码插入Java代码中的形式,因为最终会被转化成out.print的形式。此处是列出所有用户,所以并没有添加任何查询条件。1.3.8 添加删除用户功能为listUsers.jsp的列表中添加一列删除操作用户列表用户名姓名性别删除%List users = beans.User.query();Iterator iter = users.iterator();while(iter.hasNext() beans.User u = (beans.User)iter.next();/out.print( + u.getUserName() + + u.getTrueName() + + (u.getSex()=0?男:女) + );% a href=deleteUser.jsp?id= 删除 返回主页面在每一行的删除用户的超级链接中,采用参数id将用户的id传递给deleteUser.jsp。创建deleteUser.jsp页面返回用户列表通过参数id将要删除的用户的id取出。为User类编写delete()方法public static boolean delete(String id) throws ClassNotFoundException, SQLException boolean ret = false;String sql = DELETE FROM user WHERE id= + id;ret = DAO.executeUpdate(sql);return ret;1.3.9 添加查询用户功能条件查询功能是通过SQL语句中的WHERE子句来实现的。如要查询用户名为abc的记录可以用如下语句:SELECT * FROM user WHERE userName=abc对于字符串型的字段,还可以用模糊匹配运算符%来实现“包含”操作。如要查询用户名中包含a的记录可以用如下语句:SELECT * FROM user WHERE userName like %a%多个查询条件之间可以用AND或OR连接起来。如要查询用户名为abc且性别为男的记录可以用如下语句:SELECT * FROM user WHERE userName=abc AND sex=0实现条件查询功能就是让用户输入查询条件,然后生成WHERE子句,再交给listUsers.jsp页面去查询显示。具体步骤如下:创建queryUsers.jsp页面,查询条件包括userName等于或包含某字符串,trueName等于或包含某字符串,sex等于0或1,多个条件之间是并且的关系,不是或的关系。查找用户用户名 =包含 并且姓名=包含 并且 性别 = 不限男女创建QueryCondition类(JavaBean)接收queryUsers.jsp页面输入的参数,即查询条件。String userNameOp;String userNameValue;String trueNameOp;String trueNameValue;String sexValue;public String generateSQLStr()if(userNameValue!=null)userNameValue = userNameValue.trim();/去掉两边可能有的多余的空格if(trueNameValue!=null)trueNameValue = trueNameValue.trim();StringBuffer sqlStr = new StringBuffer(50);if(userNameValue!=null & userNameValue.length()0) if(userNameOp.equals(=) sqlStr.append(userName= + userNameValue + );else sqlStr.append(userName like % + userNameValue + % );if(trueNameValue!=null & trueNameValue.length()0) if(sqlStr.length()0) sqlStr.append( AND );if(trueNameOp.equals(=) sqlStr.append(trueName= + trueNameValue + );else sqlStr.append(trueName like % + trueNameValue + % );if(sexValue!=null & !sexValue.equals(不限) if(sqlStr.length()0) sqlStr.append( AND );sqlStr.append(sex= + (sexValue.equals(男)?0:1) );if(sqlStr.length()0) return WHERE + sqlStr.toString();else return ;创建queryProcess.jsp页面cond对象是request的属性,接收queryUsers.jsp页面的输入参数,也被传递给listUsers.jsp。修改listUsers.jsp页面,添加对查询条件的处理用户列表用户名姓名性别删除%out.print(cond.generateSQLStr() + );List users = beans.User.query(cond.generateSQLStr();Iterator iter = users.iterator();while(iter.hasNext() beans.User u = (beans.User)iter.next();/out.print( + u.getUserName() + + u.getTrueName() + + (u.getSex()=0?男:女) + );% a href=deleteUser.jsp?id= 删除 返回主页面修改User.query()方法,添加对查询条件的处理public static List query(String cond) throws ClassNotFoundException, SQLExceptionList users = new ArrayList();String sql = SELECT * FROM user + cond;Connection conn = DAO.getConnection();Statement stat = conn.createStatement();ResultSet rs = stat.executeQuery(sql);while(rs.next()User user = new User();user.setId(rs.getInt(id);user.setUserName(rs.getString(userName);user.setPassword(rs.getString(password);user.setTrueName(rs.getString(trueName);user.setSex(rs.getInt(sex);users.add(user);rs.close();stat.close();conn.close();return users;1.3.10 添加排序功能在列出用户时可以根据不同字段排序,这一功能是通过SQL语句中的ORDER BY子句来实现的。如按用户名排序可以用下面的语句:SELECT * FROM user ORDER BY userName ASC最后的ASC表示按升序排列,若要按降序排列,应使用DESC,如按性别降序排列可以用下面的语句:SELECT * FROM user ORDER BY sex DESCORDER BY子句可以和上一节中的WHERE子句同时使用,放在其后面。添加排序功能就是让用户输入排序的字段和顺序,然后生成ORDER BY子句,再传给listUsers.jsp去查询显示即可。具体步骤如下:在listUsers.jsp中添加一个输入排序字段和顺序的form,代码如红色部分下:用户列表按用户名姓名性别 排序 升序降序用户名姓名性别删除%out.print(cond.generateSQLStr() + );List users = beans.User.query(cond.generateSQLStr();Iterator iter = users.iterator();while(iter.hasNext() beans.User u = (beans.User)iter.next();/out.print( + u.getUserName() + + u.getTrueName() + + (u.getSex()=0?男:女) + );% a href=deleteUser.jsp?i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美的集团工作流程体系
- 2025年事业单位工勤技能-湖北-湖北水生产处理工三级(高级工)历年参考题库含答案解析
- 文化场馆扩建工程2025年社会稳定风险评估研究
- 2025年事业单位工勤技能-浙江-浙江土建施工人员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南舞台技术工一级(高级技师)历年参考题库含答案解析
- 2024版房产证抵押合同样本
- 2025年事业单位工勤技能-河北-河北理疗技术员三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江西-江西药剂员三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西计算机信息处理员二级技师历年参考题库含答案解析
- 2025年事业单位工勤技能-广西-广西放射技术员四级(中级工)历年参考题库典型考点含答案解析
- 6G多维度切片QoS保障-洞察及研究
- 2025-2026学年外研版(三起)(2024)小学英语四年级上册教学计划及进度表
- 高考3500词汇表(完整版)
- 应急第一响应人理论考试试卷(含答案)
- 新人教A必修一《集合》课件
- 复用器械处理流程
- 静安沉恒 沉子恒
- GB/T 23510-2009车用燃料甲醇
- GB/T 14216-2008塑料膜和片润湿张力的测定
- 警械使用课件
- 人教版小学三年级英语上册期中考试试卷
评论
0/150
提交评论