.1 MVC模式

MVC是三个单词的缩写,这三个单词分别为:模型(Model)、视图(View)和控制(Controller)。MVC模式的目的就是实现Web系统的职能分工。下面以J2EE开发进行介绍。

Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller 层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操 作。现在来看一个例子,看MVC模式是怎样工作的。

1.1.1 一个实例

例1-a:

<servlet>
     
<servlet-name>Controller</servlet-name>

<servlet-class>nepalon.simplestruts.Controller</servlet-class>

</servlet> 
<servlet-mapping>
   
<servlet-name>Controller</servlet-name>

<url-pattern>/simplestruts/servlet/control/Controller</url-pattern>

</servlet-mapping>

上面是web.xml文件的片段,在这里定义了一个servlet用于处理请求。

例1-b(Test.jsp文件):

<html>
<%@ page
contentType="text/html;charset=gb2312"%>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312">
<title>实例首页</title>

</head>
<body> 
<table border="0" width="100%">
  <tr>
<td><div
align="center">
<a
href="/simplestruts/servlet/control/Controller?command=showarticle">显示文章</a>

</div></td>

</tr>
</table>
</body>
</html>

在这个JSP中,我们并没有直接去调用JSP或JavaBean,而是把请求分送到Servlet中。下面,我们来看看Servlet的代码。

例1-c:

package nepalon.simplestruts;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class Controller extends HttpServlet 
{

public
void init(ServletConfig config) throws ServletException
    {
       
super.init(config);
    }

public
void destroy() {}

protected
void processRequest(HttpServletRequest request,HttpServletResponse
response)
       
throws ServletException, java.io.IOException
   
{

//代码(1)通过if来实现对不同请求的分发
       
if(request.getParameter("command").equals("showarticle"))
       
{
           
ArticleCommand command = new ArticleCommand();
           
next = command. getAllArticle (request, response);
       
}
       
//代码(2)
       
dispatch(request, response, next);
    }
   
    protected
void doGet(HttpServletRequest request,
                       
HttpServletResponse response)
       
throws ServletException, java.io.IOException
    {
       
processRequest(request, response);
    }
   
    protected
void doPost(HttpServletRequest request,
                        
HttpServletResponse response)
       
throws ServletException, java.io.IOException
    {
       
processRequest(request, response);
    }

protected
void dispatch(HttpServletRequest request,
                          
HttpServletResponse response,
                          
String page)
       
throws  javax.servlet.ServletException,
java.io.IOException
    {
       
RequestDispatcher dispatcher =
           
getServletContext().getRequestDispatcher(page);
       
dispatcher.forward(request, response);
    }
}

在Servlet中并没有直接处理所提交的请求,而是把请求的处理推后到ArticleCommand类中,通过ArticleCommand对象来执
行,如代码(1)。在处理完请求后,转到相应的页面中,如代码(2)。下面,我们看一下ArticleCommand类的代码。

例1-d:

package nepalon.simplestruts;

import java.util.*;
import javax.servlet.*;
import java.io.*;
import java.lang.*;
import java.sql.*;
import javax.sql.*;

public class Contribute
{
    public
Contribute() {}
    public
String getAllArticle(HttpServletRequest request,
HttpServletResponse response)
         
throws javax.servlet.ServletException, java.io.IOException
    {
        
Connection conn=null;
       
String con_user = "example1";
       
String con_password = "example1";
       
String con_dburl = "jdbc:oracle:thin:@localhost:iasdb";
       
String con_driver = "oracle.jdbc.driver.OracleDriver";
       
PreparedStatement pstmt=null;
       
ResultSet
rsComment=null;

Vector vectorComment = new Vector();
       
String selectSQL= "SELECT content, time FROM article ORDER BY time
DESC";
       
try
       
{
            
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
            
Class.forName(con_driver);
            
conn =
DriverManager.getConnection(con_dburl,con_user,con_password);
            
pstmt=conn.prepareStatement(selectSQL);
            
rsComment=pstmt.executeQuery();
            
while(rsComment.next())
            
{
                  
CommentItem commentItem = new CommentItem();
               
commentItem.setContent(rsComment.getString(1));
               
commentItem.setTime(rsComment.getDate(2));
               
vectorComment.add(commentItem);
            
}
            
vectorComment.trimToSize();
         
}
       
catch (Exception e){//做相应的处理}
       
//代码(1)保存处理结果并返回跳转页面
       
request.setAttribute("vectorComment ", vectorComment);
       
return "/simplestruts/showallarticle.jsp";
}
……
public String getNewArticle(HttpServletRequest request,
HttpServletResponse response)
         
throws javax.servlet.ServletException, java.io.IOException
    {…}
}

在这个类中进行的是取得所有文章的业务,最后返回如果成功执行操作后要跳转到的页面。当然,这个类中可能还有别的业务的相应函数,读者可自己实现。下面看一下要跳转到的页面的代码。

例1-e(showallarticle.jsp文件):

<html>
<%@ page
contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*,
java.lang.*"%>
<jsp:useBean 
type="java.util.Vector" scope="request"/>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312">
<title>显示文章</title>

</head>
<body> 
<table border="0" width="100%">
   
  <tr>
   
<td>发表时间</td>

<td>文章内容</td>

</tr>
<%

if
(vectorComment!=null &&
vectorComment.size()>0)
   
{

int
counter=vectorComment.size();

CommentItem commentlist =
null;   
       
for (int i=0;i<counter;i++)
       
{

commentlist=null;

commentlist=(CommentItem)(vectorComment.get(i));

%>
  <tr>
   
<td><%=commentlist.getCmTime()%></td>

<td><%=commentlist.getCmContent()%></td>

</tr>
<%
       
}
    }
%>
</table>
</body>
</html>

在这个JSP中我们要做的只是取得结果并显示,没有涉及到相应的业务逻辑。

实例分析

首先,我们看一下这个例子的序列图

1)
首先在Veiw层的test.jsp中提交一个请求/simplestruts/servlet/control/Controller?command=showarticle;

