1、 软件体系结构汇报书 基于MVC模式软件体系 小型项目标应用 组 号: 24 成 员:01613240 李 尧 01613232孙雨晨 01613227 钱 磊 完成日期: /11/8 项目提要 1、 项目介绍 ①、整体概况介绍 ②、Client端介绍 ③、服务器Tomcat介绍 ④、数据库SQL Server R2
2、介绍 ⑤、整个项目框架图 2、 Model层 ①、数据库连接 ②、添加用户 ③、删除用户 ④、修改用户 ⑤、查询用户 ⑥、为每个登录用户添加Cookie/Session机制 ⑦、定时跳转 ⑧、添加分页功效 ⑨、提供下载功效 ⑩、安全退出后续操作 3、 View层 ①、登录主界面 ②、管理主界面 ③、显示用户管理/用户查询查询结果 ④、显示添加用户元件 ⑤、查找用户界面 ⑥、修改用户主界面 ⑦、删除用户成功/添加用户成功/登陆成功界面/登陆错误页面/修该用 户信息成功页面 ⑧、防盗链页面 4、 Controller层 ①、用户登录控
3、制 ②、防盗链控制(非法登录控制) ③、数据库连接控制 ④、分页控制 ⑤、添加用户页面显示控制 ⑥、定时页面跳转控制 5、 项目测试 项目介绍 1、 整体概况介绍 本项目是基于MVC模式软件体系小型项目标应用,即基于模型(model)-视图(view)-控制器(controller)之间Client端、服务器Tomcat、SQL Server R2数据库应用操作项目。采取MVC框架,是一个软件设计典范,用一个业务逻辑、数据、界面显示分离方法组织代码,将业务逻辑聚集到一个部件里面,在改善和个性化定制界面及用户交互同时,不需要重新编写业务逻辑。MVC被独特发展起来用
4、于映射传统输入、处理和输出功效在一个逻辑图形化用户界面结构中。简单步骤描述能够概括为:用户经过用户端(Client端)访问页面→经过服务器响应用户请求→到数据库中查询数据→返回给用户端(Client端),在这里我们用户端为浏览器端,类似B/S架构。在这种结构下,用户工作界面是经过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,不过关键事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。B/S结构是WEB兴起后一个网络结构模式,WEB浏览器是用户端最关键应用软件。这种模式统一了用户端,将系统功效实现关键部分集中到服务器上,简化了系统开发、维护和使用。用户机上只
5、要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。浏览器经过Web Server同数据库进行数据交互。 这么就大大简化了用户端电脑载荷,减轻了系统维护和升级成本和工作量,降低了用户总体成本(TCO)。 2、 Client端介绍 用户端(Client)或称为用户端,是指和服务器相对应,为用户提供当地服务程序。除了部分只在当地运行应用程序之外,通常安装在一般用户机上,需要和服务端相互配合运行。因特网发展以后,较常见用户端包含了如万维网使用网页
6、浏览器,收寄电子邮件时电子邮件用户端,和即时通讯用户端软件等。对于这一类应用程序,需要网络中有对应服务器和服务程序来提供对应服务,如数据库服务,电子邮件服务等等,这么在用户机和服务器端,需要建立特定通信连接,来确保应用程序正常运行。本项目中使用Internet Explorer 11,360急速浏览器充当用户端。 3、 服务器Tomcat介绍 Tomcat服务器是Apache软件基金会项目中一个开源Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多场所下被普遍使用,是开发和调试JSP 程序首选。对于一个初学者来说,能够这么认为,当在一台机器上配置好Apach
7、e 服务器,可利用它响应HTML(标准通用标识语言下一个应用)页面访问请求。实际上Tomcat 部分是Apache 服务器扩展,但它是独立运行,所以当你运行tomcat 时,它实际上作为一个和Apache 独立进程单独运行。本项目使用是Tomcat 8.0版本(最新)。 4、 数据库SQL Server R2介绍 SQL Server R2 在Microsoft数据平台上公布,能够组织管理任何数据。能够将结构化、半结构化和非结构化文档数据直接存放到数据库中。能够对数据进行查询、搜索、同时、汇报和分析之类操作。数据能够存放在多种设备上,从数据中心最大服务器一直到桌面计算机和移
8、动设备,它全部能够控制数据而不用管数据存放在哪里。SQL Server R2关键应用于小型项目开发,安全稳定,所以本项目将采取它作为我们数据库管理。 5、 整个项目框架图 项目框架图.xlsx,,,,,,项目框架图.htm Model层 1、 数据库连接 数据库连接需要含有JDBC驱动(JDBC“Java Data Base Connectivity,java数据库连接”是一个用于实施SQL语句Java API,能够为多个关系数据库提供统一访问,它由一组用Java语言编写类和接口组成。JDBC提供了一个基准,据此能够构建更高级工具和接口,使数据库开发人员能够编写数据库应用程
9、序。)、需要数据库连接地址和数据库用户名和密码。 实现代码以下: private static Connection dbconn =null; private static final String diverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static final String dbURL="jdbc:sqlserver://localhost:1433; DatabaseName=LoginData"; private static final String UserName=
10、"Yeoo_Server"; private static final String PassWord="liyao5926362"; try { Class.forName(diverName); //加载驱动程序 dbconn = DriverManager.getConnection(dbURL, UserName, PassWord); //连接数据库 System.out.println("SQL Server Connection Successful!"); } catch (SQLException e) { e.printStackTra
11、ce(); } catch (ClassNotFoundException e) { throw new ServletException("加载数据库驱动失败."); }finally{ try { if(dbconn!=null){ dbconn.close(); } } catch (SQLException e) { e.printStackTrace(); } } 2、 添加用户 添加用户功效用AddUserServlet.java实现,服务器经过用户端获取到输入新用户名和密码,然后在数据库中添加一个新用户
12、 代码实现: 数据库连接....(略过) private static PreparedStatement ps; //获取数据库操作对象 private static String SQL_Insert; //数据库查询语句 //从用户端获取到用户输入新用户 String NewUser = request.getParameter("C_Username"); //从用户端获取到用户输入新密码 String NewPass = request.getParameter("C_Password"); //给数据库查询语句赋值 SQL_Inser
13、t = "insert into Table_1(UserName,PassWord) values('"+NewUser+"','"+NewPass+"')"; ps = con.prepareStatement(SQL_Insert); //实施操作语句 ps.executeUpdate(); //更新结果 3、 删除用户 添加用户功效用DeleteServlet.java实现,用户经过用户端点击需要删除用户,由服务器获取到要删除用户UserName,然后在数据库中用语句进行删除。 代码实现: 数据库连接....(略过) private stati
14、c PreparedStatement ps = null; //获取数据库操作对象 String s= request.getParameter("Username"); //获取要删除ID //实施删除语句操作 ps = con.prepareStatement( "delete from Table_1 where UserName='"+s+"'"); ps.executeUpdate(); //更新结果 4、 修改用户 修该用户操作用ModifyUser.jsp(显示目前用户信息)和 ModifySu
15、ccess.jsp(修改目前用户信息)实现,修改用户分为显示目前用户信息,和修改用户信息,同理用户经过在用户端输入需要修改信息,然后又服务器进行获取,在数据库中进行语句修改。 代码实现: 数据库连接....(略过) //显示目前用户信息 PreparedStatement ps = null; //获取数据库操作对象 ResultSet rs =null; String Username = request.getParameter("Username"); //获取ID String PassWrod=null,Email=null,TelePhone=
16、null; //查询改ID全部信息 ps = con.prepareStatement("select PassWord,Email,TelePhone from Table_1 where UserName='"+Username+"'"); rs=ps.executeQuery(); //把结果储存在ResultSet中 while(rs.next()){ //把查询到结果输出到界面 PassWrod = rs.getString("PassWord"); Email = rs.getString("Email");
17、 TelePhone = rs.getString("TelePhone"); out.println( "
UserName : "+Username+"
"); out.println( "PassWord : "+PassWrod+"
"); out.println( "Email : "+Email+"
"); out.println( "TeleP
18、hone : "+TelePhone+"
"); } //修该用户操作 PreparedStatement ps = null; //获取数据库操作对象 String PassWord = request.getParameter("PassWord"); //原始密码 String Email = request.getParameter("Email");//原始邮箱 String TelePhone = request.getParameter("TelePhone");//原始电话 String19、UserName = request.getParameter("UserName"); //默认用户名字 String NewUserPassWord = request.getParameter("PassW"); //修改后密码 //判定新密码是否为空,为空设置为原始密码 if(NewUserPassWord.equals("")){ NewUserPassWord=PassWord; } String NewUserEmail = request.getParameter("Em"); //修改后
20、邮箱 //判定新邮箱是否为空,为空设置为原始邮箱 if(NewUserEmail.equals("")){ NewUserEmail=Email; } String NewUserTelePhone = request.getParameter("Tele"); //修改后电话 //判定新电话是否为空,为空设置为原始电话 if(NewUserTelePhone.equals("")){ NewUserTelePhone=TelePhone; } //实施删除操作语句 ps=c
21、on.prepareStatement("update Table_1 set PassWord='"+NewUserPassWord+"',Email='"+NewUserEmail+"',TelePhone="+NewUserTelePhone+" where UserName='"+UserName+"'"); ps.executeUpdate(); //更新数据 5、 查询用户 查询用户操作用FindUsers.jsp来实现。直接在数据库中进行查询即可,然后输出。 代码实现: 数据库连接....(略过) ResultSet rs =null; //定义
22、数据库结果集对象 PreparedStatement ps = null; //定义数据库操作对象 int pageNow=1; //目前页 int pageSize=6; //每页显示条数 //查询用户全部信息,显示6条 ps = con.prepareStatement("select top 6 UserName,PassWord,Email,TelePhone from Table_1 where UserName not in(select top "+((pageNow-1)*pageSize)+" UserName from Table_1)");
23、 rs = ps.executeQuery(); //把查询储存到ResultSet中 while(rs.next()){ //将结果输出 //获取查询结果中UserName列 User = rs.getString("UserName"); //获取查询结果中PassWord列 Pass = rs.getString("PassWord"); //获取查询结果中Email列 Email = rs.getString("Email"); //获取查询结果中TelePhone列 Te
24、lePhone = rs.getString("TelePhone"); //将结果输出到表格中 out.println("
25、ter("text_1"); //获取用户ID Cookie mycookie = new Cookie("id", str_User); //创建Cookie mycookie.setMaxAge(7*2*24*3600); //设置Cooike生命周期为两周 mycookie.setPath("/"); //设置储存Cookie路径 response.addCookie(mycookie); //添加Cookie给用户端 //获取Session,没有则创建一个 HttpSession session = request.getSession();
26、 session.setAttribute("User", str_User); //向Session中设置属性和属性值
//Cookie使用,为每个用户储存ID,在每个页面显示欢迎每个ID
String id= ""; //定义一个变量用于储存要显示ID
Cookie []c = request.getCookies(); //获取Cookie
for(int i=0;i 27、ue(); //把值(用户ID)赋值给id
}
}
//Session使用,可用于用户非法登录(服务器端)
//取出Session中值
String User = (String)request.getSession().getAttribute("User");
if(User == null){
request.getRequestDispatcher("/Error_2.jsp").forward(request, response);
return;
//立即跳转,假如没有return话会等候页面全部加 28、载完再跳转。
}
7、 定时跳转
定时跳转需要用HTML、JavaScript结合使用。
代码以下:
HTML:
Successfully add a new user to the database , Back home side after 3 seconds
30、ageNow"); if(s!=null){ pageNow = Integer.parseInt(s); } int pageSize = 7; //每页显示条数 int rowCount; //一共有多少条统计(数据库中) int pageCount; //一共要显示多少页(计算出来) ps = con.prepareStatement("select count(*) from Table_1"); rs = ps.executeQuery();
31、rs.next(); //把游标(数据库)向下以一个 rowCount = rs.getInt(1); //获取到一共有多少条统计 pageCount = rowCount%pageSize==0 ? rowCount/pageSize : rowCount/pageSize+1; //计算出一共有多少页 ps = con.prepareStatement("select top 7 UserName,PassWord from Table_1 where UserName not in(select top "+((pa
32、geNow-1)*pageSize)+" UserName from Table_1)"); rs = ps.executeQuery(); //显示分页 out.println("
33、ous Page
"); } for(int i=0;i34、MyWebServer/Manager_User.jsp?pageNow="+(pageNow+1)+"\">Next Page
"); } 9、 提供下载功效 下载功效由DownLoadServlet.java实现 response.setHeader("Content-Disposition", "attachment; filename=2.jpg"); String path = this.getServletContext().getRealPath("2.jpg"); FileInputStream fin = new FileInput35、Stream(path); byte[] buff = new byte[1024]; int len=0; OutputStream os = response.getOutputStream(); while((len=fin.read(buff))>0){ os.write(buff, 0, len); } os.close(); fin.close(); 10、 安全退出后续操作 安全退出返回登录主界面(MyJsp.jsp)之外,还需要销毁Cookie和Session,即清除用户登录痕迹和为用户保留用户信息。 实现原理为
36、把Cookie和Session生命周期设为0. 关键代码: mycookie.setMaxAge(0); session.setMaxInactiveInterval(0); View层 1、 登录主界面 由MyJsp.jsp实现,需要用到CSS样式表。 效果图: 样式表内容: Body内容:
Welcome <%=id %> To Visit This Website!
Main interface
44、