【学习】基础MVC模式设计(一)

一、概念

MVC框架(Model View Controller)是三个单词的缩写,模型(model)-视图(view)-控制器(controller)。是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。


二、编程模式

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式。

  • Model(模型)表示应用程序核心(比如数据库记录字段)。
  • View(视图)显示数据(数据库记录)。
  • Controller(控制器)处理输入(写入数据库记录)。

MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。

MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。


三、简单MVC模式的代码实现

下面说明简单的MVC(不用JDBC)——用户登录/注册/注销的实现

1.Model部分

首先需要我们先设计一个JavaBean来处理用户数据逻辑,这一部分对应MVC中的Model

好,现在先将你设想的用户类的属性和主要方法考虑一下。

首先考虑用户登录功能需要什么属性?用户名和密码。再考虑用户注册需要什么属性?用户编号。因为你需要对你的用户进行基础的编号。(这个属性在数据库中很好操作,因为此实现没有JDBC的参与,所以这里不设字段)。用户注销需要什么属性?用户的登录状态

好的,核心的属性已经确定好。那么基础的方法也就可以构思出来。用户注册User_insert()、用户登录User_login()和用户注销User_logout()

根据这些设想开始构建用户的JavaBean。

public class User {   
	private int     UID;
    private String  Uname;
    private String  Upass;
    private String  Ustatus;
	//登录
	public void User_login(String name,String pwd,HashSet<User> userSet) {
	}
	//注册
	public void User_insert(String name,String pwd,HashSet<User> userSet) {
	}
	//注销
	public void User_logout(String id,HashSet<User> userSet) {
	}
}

现在开始填写方法。

分析一下用户登录需要将用户的用户名及密码和相应的用户名对应,若用户名无法和已有的用户名对应则应告知用户 “用户名不存在”;若用户名对应上,但密码没有对应上则应告知用户 “密码错误”;若都对应上则将用户状态改为登录并显示 “登录成功”

public String User_login(String name,String pwd,HashSet<User> userSet) {
    	System.out.println("用户登录业务逻辑");
    	String flag = null;
    	for(User a : userSet) {
    		if(name.equals(a.getUname())) {//将提交的用户名和已有的用户名对应
        		//用户名对应成功
        		if(pwd.equals(a.getUpass())) {//将提交的密码和已有的用户名对应的密码对应
        			//密码对应成功
        			a.setUstatus("登录成功");
        			flag = a.getUstatus();
        			break;
        		}else {
        			//密码对应失败
        			flag = "密码填写错误";
        			break;
        		}
        	}else{
        		//无该用户名
        		flag ="该用户名不存在";
        	}
        }
    	return flag;
}

分析一下用户注册需要将用户填写的信息表单提交给后台,后台根据表单中的新注册用户名和已有的用户名进行对应。若已有用户名与新注册的用户名冲突,则提示用户 “该用户名已被占用” ;若已有用户名中没有新注册的用户名,则将该表单信息提交给数据库端存储,提示用户 “用户注册成功”

public String User_insert(String name,String pwd,HashSet<User> userSet) {
		System.out.println("用户注册业务逻辑");
    	//遍历Set集合
    	String flag = null;
    	User b =  new User();
    	for(User a : userSet) {
    		//System.out.println(name+"**"+a.getUname());
    		if(name.equals(a.getUname())) {
    			//该用户名已被注册
    			flag = "该用户名已被注册";
    			break;
    		}else {
    			//该用户名未被注册    			
    			//System.out.println(a.getUname()+"88888888");
    			flag = "注册成功";
    			b.setUname(name);b.setUpass(pwd);b.setUstatus("未登录");
    		}
    	}
    	//如果可以注册将b插入到Set集合中
    	if(flag.equals("注册成功")) {
    		userSet.add(b);
    	}
    	return flag;
}

分析一下用户注销需要在用户登录的情况下调用用户注销方法,更改用户的状态,并告知用户 “该用户已注销”

 public void User_logout(String name,HashSet<User> userSet) {
    	System.out.println("用户注销业务逻辑");
    	//遍历Set集合
    	String flag = null;
    	User b =  new User();
    	for(User a : userSet) {
    		if(name.equals(a.getUname())) {
    			//该用户名存在
    			flag = "该用户已注销";
    			a.setUstatus("未登录");
    			break;
    		}else {
    			//该用户名未被遍历到
    			flag = "注销失败";		
			}
		}
		System.out.println(flag);
}

这样一个简单的JavaBean就写好了,首先用test类测试功能。功能齐全。
test测试javabean方法


2.View

view为视图层,视图代表模型包含的数据的可视化。这一部分我要构思页面,怎么设计登录界面表单、登录后的界面、注册界面这三个界面(默认注销操作在登录后界面)。

先明确无论是登录或是注册,其网页实质实际上都是表单。表单可以提交数据给后端,让后端来处理。我做了最基础的表单,没有什么特别样式。登录需要用户填写自己的用户名和密码,注册同样需要这些。所以我做的表单效果如下(使用了Bootstrap框架)
登录界面:
在这里插入图片描述
注册界面:
在这里插入图片描述
用户主界面:
在这里插入图片描述
简单的表单和基础的界面构成View层。


3.Controller

控制器中基础MVC一般用servlet来完成这一块的运用。

