一、概念
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类测试功能。功能齐全。
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模式的用户登录/注册/注销了。
这是我第一次编写博客,如果感觉哪里有问题或者哪里不懂都可以私信我。