- 浏览: 55721 次
- 性别:
- 来自: 长沙
最新评论
-
tian_ya_nan:
真不错 !
文件流操作之C版 -
aogeback:
看到楼主来自湖南大学了
MFC 定时器之妙用 -
seedjyh:
什么ACM,是ICPC吧……
算法分析最小重量机器设计问题 -
zk_sima:
楼主标题党,这也算妙用吗,这叫基础知识普及吧,没看到你用定时器 ...
MFC 定时器之妙用 -
glasslion:
苍山洱海 写道0 1背包?
对啊,明明是经典的01背包问题的 ...
算法分析最小重量机器设计问题
学习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的一点粗略的理解。
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的一点粗略的理解。
发表评论
-
接口入参注解aop验证
2017-03-23 14:52 2467为什么要入参验证 系统之间在进行接口调用时,往 ... -
jsonp跨域及rest接口实现
2017-02-04 18:01 2005jsonp是json的一种模式,专门用来解决前端跨域请 ... -
javascript实现图片瀑布流
2015-03-26 22:30 512瀑布流主要就是指数据按照瀑布方式自上而下加载,主要由于高度 ... -
数据库持久层框架iBatis、myBatis、Hibernate对比
2015-03-22 19:10 3372在 java 应用的数据库 ... -
页面跳转方式
2015-03-22 18:14 643web前端开发中,经常使用到页面跳转,下面是使用过的几种常用的 ... -
html中的input文本框禁止输入问题
2015-01-04 19:24 1656我们在进行前端页面开发时,经常会遇到输入框禁止输入的问 ... -
httpclient请求方式下的泛型json转换问题
2014-11-26 18:25 3342我们在采用httpclient方式进行服务调用时,如果服务 ... -
modelAndView在sping MVC框架下的使用
2014-11-25 21:26 1517在 spring 框架的控制器中,我们经常在事件处理时 ... -
jquery中的live事件
2014-08-20 19:51 945很久没写了,本来只是学到一点小东西,觉得没必要写的,但是感 ... -
java String类型各种转化
2013-03-07 19:58 1137作为一名底层开发工 ... -
Java 内存输入流问题
2012-12-06 15:36 1052不论Java与C相比有多少优点,至少在输入输出流这点上还是 ... -
http工作原理
2012-12-01 10:47 793温故知新。 一、http协议:通过可靠的TCP连接,让we ... -
http请求响应码分析
2012-11-28 18:14 1123工作中经常遇到不同 ... -
JSP学习——JSP页面重用
2012-09-19 00:07 721.何为页面重用: Jsp页面在一个web应用中,主要 ... -
JSP学习——JSP隐含对象详解
2012-09-19 00:06 311.jsp隐式对象简介 JSP 架 ... -
JSP学习——JSP基础入门
2012-09-19 00:05 301.jsp简化入门 1.jsp基础 ... -
hibernate学习小结
2010-12-16 22:34 1253学习之余,把hibernate的知识点稍作小结。我们知 ... -
MFC 定时器之妙用
2010-12-11 18:27 2931现在有这么一个问题,在VC编程中,如果要每隔一段时间去 ... -
文件流操作之C++版
2010-12-03 01:28 2068昨天简单介绍了一下C ... -
文件流操作之C版
2010-12-02 01:10 2011最近这段时间因为 ...
相关推荐
介绍了PureMVC框架结构以及PureMVC下消息发送机制,有助于更好的了解和学习PureMVC架构
最基础的MVC结构 这个都是本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的
大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。
1.1.9 asp.net mvc 3特性总结 10 1.2 创建asp.net mvc 3应用程序 10 1.2.1 创建asp.net mvc 3应用程序的软件要求 11 1.2.2 安装asp.net mvc 3 11 1.2.3 创建asp.net mvc 3应用程序 12 1.2.4 new asp.net mvc 3 ...
MVC框架与模式分析在实践中,人们总结出了一些常用的软件系统结构高层模式,以供应用系统设计时参考。这些模式包括:单服务两层/多层C/S;MVC结构;面向服务的SOA与多服务集合;数据交换总线等。
如果读者已经开发过基于 Rails 的应用,但对其 MVC 间的数据传递还有诸多困惑,那么恭喜您,本文正是要总结梳理 Rails 数据传递的方法和技巧。Ruby on Rails 3(以下统称为 Rails 3)是当前的主要发布版本,本文所述...
总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...
项目描述:基于 servlet 开发的系统 ...3.数据库 Mysql 以及 Druid 连接池、服务器使用 Tomact8.5,开发...项目总结:从项目中学会用 bootstrap 框架对前端页面进行快速搭建,熟悉了 mvc 开发流程,掌握了 JAVAEE 模式开
MVC使得业务逻辑与显示相分离,可以使代码更加的规范与清晰,下面是我自己总结的一般包的一些命名,可能不太规范,希望对大家有帮助! java数据库链接三层结构: 是对java的工程进行分层,封装。 三层: ...
相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的。关于这块的入门我想特别感谢下FrankHui童鞋,在他的帮助下,我才能比较快滴熟悉...
Java面试题总结,包括数据结构、设计模式、反射机制、MVC、进程与线程等常见问题 秋招收集的面经资源,分享出来,希望能帮到大家~ 侵删!
21.1 Spring MVC原理总结272 21.2 实际跟踪一个请求275 第22章 异步请求281 22.1 Servlet 3.0对异步请求的支持281 22.1.1 Servlet 3.0处理异步请求实例282 22.1.2 异步请求监听器Async-Listener284 22.2 ...
本项目使用用JSP语言作为根本,选用经典的Tomcat作为服务器平台,采用MVC、前端控制器、服务工作者三种主要模式,并用Eclipse作为开发平台,详细介绍了本管理系统的开发过程。并从系统的需求分析、系统分析、概要设计...
全面介绍Spring MVC的架构、原理、核心概念和操作,通过案例完整呈现Tomcat的实现,系统总结Spring MVC九大组件的处理以及常用的技巧和实践 在大型网站和复杂系统的开发中,Java具有天然的优势,而在Java的Web框架中...
上一篇得到大家的关注,非常感谢。由于自己对于这些模式的理解也是有限,对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己的观点,才能抛砖引玉不是?... MVC, MVP和MVVM模式使用场景总结
基于MVC实现的电子政务系统 1.4本论文的组织 本文 的 组 织结构如下: 第一 章 引 言。主要讲述电子政务系统开发的现状,以及mvc设计模式应用于 ...本章总结全文,指出本系统设计的不足及下一步工作的 研究重点。
广州阅速Cms系统基于B/S结构和asp.net MVC 5.2.7架构创建,传承53BK数字报刊系统优秀安全基因。它能快速搭建新闻、文章系统、个人博客和手机app后端等网站、管理和发布内容。界面模板也可以自由定制设计成你自己需要...
总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...