servlet可以实现jsp和java后端的数据交互和操作。想完成jsp与servlet的跳转,就要创建servlet类,在servlet类中存在两种方法,doGet和doPost两个方法。接下来详细说明怎么完成页面之间的跳转以及数据交互。首先servlet类建立时,就会自动生成注解驱动,括号中的即为jsp可以跳转到的Servlet路径。

@WebServlet("/Servlet")

在jsp页面中的form表单中设定action跳转到/Servlet且通过Get方法传递type,type值为login,method设定为POST。这样就可以将登录界面的表单传递给Servlet。

<form class="form-horizontal" role="form" action="./Servlet?type=login" method='POST' style="width:30%;margin:0 auto;">

使用request的getParameter方法得到type的值,进行判断进入对应的业务逻辑。

String type = request.getParameter("type");
if(type.equals("logout")){...}
if(type.equals("insert")){...}
if(type.equals("login")) {...}

登录的业务逻辑

登录这个状态需要cookie中的session来进行判断。当用户登录后在servlet中type=“login”中将该用户的用户名设置到session中储存。接下来的网页可以直接用session来判断用户是否在线;注销功能与之相反,移除登录设置的session,即可完成用户的注销。

if(type.equals("login")) {
		System.out.println("----------------------------------------");
		System.out.println("用户登录业务逻辑");
		String _name = request.getParameter("name");
		String _pwd = request.getParameter("pwd");
		String flag = user.User_login(_name,_pwd,userSet);
		for(User a : userSet) {
			System.out.println(a.getUname()+"-"+a.getUstatus());
		}
		switch(flag){
			case "登录成功":
				request.getSession().setAttribute("name",_name);
				request.getRequestDispatcher("./user.jsp").forward(request, response);
				break;
			case "密码填写错误":
				String message1="警告";
				request.setAttribute("message", message1);
				request.setAttribute("flag", flag);
				request.getRequestDispatcher("./index.jsp").forward(request, response);
				break;
			case "该用户名不存在":
				String message2="警告";
				request.setAttribute("message", message2);
				request.setAttribute("flag", flag);
				request.getRequestDispatcher("./index.jsp").forward(request, response);
				break;
		}
}

注销的业务逻辑

if(type.equals("logout")) {
			System.out.println("----------------------------------------");
			System.out.println("用户注销业务逻辑");
			//这里用到Session,通过控制Session中的name,来控制用户状态
			String _name =(String) request.getSession().getAttribute("name");
			System.out.println("注销开始,用户为"+_name);
			//这里remove掉Session中的name
			request.getSession().removeAttribute("name");
			_name =(String) request.getSession().getAttribute("name");
			System.out.println("注销结束,Session中用户为"+_name);
			String message="注销成功!";
			String flag = "欢迎下次再光临本站。";
	        request.setAttribute("message", message);
	        request.setAttribute("flag", flag);
	        request.getRequestDispatcher("./index.jsp").forward(request, response);
		}

注册的业务逻辑

注册的业务逻辑会比之前的两个更为复杂。首先我们没有使用数据库,而是使用设定好的set集合。这就意味着在每一次部署时都要重新创建一个set集合来保障功能的实现,所以我在servlet.doGet方法的最开始设置了一个小判断。如果没有Set集合那就生成一个set集合并将用户abc和用户bbb默认添加。如果已经生成则将该set赋值给userSet。

	HashSet<User> userSet =  new HashSet<>();
	User user = new User();
	if(Session_uS==null||Session_uS.isEmpty()) {
		userSet =  new HashSet<>();
		User user1 = new User("abc","123");
		User user2 = new User("bbb","8");
		userSet.add(user1);
		userSet.add(user2);
		for(User a : userSet) {
			System.out.println(a.getUname()+"-"+a.getUstatus());
		}
	}else{
		userSet = Session_uS;
		for(User a : userSet) {
			System.out.println(a.getUname()+"-"+a.getUstatus());
		}
	}

通过这个判断可以完成注册这个功能的准备工作了,下面是注册的业务逻辑。

if(type.equals("insert")) {
				System.out.println("----------------------------------------");
				System.out.println("用户注册业务逻辑");
				String _name = request.getParameter("name");
				String _pwd = request.getParameter("pwd");
				System.out.println(_name+"--**"+_pwd);
				String flag = user.User_insert(_name,_pwd,userSet);
				for(User a : userSet) {
					System.out.println(a.getUname()+"-"+a.getUstatus());
				}
				switch(flag){
				case "注册成功":
					request.getSession().setAttribute("userSet",userSet);
					String message = "欢迎光临本站!";
			        request.setAttribute("message", flag);
			        request.setAttribute("flag", message);
			        request.getSession().setAttribute("name",_name);
				    request.getRequestDispatcher("./user.jsp").forward(request, response);
				    break;
				case "该用户名已被注册":
					String message1="警告";
				    request.setAttribute("message", message1);
				    request.setAttribute("flag", flag);
				    request.getRequestDispatcher("./register.jsp").forward(request, response);
				    break;
					}		
				}

整体结合,就是最基本的MVC模式的用户登录/注册/注销了。
这是我第一次编写博客,如果感觉哪里有问题或者哪里不懂都可以私信我。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值