2)
在Controller层的Controller对象中,根据请求的类型来调用相应的业务处理类,在这里,command值为showarticle的请求的业务处理类为ArticleCommand类,所以调用该类的对象的相应函数;

3)
在Model层的ArticleCommand类主要实现请求的取得所有文章的业务功能,把结果保存在request中,并返回跳转页面作为返回值;

4) 回到Controller层的Controller对象,根据上一步骤的返回值进行页面转发。

5)
转发到View层的showallarticle.jsp页面,这个页面从request中取得结果并进行显示。在这个JSP中虽然也有Java代码,但这些代码只是用于显示结果,并没有涉及到任何业务逻辑。

MVC模式的好处

本来这样一个简单的功能我们只需要2个JSP文件就能实现了,为什么要这么麻烦把它分到几个类中去实现呢?现在就来看一下MVC模式带来的好处。

1) 各施其职,互不干涉
在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。假如业务发生了变化,
如在取文章时可能webmaster把一些文章作了无效标志,不能直接把所有文章取出来,只能取出有效的文章,这时业务就发生了改变。再设想一下,如果这
个业务逻辑在100个页面中都要用到,那么MVC模式就体现了它的灵活性。我们可以不更改任何JSP,只要更改model层中的相应类中的SQL语句即
可。

2) 有利于开发中的分工
在MVC模式中,由于按层把系统开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。

3) 有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视力层也可做成通用的操作界面。

【转】用java实例学习MVC模式的更多相关文章

  1. Java的MVC模式简介

    Java的MVC模式简介 MVC(Model View Control)模型-视图-控制器 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件 ...

  2. 【转】利用MVC模式开发Java应用程序[组图]

    Java是一种面向对象的语言,是实现面向对象编程的强大工具.我们在实际编程中,应该运用并发挥其最大效能.但是,要利用面向对象编程思想,自己独立开 发出好的Java应用程序,非凡是大.中型程序,并不是一 ...

  3. java 图形界面 mvc模式控制

    使用模型-视图-控件结构来开发GUI程序. 下面的程序演示了MVC模式开发的java程序. 其中CircleModel为模型,包含了圆的半径,是否填充,等属性. CircleView为视图,显示这个圆 ...

  4. MVC模式在Java Web应用程序中的实例分析

    MVC在软件架构中是一种比较重要的架构思想,已经被广泛的应用在实际的java web项目开发中,我们所要了解和掌握的是mvc的架构思想和使用mvc模式来分析和解决问题的方法.当然相同或不同的项目都有各 ...

  5. java核心技术第五篇之事务和MVC模式

    第一部分:事务1.事务的简介: 1.1 在一组操作中(比如增加操作,修改操作),只有增加和修改操作都成功之后,这两个操作才能真正的成功. ,如果这两个操作中,有一个失败了,这两个操作都失败了. 1.2 ...

  6. JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

    目录 JSP的执行原理.JSP的内置对象.四大作用域解析.MVC模式理解 JSP的执行原理 这里拿一个小例子来解析JSP是如何被访问到的 首先将该项目部署到tomcat,并且通过tomcat启动 通过 ...

  7. 深入理解MVC模式

    一,什么是MVC模式 该模式是一种软件设计典范,他把软件系统划分为三个基本部分:模型层(Model).视图层(View).控制器(Controller) *Model(模型)表示应用程序核心(比如数据 ...

  8. MVC模式

                             1.MVC的概念 1.1什么是MVC? MVC是一种架构型模式,它本身不引入新的功能,只是指导我们把web应用结构做的更加合理,实现逻辑与页面相分离. ...

  9. MVC模式与Android

    MVC模式是软件工程中的一种软件架构,“Model-View-Controller”的缩写,中文翻译为“模型-视图-控制器”. MVC模式将一个交互式应用程序分为3各组件: 1.Model(模型):业 ...

随机推荐

  1. unicode 编码在线转换--javascript

    // unicode 编码在线转换工具--javascript 本人在网上搜索,看到有使用javascript做unicode编码转换的,感觉很好玩,所以拿来使用的. 这个功能有目前测试了两种: 1) ...

  2. Redis 安装与简单示例 <第一篇>

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  3. hdu 5029 Relief grain(树链剖分+线段树)

    题目链接:hdu 5029 Relief grain 题目大意:给定一棵树,然后每次操作在uv路径上为每一个节点加入一个数w,最后输出每一个节点个数最多的那个数. 解题思路:由于是在树的路径上做操作, ...

  4. 一道模板元编程题源码解答(replace_type)

    今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...

  5. Cocos2d-html5 笔记4: 粒子

    今天看了cocos2d-html5里面的粒子系统相关的代码,首先看了代码中引用的两篇文章, 这两篇文章google上都可以搜到pdf的. The Ocean Spray in Your Face [j ...

  6. Linux用户空间与内核空间(理解高端内存)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  7. SSIS 64位环境访问Oracle11g

    SSIS 为了要能够在64位的机器上面让SSIS存取Oracle,当然需要安装64位的Oracle Provider,但是遇到最大的问题在于SSIS在执行的时候分成两种组件,分别是DTExec.exe ...

  8. 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号

    一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...

  9. mysql分表研究

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...

  10. [Buzz.Today]2013.07.26

    # OpenFab 3D printing hardware is rapidly scaling up to output continuous mixtures of multiple mater ...