MVC设计模式

      MVC是一种目前广为流传的经典设计模式,具体是模型(Model)—视图(View)—控制(Control)三方面结合起来的设计模式。这样设计的目的是:实现Web系统的职能分工。在实际的开发过程中,一个团队可以进行模块分工,分工开发完毕之后,再将模块组合起来合成一个项目。

 


      这里先介绍介绍下每个模块:
        1.View模块,就是用户可以看到的界面,如网页。用jsp,html编写,可以向控制(Control)模块发送请求。
        2.Control模块,是一个ControlServlet类,作为服务器处理请求,每个请求都要经过该模块。是连接View模块和Model模块之间沟通的桥梁。
        3.Model模块,实现服务器中的业务逻辑,通常可以用JavaBean(dao,pojo等)实现。如 LoginAction中验证用户名密码是否正确 之类。并将处理后的结果(url)返回给Control模块。

 

 

 

     下面再从代码实现方面介绍MVC设计模式:
        1.用jsp,html代码实现视图功能。
      代码示例:
          

<html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Login</title>
          </head>
          <body>

          <form action="LoginAction.ldy" method="post">
          用户名:<input type="text" name="userName"><br>
          密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="text" name="pwd"><br>
          <input type="submit"  name="login" value="登陆" >
          </form>

          </body>
          </html>

             
            
    
        这里必须先说明web.xml中的配置:

         代码示例如下:
      

  <servlet>
           <servlet-name>ControlServlet</servlet-name>
           <servlet-class>cn.java.controlservlet.ControlServlet</servlet-class>
             <!-- 处理登陆请求的Action实现 -->
             <init-param>
               <param-name>LoginAction</param-name>
               <param-value>cn.java.action.ActionLogin</param-value>
             </init-param>
             <!-- 处理注册请求的Action实现 -->
             <init-param>
               <param-name>RegUserAction</param-name>
            <param-value>cn.netjava.action.RegUserAction</param-value>
             </init-param>
          </servlet>

          <servlet-mapping>
          <servlet-name>ControlServlet</servlet-name>
          <url-pattern>*.ldy</url-pattern>
          </servlet-mapping>

       
                 在 <init-param>标签中用模糊匹配 * 来配置请求路径。这样的结果是,所有以.ldy结尾的请求路径都经过控制模块,即cn.java.controlservlet.ControlServlet类。然后是&lt;init-param&gt;标签,对应的是Action的实现类,如cn.java.action.ActionLogin类。

 

 

 

        2.ControlServlet类,即接受所有请求的控制模块,就是配置文件web.xml中的  cn.java.controlservlet.ControlServlet类。
          实现的功能:
            首先取得请求的路径(*.ldy),再解析出请求路径中*指代的字符串(如LoginAction),      然后取得web.xml中配置的Action实现类名字(cn.java.action.ActionLogin),之后通过Factory类(随后介绍)创建取得Action实现类的对象,经过Action实现类处后,最后取得响应的url.

             代码示例:

 

  public class ControlServlet extends HttpServlet{

    public void service(HttpServletRequest request,HttpServletResponse response){
              try {
               //取得请求路径LoginAction.ldy  
               String reqPath = request.getServletPath();
  
               //取得*指代的字符串LoginAction
               String actionName = reqPath.substring(1, reqPath.lastIndexOf(".ldy"));
  
                /**根据请求ActionName取得servlet中配置的Action实现类的名字
                *     cn.java.action.ActionLogin
                 */           
               String acionClassName = this.getInitParameter(actionName);
 
  
               //在Factory类中创建Action对象(Factory类在下面介绍)
               Action action = ActionFactory.getIns().getAction(acionClassName);
  
               //从实现Action类中取得响应发送的url
               String url = action.execute(request, response);
  
               if(null!=url){   
                    this.getServletContext().getRequestDispatcher(url).forward(request, response);  
  
               }else{
                    this.getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);  
  
  }
  
                 } catch (Exception e) {  
                 e.printStackTrace();
    } 
 }
  
}

 

 


             3.Action接口,被Action实现类实现。
       代码示例
     

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

   

 


         4.ActionFactory类,批量生产Action实现类对象。
      代码示例:
      

  public class ActionFactory extends HttpServlet{
 
      private static ActionFactory ac=null;
      private ActionFactory(){};//构造器私有化
 
    public static ActionFactory getIns(){
                if(null==ac){
                   ac = new ActionFactory();
                  }  
                   return ac;
                   }
 
 //在工程中批量生产Action类型的对象
    public Action getAction(String actionClass){
               Action actionInstance = null;
            try{
            actionInstance = (Action)Class.forName(actionClass).newInstance(); 
         
                }catch(Exception ef){
            ef.printStackTrace();  
                  }    
              return actionInstance;  
    }

}

 

        

 

 

 

         5.Action实现类,继承Action接口。处理各种业务逻辑,包过调用数据库。处理信息等等。
          代码示例:    

 

 public String execute(HttpServletRequest request,
         HttpServletResponse response) {
                 String name = request.getParameter("userName");
                 String pwd = request.getParameter("pwd");
     
     UserInfo user=MemoDBAccess.hasUser(userName, pwd);
                if(null!= user){
                  request.getSession().setAttribute("user", user);
                  return "/mainPage.jsp";
              }else{
                  request.setAttribute("error_msg", "您输入的账号或密码有误");
                  return "/login.jsp";
              }
     
 }
       }

 
        
        

 


             MVC的这5步实现中没有涉及pojo和dao类,但是Model模块是必须包过pojo和dao类的。有兴趣的可以自己编写。


      最后再介绍点MVC典型的优点吧,当然缺点也还是有的。低耦合性,视图层和业务层分离,样就允许更改视图层代码而不用重新编译模型和控制器代码。同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可,因为模型层与控制器和视图层向分离,这是可以实现的。分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

 

  


    


      

 

 

 

 

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值