软件体系结构报告书
软件体系结构报告书
基于MVC 模式的软件体系
小型项目的应用
组 号:成 员:01613240 李 尧
01613232孙雨晨
01613227 钱 磊
完成日期:
项目提纲
1、 项目介绍
①、整体概况介绍
②、Client 端介绍
③、服务器Tomcat 介绍
④、数据库SQL Server 2008 R2介绍
⑤、整个项目框架图
2、 Model 层
①、数据库的连接
②、添加用户
③、删除用户
④、修改用户
⑤、查询用户
⑥、为每个登录用户添加Cookie/Session机制
⑦、定时跳转
⑧、添加分页功能
⑨、提供下载功能
⑩、安全退出后续操作
3、 View 层
①、登录主界面
②、管理主界面
③、显示用户管理/用户查询查询结果
④、显示添加用户元件的
⑤、查找用户界面
⑥、修改用户主界面
⑦、删除用户成功/添加用户成功/登陆成功界面/登陆错误页面/修该用 户信息成功页面
⑧、防盗链页面
4、 Controller 层
①、用户登录控制
②、防盗链控制(非法登录控制)
③、数据库连接控制
④、分页控制
⑤、添加用户页面显示控制
⑥、定时页面跳转控制
5、 项目测试
项目介绍
1、 整体概况介绍
本项目是基于MVC 模式的软件体系小型项目的应用,即基于模型(model)-视图(view)-控制器(controller)之间的Client 端、服务器
Tomcat 、SQL Server 2008 R2数据库的应用操作项目。采用MVC 框架,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。简单流程的描述可以概括为:用户通过客户端(Client 端)访问页面→通过服务器响应用户的请求→到数据库中查询数据→返回给客户端(Client 端),在这里我们的客户端为浏览器端,类似B/S架构。在这种结构下,用户工作界面是通过WWW 浏览器来实现,极少部分事务逻辑在前端
(Browser)实现,但是主要事务逻辑在服务器端(Server ) 实现,形成所谓三层3-tier 结构。B/S结构是WEB 兴起后的一种网络结构模式,WEB 浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser ),如Netscape Navigator或
Internet Explorer,服务器安装Oracle 、Sybase 、Informix 或 SQL Server等数据库。浏览器通过Web Server同数据库进行数据交互。 这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。
2、 Client 端介绍
客户端(Client )或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。对于这一类应用程序,需要网络中有相应的服务器和服务程序来提供相应的服务,如数据库服务,电子邮件服务等等,这样在客户机和服务器端,需要建立特定的通信连接,来保证应用程序的正常运行。本项目中使用Internet Explorer 11,360急速浏览器充当客户端。
3、 服务器Tomcat 介绍
Tomcat 服务器是Apache 软件基金会项目中的一个开源的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML (标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。本项目使用的是Tomcat 8.0的版本(最新)。
4、 数据库SQL Server 2008 R2介绍
SQL Server 2008 R2 在Microsoft 的数据平台上发布,可以组织管理任何数据。可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。SQL Server 2008 R2主要应用于小型的项目开发,安全稳定,所以本项目将采用它作为我们的数据库管理。
5、 整个项目框架图
项目框架图.xlsx ,,,,,, 项目框架图.htm
Model 层
1、 数据库的连接
数据库的连接需要具备JDBC 驱动(JDBC “Java Data Base
Connectivity,java 数据库连接”是一种用于执行SQL 语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。)、需要数据库连接地址以及数据库用户名和密码。
实现代码如下:
privatestatic Connection dbconn =null ;
privatestaticfinal String diverName =
"com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
privatestaticfinal String dbURL ="jdbc:sqlserver://localhost:1433; DatabaseName=LoginData";
privatestaticfinal String UserName ="Yeoo_Server";
privatestaticfinal String PassWord ="liyao5926362" ;
try {
Class. forName (diverName ); //加载驱动程序 dbconn = DriverManager.getConnection (dbURL , UserName ,
PassWord ); //连接数据库
System. out .println("SQL Server 2008 Connection Successful!" ); } catch (SQLException e ) { e .printStackTrace(); } catch (ClassNotFoundException e ) { thrownew ServletException(" 加载数据库驱动失败." ); }finally { try { if (dbconn !=null ){ dbconn .close(); }
} catch (SQLException e ) { e .printStackTrace(); } }
2、 添加用户
添加用户功能用AddUserServlet.java 实现,服务器通过客户端获取到输入的新用户名和密码,然后在数据库中添加一个新用户。
代码的实现: 数据库的连接.... (略过)
privatestatic PreparedStatement ps ; //获取数据库操作对象
privatestatic String SQL_Insert;//数据库查询的语句
//从客户端获取到用户输入的新用户
String NewUser = request .getParameter("C_Username");
//从客户端获取到用户输入的新密码
String NewPass = request.getParameter("C_Password");
//给数据库查询语句赋值
SQL_Insert = "insert into Table_1(UserName,PassWord)
values('"+NewUser +"','" +NewPass +"')" ;
ps = con .prepareStatement(SQL_Insert); //执行操作语句
ps .executeUpdate();
//更新结果
3、 删除用户
添加用户功能用DeleteServlet.java 实现,用户通过客户端点击需要删除的用户,由服务器获取到要删除用户的UserName ,然后在数据库中用语句进行删除。
代码的实现:
数据库的连接.... (略过)
privatestatic PreparedStatement ps = null ; //获取数据库操作对象
String s = request .getParameter("Username" );//获取要删除的ID //执行删除语句的操作
ps = con .prepareStatement(
"delete from Table_1 where UserName='"+s +"'" );
ps .executeUpdate(); //更新结果
4、 修改用户
修该用户操作用ModifyUser.jsp (显示当前用户信息)和
ModifySuccess.jsp (修改当前用户信息)实现,修改用户分为显示当前用户的信息,和修改用户信息,同理用户通过在客户端输入需要修改的信息,然后又服务器进行获取,在数据库中进行语句修改。
代码的实现: 数据库的连接.... (略过)
//显示当前用户的信息
PreparedStatement ps = null ;
ResultSet rs =null ;
String Username = request.getParameter("Username" ); //获取ID String PassWrod=null ,Email=null ,TelePhone=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" ); TelePhone = rs.getString("TelePhone" ); out.println( "
UserName : "+Username+"
"); out.println( "
PassWord : "+PassWrod+"
"); out.println( "
Email : "+Email+"
"); out.println( "
TelePhone : "+TelePhone+"
");
}
//修该用户操作
PreparedStatement ps = null ; //获取数据库操作对象
String PassWord = request.getParameter("PassWord" ); //原始密码 String Email = request.getParameter("Email" ); //原始邮箱
String TelePhone = request.getParameter("TelePhone" ); //原始电话
String UserName = request.getParameter("UserName" ); //默认用户名字
String NewUserPassWord = request.getParameter("PassW" ); //修改后的密码
//判断新的密码是否为空,为空设置为原始密码 if (NewUserPassWord.equals("" )){ NewUserPassWord=PassWord; } String NewUserEmail = request.getParameter("Em" ); //修改后的邮箱
//判断新的邮箱是否为空,为空设置为原始邮箱 if (NewUserEmail.equals("" )){
NewUserEmail=Email; } String NewUserTelePhone = request.getParameter("Tele" ); //修改后的电话
//判断新的电话是否为空,为空设置为原始电话 if (NewUserTelePhone.equals("" )){ NewUserTelePhone=TelePhone; } //执行删除操作语句
ps=con.prepareStatement("update Table_1 set
PassWord='"+NewUserPassWord+"',Email='"+NewUserEmail+"',TelePhon e="+NewUserTelePhone+" where UserName='"+UserName+"'" );
ps.executeUpdate(); //更新数据
5、 查询用户
查询用户操作用FindUsers.jsp 来实现。直接在数据库中进行查询即可,然后输出。
代码的实现:
数据库的连接.... (略过)
ResultSet rs =null ; //定义数据库结果集对象
//定义数据库操作对象 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)");
rs = ps.executeQuery(); while (rs.next()){ //把查询储存到ResultSet 中 //将结果输出 //获取查询结果中的UserName 列 User = rs.getString("UserName" ); //获取查询结果中的PassWord 列 Pass = rs.getString("PassWord" ); //获取查询结果中的Email 列 Email = rs.getString("Email" ); //获取查询结果中的TelePhone 列 TelePhone = rs.getString("TelePhone" ); //将结果输出到表格中
out.println("
");
}
6、 为每个登录用户添加Cookie/Session机制
登录成功后为每个用户添加Cookie/Session机制,可储存用户的信息,可防止用户非法登录等等功能。
代码的实现:
//获取用户ID String str_User = request .getParameter("text_1");
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();
session .setAttribute("User" , str_User);//向Session 中设置属性与属性值
//Cookie的使用,为每个用户储存ID ,在每个页面显示欢迎每个ID String id= "" ; //定义一个变量用于储存要显示的ID Cookie []c = request.getCookies();
for (int i=0;i
//Session的使用,可用于用户的非法登录(服务器端)
//取出Session 中的值
String User = (String)request.getSession().getAttribute("User" ); if (User == null ){
request.getRequestDispatcher("/Error_2.jsp").forward(request, response); return ;
//立即跳转,如果没有return 的话会等待页面全部加载完再跳转。 }
7、 定时跳转
定时跳转需要用HTML 、JavaScript 结合使用。
代码如下:
HTML :
MyWebServer/LoginMain.jsp ">
Successfully add a new user to the database , Back home side after 3 seconds
JavaScript :
8、
添加分页功能 //定义分页需要的四个变量 int pageNow = 1; //现在处于第几页 //接受用户的pageNow String s = request.getParameter("pageNow" ); 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(); 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 "+((pageNow-1)*pageSize)+" UserName from Table_1)");
rs = ps.executeQuery();
//显示分页 out.println("
"); if (pageNow!=1){ //如果当前页不等于第一页,显示第一页超链接
out.println("
href=\"http://localhost:8080/MyWebServer/Manager_User.jsp?pageNow=" +(pageNow-1)+"\">Previous Page");
}
for (int i=0;i
out.println("
href=\"http://localhost:8080/MyWebServer/Manager_User.jsp?pageNow=" +(i+1)+"\">"+(i+1)+"");
}
if (pageNow!=pageCount){//如果当前页不等于最右一页,显示最后一页 out.println("
href=\"http://localhost:8080/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 FileInputStream(path );
byte [] buff = newbyte [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 ,即清除用户的登录痕迹以及为用户保存的用户信息。
实现原理为:把Cookie 和Session 的生命周期设为0. 关键代码: mycookie.setMaxAge(0); session .setMaxInactiveInterval(0);
View 层
1、 登录主界面
由MyJsp.jsp 实现,需要用到CSS 样式表。
效果图:
样式表内容:
Body 内容:
2、
管理主界面
由LoginMain.jsp 实现,需要用到CSS 样式表。
效果图:
样式表内容:
Body 内容:
Welcome To Visit This Website!
Main interface
Managing User
Add User
Find Users
Safety Exit
下载本页面背景图片
Add New Users To The Database
3、 显示用户管理/用户查询查询结果
由Manager_User.jsp实现。需要用到CSS 样式表和JSP 输出。 效果图:
CSS 样式表:
Body 内容:
Main interface
Managing User
Add User
Find Users
Safety Exit
Welcome To Visit This Website!
下载本页面背景图片
JSP 输出用户查询结果:
out.println("
");
out.println("
");
}
//显示分页
out.println("
");
if (pageNow!=1){
out.println("
href=\"Manager_User.jsp?pageNow="+(pageNow-1)+"\">Previous Page");
}
for (int i=0;i
out.println("
href=\"Manager_User.jsp?pageNow="+(i+1)+"\">"+(i+1)+""); }
if (pageNow!=pageCount){
out.println("
href=\"Manager_User.jsp?pageNow="+(pageNow+1)+"\">Next
Page");
}
out.println("
");
4、 显示添加用户元件
在Manager_User中实现,需要用到CSS 样式表
效果图:
样式表内容:
#div2{position :absolute ; top :460px ; left :252px ; display :none ;} #div2fieldset {border-color :black ; padding-top : 15px
;}
black ; width :150px ; cursor : pointer ;} .a:hover{border :1px solid white; color :white ; transition :all ease-in .3s;} .b {border :1px solid black; background :transparent ;}
Body 里的内容:
Add New Users To The Database
5、 查找用户界面
由FindUsers.jsp 实现,需要用到CSS 样式表和JSP 输出用户信息
效果图:
样式表内容:
Body 内容:
Welcome To Visit This Website!
Main interface
Managing User
Add User
Find Users
Safety Exit
Add New Users To The Database
JSP 输出用户信息: out.println("
UserName |
class=\"TT\">PassWord |
Modify User |
Delete User"); while (rs.next()){ User = rs.getString("UserName" ); Pass = rs.getString("PassWord" ); out.println(" |
"+User+" | "+Pass+" | ModifyUser | Delete User |
");
out.println("
");
}
out.println("
UserName |
class=\"td_a\">PassWord |
TelePhone"); while (rs.next()){ User = rs.getString("UserName" ); Pass = rs.getString("PassWord" ); Email = rs.getString("Email" ); TelePhone = rs.getString("TelePhone" ); out.println(" |
|
"+User+" | "+Pass+" | "+Email+" | "+TelePhone+" |
");
out.println("
");
if (pageNow!=1){
out.println("
FindUsers.jsp?pageNow="+(pageNow-1)+"\">Previous Page"); }
for (int i=0;i
out.println("
FindUsers.jsp?pageNow="+(i+1)+"\">"+(i+1)+"");
}
if (pageNow!=pageCount){
out.println("
FindUsers.jsp?pageNow="+(pageNow+1)+"\">Next Page");
} out.println("
");
6、 修该用户主界面
由ModifyUser.jsp 实现,需要用到CSS 样式表和JSP 输出用户信息和修改用户信息。
效果图:
样式表内容:
Body 内容:
/>
Jsp 输出用户信息和修该用户信息:
out.println("
");
out.println("
Information for this user
");
while (rs.next()){
PassWrod = rs.getString("PassWord" );
Email = rs.getString("Email" );
TelePhone = rs.getString("TelePhone" );
out.println("
UserName : "+Username+"
"); out.println("
PassWord : "+PassWrod+"
"); out.println("
Email : "+Email+"
");
out.println("
TelePhone : "+TelePhone+"
"); }
out.println("
");
out.println("");
7、 删除用户成功/添加用户成功/登陆成功界面/登陆错误页面/修改用
户信息成功页面
删除用户成功:由DeleteOK.jsp 实现,需要用到CSS 样式表
效果图:
Body 内容:
Users Delete Success Return Home Page 样式表内容:
添加用户成功:由AddSuccess.jsp 实现,需要用到CSS 样式表。
效果图:
Body 内容:
Successfully add a new user to the database , Back home side after 3 seconds
样式表内容:
登录成功界面:由LoginSuccess.jsp 实现,需要用到CSS 样式表 效果图:
Body 内容:
Successful Landing Page Is About Challenge, Please Wait 3 Seconds
样式表内容:
登录错误界面:由Error.jsp 实现,需要用到CSS 样式表
效果图:
Body 内容:
TRTURN TO THE
HOME PAGE
样式表内容:
修改用户信息成功页面:由ModifySuccess.jsp 实现,用到CSS 样式表. 效果图:
Body 内容:
Modify User Success!
Return Home Page...
样式表内容:
Controller 层
1、
用户登录控制
当用户在登录主界面输入用户名和密码登录时时,会提交到
LoginServer.java ,此时会向数据库里查询用户是否是合法用户,不正确则会令其跳转到登录失败页面(Error.jsp ),成功则进入主界面。
String str_User = request .getParameter("text_1"); //用户输入的ID //用户输入的密码
String str_Pass =request .getParameter("password_1"); String RsPassWord =null ; //从数据库中查询出来的用户密码
if (!"" .equals(str_User)&&!"" .equals(str_Pass)){
try {
//如果输入的用户名或密码不为空,连接数据库进行查询
//加载驱动程序
Class. forName (diverName );
dbconn = DriverManager.getConnection (dbURL ,
UserName , PassWord ); //连接数据库
System. out .println("SQL Server 2008 Connection
Successful !" );
ps = dbconn .prepareStatement("select PassWord from Table_1 where UserName='"+str_User+"'" ); rs = ps .executeQuery();
while (rs .next()){
//如果查询的结果还有下一条的话
RsPassWord =rs .getString("PassWord" ); }
if (RsPassWord ==null ){ //如果登录失败
response .sendRedirect(Site_Error);
}elseif (str_Pass.equals(RsPassWord .trim())){ //登陆成功
response .sendRedirect(Site ); return ; }else { response .sendRedirect(Site_Error); return ; }
} catch (SQLException e ) { e .printStackTrace();
} catch (ClassNotFoundException e ) {
thrownew ServletException(" 加载数据库驱动失败." );
}finally { try { if (ps !=null ){ ps .close(); } if (dbconn !=null ){ dbconn .close(); } } catch (SQLException e ) { e .printStackTrace(); } } }else {
out .write(" 用户名或密码为空, 请重新输入." ); }
2、
防盗链控制(非法登录控制)
防盗链控制是指防止用户不通过登录的途径直接访问数据内容。
解决方法为:使用Session 技术,当用户登陆过后,立即把登陆过的用户添加到Session 中,然后在需要防止盗链的页面上添加以下内容即可,判断如果返回的Session 为空(null ),说明该用户非法登录,阻止掉或跳转到提示页面即可。
//获取Session 对象,如果没有则创建一个。
HttpSession session = request .getSession();
//把登陆成功的ID 添加到Session 中
session .setAttribute("User" , str_User);
在需要防止盗链的页面添加以下内容:
//取出Session 中的值
String User = (String)request.getSession().getAttribute("User" );
//取出登录成功的用户ID
if (User== null ){ //如果等于null 说明用户非法盗链
request.getRequestDispatcher("/Error_2.jsp").forward(request,
response); //跳转到错误页面
return ; //立即跳转,如果没有return 会等待页面全部加载完再跳转。}
3、
数据库连接控制
数据库的连接不是每执行操作都要进行数据库的连接,只有在需要
的时候,把数据库的连接封装成一个对象,再调用该对象的方法进行连接,用完数据库后还要及时关闭数据库以及各种数据流,节省该项目对电脑资源的消耗。 4、
分页控制
分页控制是指把从数据库查询后的数据在客户端进行分页的形式展具体代码内容可参考Model 层里面的数据库的连接操作。
示,不需要把所有数据都一起展示出来,那样也会影响前端页面的美观,分页技术在BBS 中使用特别广泛。如果数据内容比较多,分页控制其实
就是把数据内容分成若干页,再控制每页要显示的条数,进而达到分页控制的目的。
小知识:分页技术也分为真分页(数据库的分页)和假分页(前端
的分页),在这里我们使用的是在数据库中进行分页,在前端进行显示。 5、
添加用户页面显示控制
添加用户页面显示控制需要用到JavaScript 中的JQuery 框架,使具体分页的操作参考Model 层中的添加分页功能。
用其中的fadeToggle()方法即可控制添加用户页面的显示与隐藏功能。
具体实现代码如下:
6、 定时页面跳转控制
页面跳转功能需要用HTML 和JavaScript 结合使用再能达到效果。
首先需要在客户端显示秒数,然后通过JavaScript 使秒数每秒依次
递减,然后再通过HTML 实现过了秒数后刷新跳转页面即可。
具体实现代码: //显示秒数
Successfully add a new user to the database , Back home side after 3 seconds
//JavaScript使秒数每秒依次递减
//HTML实现刷新跳转
项目测试
数据库中的数据:
使用正确的用户进行登录:
进入登陆成功提示界面:
到主界面:
点击Manager_User进行管理用户:
修该YaHu 用户信息:
提示修改成功:
删除YaHu 用户:
删除成功提示:
添加新用户:
添加成功提示:
查找用户信息:
登录失败:
防盗链:
- 0
- 顶一下
收藏 推荐 打印 | 录入:admin | 阅读: 次
小学生反思能力的培养
生态技术在永定河生态修复工程中的应用研究