您的位置:首页 > 编程语言 > Java开发

day_8 MV模式,使业务逻辑和网页页面分开,实现低耦合,体现java封装特性

2014-04-21 19:39 513 查看
之前写的程序基本上完成了想要的功能

但是若回头去看,会有一种凌乱的感觉,网页的框架设计和业务逻辑杂糅在一起,降低了可读性和代码复用性,不符合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;
这里为了模仿真实开发中,工作区的划分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