MVC结构总结

学习MVC已有一段时间,之前对MVC的理解比较凌乱,最近开始着手做web项目,考虑到MVC的重要性,觉得有必要把MVC的知识点综合总结一下,也算是对自己学习的一个检测吧。
MVC是一个设计模式,是model-view-control结构。它强制性的使应用程序的输入、处理和输出分开。MVC应用程序被分成三个核心部件:模型(model)、视图(view)、控制器(controller)。它们各自处理自己的任务。MVC模式的目的就是实现Web系统的职能分工。
Model层:
实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。模型分为数据模型和业务逻辑模型。
View层:
负责展示数据对象给用户的界面层,用于与用户的交互,通常用JSP来实现。是用户看到并与之交互的界面。
Controller层:
是Model与View之间沟通的桥梁,是根据界面反馈处理业务逻辑的控制层,可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

简单地说,MVC就是一个HTML/JSP+Servlet+javaBean结构:
HTML/JSP负责生成动态网页;
Servlet负责流程转发至对应胡Action实现
javabean(pojo和dao)负责业务数据模型存取

控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。最重要的一点是多个视图能共享一个模型,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论用户想要Flash界面或是WAP界面,用一个模型就能处理它们。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。

MVC特点:
低耦合性
高重用性和可适用性
较低的生命周期成本
快速部署
可维护性
有利于软件工程化管理
并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

model1与model2的概念:
在使用JAVA技术建立Web应用的实例中,由于JSP技术的发展,很快这种便于掌握和可实现快速开发的技术就成了创建Web应用的主要技术。JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:let)和HTML(),在JSP页面中同时实现显示,业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model1。
Model 2表示的是基于MVC模式的框架。MVC是Model-View-Controller的简写。“Model”代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View”是应用的表示面(由JSP页面产生),“Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model1的不足。

MVC框架结构:
ControlServlet:请求控制器,解析请求中的动作名字,调用动作工厂对象生成的动作对象处理请求,处理后返回的结果即为目标url。
ActionFactory:工厂类,根据请求中的动作名创建命令对象action。
Action:接口,定义所有动作的接口。
具体Action:是实现了Action接口的类,调用其具体实现的方法处理Request或Response对象,返回一个url,再由Servlet负责转发到界面上。
user:用户类,一个最基本的单元,用来实现动作的对象。
Dao:负责连接数据库,将数据库中的数据导入到具体的Action中。

java实例:
1.设计控制器Servlet:
创建一个动态web工程后,首先定义一个ControlServlet,用户的所有请求都提交给这个Servlet,为了便于系统扩展,可以对Servlet的请求路径在web.xml中进行模糊配置。
<servlet-mapping>
<servlet-name>ControlServlet</servlet-name>
<url-pattern>*.netjava</url-pattern>
</servlet-mapping>

ControlServlet:
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
try{
//得到请求的命令名字,解析出*.netjava请求中*所指代的字符串,即动作名字
String actionName = getActionName(request);
//根据请求的动作名,得到控制器servlet中配置的Action实现类名字
String actionClassName = this.getInitParameter(actionName);

//通过工厂类创建命令对象
Action action = ActionFactory.getIns().getAction(actionClassName);

//使用动作对象处理动作,返回结果为处理后要输出的目标页面
String url = action.execute(request, response);
if(url != null){
//输出目标页面
getServletContext().getRequestDispatcher(url).forward(request, response);
}
}catch(Exception e){
e.printStackTrace();
//出错则输出错误页面
getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
}
}

//解析得到请求中的命令字
protected String getActionName(HttpServletRequest request){
String path = request.getServletPath();
return path.substring(1, path.lastIndexOf("."));
}

ActionFactory:
public class ActionFactory {

private static ActionFactory af = null;
//单实例访问方法
public static ActionFactory getIns(){
if(af == null){
af = new ActionFactory();
}
return af;
}

//根据具体的Action类名字创建Action对象
public Action getAction(String actionClassName){
Action actionInstance = null;
try{
Class c = Class.forName(actionClassName);
actionInstance = (Action)c.newInstance();
}catch(Exception e){
e.printStackTrace();
}
return actionInstance;
}
}

Action接口:
public interface Action {

public String execute(HttpServletRequest request, HttpServletResponse response);
}

具体Action:
public class LoginAction implements Action{

public String execute(HttpServletRequest request, HttpServletResponse response){
response.setContentType("text/html; charset=UTF-8");
String userName = request.getParameter("userName");
String userPwd = request.getParameter("userPwd");

//到数据库中查找用户
User user = new UserDao().findUser(userName, userPwd);

//判断用户是否存在
if(userName.equals(user.getName()) &&
userPwd.equals(user.getPwd())){
request.getSession().setAttribute("USER", user);
return "/mainPage.jsp";
}else{
request.setAttribute("ERROR", "账号或密码不正确!");
return "/Login.html";
}
}
}

web.xml配置:
<servlet>
<description></description>
<display-name>ControlServlet</display-name>
<servlet-name>ControlServlet</servlet-name>
<servlet-class>cn.netjava.servlet.ControlServlet</servlet-class>
<init-param>
<param-name>LoginAction</param-name>
<param-value>cn.netjava.action.LoginAction</param-

value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ControlServlet</servlet-name>
<url-pattern>/*.netjava</url-pattern>
</servlet-mapping>

Login.jsp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;

charset=UTF-8">
<title>登陆界面</title>
</head>
<body>

<form name="testForm" method="get"

action="LoginAction.netjava">
<br>用户名:<input type="text" name="userName"/>
<br>密 码:<input type="password" name="userPwd"/>
<%
String msg = (String)request.getAttribute("ERROR");
if(msg != null){
out.print("<br>"+msg);
}
%>
<input type="submit" name="submit" value="登陆"/>
</form>
<a href="Register.jsp">注册用户</a>
</body>
</html>

开启服务器,在IE浏览器上测试结果:

http://localhost:8080/MVCTest/Login.jsp
注意:最好是使用IE浏览器,因为有的浏览器并不完全兼容tomcat,可能会出现异常。
在界面上输入用户名和密码,点击登陆按钮,jsp将请求交给Servlet,Servlet再根据提交的动作得到具体的Action对象,然后通过Factory创建命令动作对象,处理Servlet中的动作,返回目标url,即得到登陆成功的界面。
这就是MVC构架的一个大致流程。为系统的扩展为了充分的准备,利用一个Servlet可以实现用户多个不同动作的响应。以上也是我对MVC的一点粗略的理解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值