day_8 MV模式,使业务逻辑和网页页面分开,实现低耦合,体现java封装特性
2014-04-21 19:39
513 查看
之前写的程序基本上完成了想要的功能
但是若回头去看,会有一种凌乱的感觉,网页的框架设计和业务逻辑杂糅在一起,降低了可读性和代码复用性,不符合J***A的封装特性
这里对sevlet网页的整体框架进行重排, 运用MV模式,使业务逻辑和网页页面分开,实现低耦合,体现java封装特性
这里先对之前网页的功能进行抽取
使之单独封装在类的方法中以便调用。
实现上述方法后,只需在页面中调用方法即可
重新修改后的代码变得简洁明了
功能和界面与之前相同,注意到package换了一个包名
但是若回头去看,会有一种凌乱的感觉,网页的框架设计和业务逻辑杂糅在一起,降低了可读性和代码复用性,不符合J***A的封装特性
这里对sevlet网页的整体框架进行重排, 运用MV模式,使业务逻辑和网页页面分开,实现低耦合,体现java封装特性
这里先对之前网页的功能进行抽取
使之单独封装在类的方法中以便调用。
//从数据库中得到连接 package com.jxust.reven; import java.sql.*; public class ConnDB { private Connection ct = null; public Connection getConn() { try { //1加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2得到连接 ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=数据库名","用户名","密码"); } catch(Exception ex) { ex.printStackTrace(); } return ct; } }
//这是一个UserBean <----->users表映射 //他的一个对象 <----->users表的一条记录对应 //数据 package com.jxust.reven; public class UserBean { private int userId; private String userName; private String passwd; private String email; private int grade; public void setUserId(int userId) { this.userId = userId; } public int getUserId() { return this.userId; } public void setUserName(String userName) { this.userName = userName; } public void setPasswd(String passwd) { this.passwd = passwd; } public void setEmail(String email) { this.email = email; } public void setGrade(int grade) { this.grade = grade; } public String getUserName() { return (this.userName); } public String getPasswd() { return (this.passwd); } public String getEmail() { return (this.email); } public int getGrade() { return (this.grade); } }
//这是一个处理类(处理users表)<---->操作UserBean package com.jxust.reven; import java.sql.*; import java.util.*; public class UserBeanCl { //业务逻辑 private Connection ct=null; private PreparedStatement ps=null; private ResultSet rs=null; private int pageCount=0;//一共有几页 //返回pageCount的方法 public int getPageCount() { return this.pageCount;//不会返回零吗? } //资源关闭方法 public void close() { try { if(rs!=null) { rs.close(); rs=null; } if(ps!=null) { ps.close(); ps=null; } if(ct!=null); { ct.close(); ct=null; } } catch(Exception ex) { ex.printStackTrace(); } } //分页显示 public ArrayList getResultByPage(int pageNow,int pageSize) { ArrayList al=new ArrayList(); try { int rowCount = 0;//一共有几条记录(查表) //得到rowCount ConnDB cd= new ConnDB(); ct = cd.getConn(); ps = ct.prepareStatement("select count(*) from users"); rs = ps.executeQuery(); if(rs.next()) { rowCount = rs.getInt(1); } //计算pageCount if(rowCount % pageSize == 0) { pageCount = rowCount/pageSize; } else { pageCount = rowCount/pageSize+1; } ps = ct.prepareStatement("select top "+pageSize+" * from users where userId not in (select top "+pageSize*(pageNow-1)+" userId from users)"); rs = ps.executeQuery(); while(rs.next()) { //将rs中的 每条记录封装到UserBean ub UserBean ub = new UserBean(); ub.setUserId(rs.getInt(1)); ub.setUserName(rs.getString(2)); ub.setPasswd(rs.getString(3)); ub.setEmail(rs.getString(4)); ub.setGrade(rs.getInt(5)); //将ub,放入到ArrayList集合中 al.add(ub); } } catch(Exception ex) { ex.printStackTrace(); } finally { this.close(); } return al; } //验证用户 public boolean checkUser(String u,String p) { boolean b=false; try { //得到链接 ConnDB cd = new ConnDB(); ct = cd.getConn(); ps = ct.prepareStatement("select top 1 passwd from users where username=?"); ps.setString(1,u); rs = ps.executeQuery(); if(rs.next()) { String dbPasswd=rs.getString(1); if(dbPasswd.equals(p)) { b = true; } } } catch(Exception ex) { ex.printStackTrace(); } finally { this.close(); } return b; } }
实现上述方法后,只需在页面中调用方法即可
重新修改后的代码变得简洁明了
//登录界面的servlet package com.jxust.reven; import java.io.*; import javax.servlet.http.*; public class Login extends HttpServlet{ public void doPost(HttpServletRequest req,HttpServletResponse res){ this.doGet(req,res); } public void doGet(HttpServletRequest req,HttpServletResponse res){ //res:页面向控制台回应,页面发出信息。req:控制台向页面要求,控制台接收页面信息。 try { res.setContentType("text/html;charset=gbk");//中文防止乱码 PrintWriter pw = res.getWriter(); pw.println("<html>");//html文件体 pw.println("<body>");//body体 pw.println("<hr />");//分割线 pw.println("<h1>登陆界面</h1>"); pw.println("<form action = logincl method=post>");//该段组件体和logincl体进行关联 pw.println("用户名:<input type = text name = username><br />");//用户名组件体 pw.println("密码:<input type = password name = passwd><br />");//密码组件体 pw.println("<input type=checkbox name=keep valu=2>两周内不再重新登录<br />");//cookie pw.println("<input type = submit value = '登录'><br />"); pw.println("<hr />"); pw.println("<form>"); //得到error信息 String info = (String)req.getParameter("info"); if(info.equals("error1") ) { pw.println("您的名或密码输入错误"); } if(info.equals("error2") ) { pw.println("您的session超时请重新登录"); } pw.println("</center></body>");//body体 pw.println("</html>");//html文件体 } catch(Exception ex) { ex.printStackTrace(); } } }
//登录控制文件的servlet package com.jxust.reven; import javax.servlet.http.*; import java.io.*; import java.sql.*; public class LoginCl extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res){ this.doPost(req,res); } public void doPost(HttpServletRequest req,HttpServletResponse res){ Connection ct = null; ResultSet rs = null; Statement sm = null; try{ //服务器接收login页面发来的用户名和密码,要用到req。 String u = req.getParameter("username");//此处填写组件名 String p = req.getParameter("passwd");//此处填写组件名 System.out.println("name = "+u+",passwd="+p); //调用UserBeanCl,1创建一个对象 UserBeanCl ubc = new UserBeanCl(); //使用UserBeanCl的方法 if(ubc.checkUser(u,p)) { //密码和数据库中的一致,用户合法 String keep = req.getParameter("keep"); if(keep!=null) { //将用户名和密码保存在客户端 Cookie name = new Cookie("myname",u); Cookie pass = new Cookie("mypasswd",p); //设置时间 name.setMaxAge(14*24*3600); pass.setMaxAge(14*24*3600); //回写到客户端 res.addCookie(name); res.addCookie(pass); } HttpSession hs = req.getSession(true); //得到和req相关联的session,如果没有就创建session hs.setMaxInactiveInterval(20); //hs.setAttribute("pass","ok"); hs.setAttribute("pass",u); //连接登录后的欢迎界面 //sendRedirect的作用是跳转界面 res.sendRedirect("wel?username="+u+"&passwd="+p);//该处填写域名 } else { //说明连用户名不合法 res.sendRedirect("login?info=error1"); } } catch(Exception ex){ ex.printStackTrace(); } finally { try { if(rs!=null) { rs.close(); } if(sm!=null) { sm.close(); } if(ct!=null) { ct.close(); } } catch (Exception ex) { ex.printStackTrace(); } } } }
//登入后界面 package com.jxust.reven; import javax.servlet.http.*; import java.io.*; import java.sql.*; import java.util.*; public class Wel extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res){ this.doPost(req,res); } public void doPost(HttpServletRequest req,HttpServletResponse res){ //打开操作数据库必要的变量 Connection ct = null; ResultSet rs = null; PreparedStatement ps = null; Statement sm = null; try{ //得到session res.setContentType("text/html;charset=gbk");//中文防止乱码 PrintWriter pw = res.getWriter(); HttpSession hs = req.getSession(true); String valu = (String)hs.getAttribute("pass");//得到键值取对值(用户名) String u = req.getParameter("username"); String p = req.getParameter("passwd"); String name=""; String passwd=""; if(valu == null)//防止非法登登录 { //如果session中没有用户信息,看看有没有用户的cookie信息 //从客户端得到所有cookie信息 Cookie [] allCookies = req.getCookies(); int i = 0; //如果allCookies不为空,遍历 if(allCookies!=null) { //从中取出cookie for(i=0;i<allCookies.length;i++) { //依次取出 Cookie temp = allCookies[i]; if(temp.getName().equals("myname")) //得到cookie的值 name = temp.getValue(); else if(temp.getName().equals("mypasswd")) passwd = temp.getValue(); } if(!name.equals("")&&!passwd.equals("")) { //到logincl去验证 res.sendRedirect("logincl?username="+name+"&passwd="+passwd); System.out.println("name = "+name+",passwd="+passwd); return ; } } //返回登录界面 res.sendRedirect("login?info=error2"); return ; } else { //在sevlet中显示图片 pw.println("<body><center>");//body体,让html文字在网页中间显示 pw.println("<img src=imgs/welcome.gif><br />");//在tomcat/webapps/自己的网页文件夹 创立imgs文件夹,放入图片然后在html语句中插入图片路径即可 pw.println("<h1>欢迎光临!用户"+valu+"</h1><br />"); //pw.println("<p>您的密码是"+p+"</p><br />"); pw.println("<a href='http://localhost:8080/RevenWebsite/login'>返回重新登录</a><br />"); //==================分页功能==============// int pageSize = 3; //一页显示3条记录 int pageNow = 1;//当前显示页数 int pageSize2 = 5; //动态地接受pageNow String sPageNow = req.getParameter("pageNow"); if(sPageNow != null) { pageNow = Integer.parseInt(sPageNow); } //调用UserBeanCl UserBeanCl ubc = new UserBeanCl(); ArrayList al = ubc.getResultByPage(pageNow,pageSize); //表格 pw.println("<table border = 1"); pw.println("<tr><th>id</th><th>账户名</th><th>密码</th><th>邮箱</th><th>权限等级</th></tr>"); for(int i=0;i<al.size();i++) { UserBean ub =(UserBean)al.get(i); pw.println("<tr>"); pw.println("<td>"+ub.getUserId()+"</td>"); pw.println("<td>"+ub.getUserName()+"</td>"); pw.println("<td>"+ub.getPasswd()+"</td>"); pw.println("<td>"+ub.getEmail()+"</td>"); pw.println("<td>"+ub.getGrade()+"</td>"); pw.println("</tr>"); } pw.println("</table>"); //显示超链接 //显示上一页 if(pageNow!=1) pw.println("<a href=wel?pageNow="+(pageNow-pageSize2)+">上一页</a>"); for(int i = pageNow;i <= pageNow+pageSize2-1;i++) { pw.println("<a href=wel?pageNow="+i+">"+i+"</a>"); } int pageCount = ubc.getPageCount(); //显示下一页 if(pageNow!=pageCount) pw.println("<a href=wel?pageNow="+(pageNow+pageSize2)+">下一页</a>"); } //=======实现跳转页(待调试)=======// //pw.println("<form action=wel method=post>"); //pw.println("跳转到第<input type=text name=SpageNow >页"); //pw.println("<form>"); //String s =req.getParameter("SpageNow"); //pw.println(s); //int t = Integer.parseInt(s); //pw.println(t); //pw.println("<a href=wel?pageNow=1>Go</a>");//req.getIntHeader() //=======实现跳转页(待调试)=======// pw.println("</center></body>");//body体,让html文字在网页中间显示 } catch(Exception ex){ ex.printStackTrace(); } } }
功能和界面与之前相同,注意到package换了一个包名
package com.jxust.reven;这里为了模仿真实开发中,工作区的划分。
相关文章推荐
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- ######02.【根据表关系 写实体】,【直接凭业务逻辑 和页面显示信息,写不出:体现实体之间的依赖关系 的属性。】
- 设计模式 业务封装 & 紧耦合 vs. 松耦合 & 简单工厂模式
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- java重试工具库: 实现业务逻辑与重试逻辑的解耦
- java 实现JSP页面上一页及下一页封装
- java深入浅出设计模式----简单的工厂模式(一)----业务逻辑分离
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- JDBC的工具类(简单实用,体现java封装特性)
- angularJS分页 实现业务逻辑与分页逻辑的分开
- WEB后台--邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解
- 简单设计模式实现业务逻辑与流程逻辑的分离
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- 网页消息封装 业务逻辑 学习笔记
- 对主流框架OKHttp的封装,达到一行代码实现一个业务逻辑
- 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)
- C#实现的微信网页授权操作逻辑封装示例
- 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
- 设计模式之 抽象工厂 封装业务逻辑层和Dao层