.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. Delphi Interfaces

    http://www.delphibasics.co.uk/Article.asp?Name=Interface The reason for interfaces   Classes that ex ...

  2. Remove a Driver Package from the Driver Store

    http://technet.microsoft.com/en-us/library/cc730875.aspx Determine the name of the driver package in ...

  3. uva129 - Krypton Factor 7.4.3 困难的串

      7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstrin ...

  4. web及移动应用测试知识总结

    发现自己对测试知识的掌握不够系统,在这里整理一下好了. 1. 通用测试点 功能测试 正向:输入一个有效的输入并且期望软件能够完成一些根据说明书规定的行为 逆向:输入一个无效的输入并且期望软件给出合理的 ...

  5. Class hierarchy of UIResponder as well as subclasses of UIView and UIControl

    When you were dragging in your label and your button to this view, you were adding them as subviews. ...

  6. Educational Codeforces Round 7 A. Infinite Sequence 水题

    A. Infinite Sequence 题目连接: http://www.codeforces.com/contest/622/problem/A Description Consider the ...

  7. Codeforces Round #336 (Div. 2)A. Saitama Destroys Hotel 水题

    A. Saitama Destroys Hotel 题目连接: http://www.codeforces.com/contest/608/problem/A Description Saitama ...

  8. C++ 内存泄露处理方法 (转)

    1.可以显示内存泄露情况,但无法找到具体的文件位置写法 包含头文件#include <crtdbg.h> 然后在需要检测内存泄露的位置加上语句 _CrtDumpMemoryLeaks(); ...

  9. HTML之一 符号实体

    符号实体和”语言代码“以及”字符集“无关.

  10. TOJ3650 Legal or Not

    Legal or Not   Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 41   ...