文档章节

Servlet是如何实现MVC的?

MonroeCode
 MonroeCode
发布于 2016/12/26 16:41
字数 875
阅读 10
收藏 0

Servlet是一种服务器端的编程语言,是J2EE中比较关键的组成部分,Servlet技术的推出,扩展了Java语言在服务器端开发的功能,巩固了Java语言在服务器端开发中的地位,而且现在使用非常广泛的JSP技术也是基于Servlet的原理.

JSP+JavaBeans+Servlet成为实现MVC模式的一种有效的选择。

 

如果我们要实现一个对用户的增删改查,并且要求符合对扩展开发,对修改关闭的原则,该怎么做呢?

首先,这是我们的类图以及类与类之间调用的时序图。

 

 

根据UML图来实现代码:

TestServlet类

 

  1. package com.bjpowernode.servlet;  
      
    import java.io.IOException;  
    import java.util.List;  
      
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    public class TestServlet extends HttpServlet {  
      
          
        protected void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            String requestURI = request.getRequestURI();  
            System.out.println("requestURI=" + requestURI);  
            String path = requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));  
            System.out.println("path = " +path);  
              
            String username = request.getParameter("username");  
              
            Action action = null;  
            if("/servlet/delUser".equals(path)){  
                action = new DelUserAction();  
            }else if("/servlet/addUser".equals(path)){  
                action = new AddUserAction();  
            }else if("/servlet/modifyUser".equals(path)){  
                action = new ModifyAction();  
            }else if("/servlet/queryUser".equals(path)){  
                action = new QueryUserAction();  
            }else{  
                throw new RuntimeException("请求失败");  
            }  
            String forward ="";  
            try {  
                forward= action.execute(request, response);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            request.getRequestDispatcher(forward).forward(request, response);  
              
      
        }  
      
      
        protected void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            doGet(request,response);  
        }  
      
    }  

     

 

抽象接口Action

 

 

  1. package com.bjpowernode.servlet;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    public interface Action {  
      
        public String execute(HttpServletRequest request, HttpServletResponse response)  
        throws Exception;  
          
    }  

     


 

 

添加类,这里就只写添加类了,其他类一样

 

  1. package com.bjpowernode.servlet;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    public class AddUserAction implements Action {  
      
        public String execute(HttpServletRequest request,  
                HttpServletResponse response) throws Exception {  
            String username = request.getParameter("username");  
            //int age = Integer.parseInt(request.getParameter("username"));  
            //String sex = request.getParameter("sex");  
              
            //调用业务逻辑  
            UserManager userManager = new UserManager();  
            userManager.add(username);  
              
            return "/add_success.jsp";  
        }  
      
    }  

     

 

Web.xml配置

 

  1.   <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
      </welcome-file-list>  
        
      <servlet>  
        <servlet-name>TestServlet</servlet-name>  
        <servlet-class>com.bjpowernode.servlet.TestServlet</servlet-class>  
      </servlet>  
      <servlet-mapping>  
         <servlet-name>TestServlet</servlet-name>  
         <!--  
         <url-pattern>/servlet/TestServlet</url-pattern> 
          -->  
         <url-pattern>*.do</url-pattern>  
      </servlet-mapping>  
    

     

 

这里我们发现,在testAction类中,用到了大量的if和else,而当我们需要扩展一个上传类的时候,就需要修改if/else,所以,这就不符合对扩展开发,对修改关闭原则,所以,我们需要把这部分提取出来,配置到配置文件里,用反射进行配置。

 

我们需要先配置配置文件

 

  1. <action-config>  
            <action path ="/servlet/delUser" type = "com.bjpowernode.servlet.DelUserAction">  
                <forward name = "success">del_success.jsp</forward>  
                <forward name = "error">del_error.jsp</forward>  
            </action>   
            <action path ="/servlet/addUser" type = "com.bjpowernode.servlet.AddUserAction">  
                <forward name = "success">add_success.jsp</forward>  
                <forward name = "error">add_error.jsp</forward>  
            </action>   
            <action path ="/servlet/modifyUser" type = "com.bjpowernode.servlet.ModifyAction">  
                <forward name = "success">modify_success.jsp</forward>  
                <forward name = "error">modify_error.jsp</forward>  
            </action>   
            <action path ="/servlet/queryUser" type = "com.bjpowernode.servlet.QueryUserAction">  
                <forward name = "success">query_success.jsp</forward>  
                <forward name = "error">query_error.jsp</forward>  
            </action>   
    </action-config>  

     

 

需要获取actionMapping对象

 

  1. ActionMapping{  
        private String path;  
        private String type;  
       Map forwardMap;  
        
        
      }  
      forwardMap{  
        key = "success";  
        value ="/del_success.jsp"  
        key ="error"  
        value ="del_error.jsp";  
       
       
       
      }  
       
      Map map = new HashMap();  
      map.put("/servlet/delUser",actionMapping);  
      map.put("/servlet/addUser",actionMapping);  
      map.put("/servlet/modifyUser",actionMapping);  
      map.put("/servlet/queryUser",actionMapping);  
       
     // 如果是删除ActionMapping存储如下:  
      actionMapping{  
        path ="/servlet/delUser";  
       type ="com.bjpowernode.servlet.DelUserAction"  
        forwardMap{  
            key ="success",value ="/del_success.jsp"  
            key ="error",value"/del_error.jsp"  
        }  
      }  

     

  2.    

 

最后根据获取的对象采用反射来动态实例化Action,达到我们的目的。

 

  1.  String path = "/servlet/delUser";  
      
    /  根据截取的URL请求,到Map中取得本次请求对应的Action  
        ActionMapping actionMapping =(ActionMapping)map.get(path);  
          
    /取得本次请求对应的Action类的完整路径  
     String type = actionMapping.getType();  //com.bjpowernode.servlet.DelUserAction  
      
    // 采用反射动态实例化Action  
     Action action  = (Action)class.forName(type).newInstance();  
      
    /动态待用Action中的execute方法  
     String forward = action.execute(request.response);  
      
     //根据路径完成转向        
    request.getRequestDispatcher(forward).forward(request, response);  

     

        这样,我们基本就是实现了对扩展开发,对修改封闭的原则,但是,这仅仅是一个功能我们就需要做这么多事情,写这么多代码,对程序员来说这是一项不小的工作量,那么我们有没有其他的办法让我们的工作量小一点呢?

© 著作权归作者所有

MonroeCode

MonroeCode

粉丝 91
博文 142
码字总数 245009
作品 0
深圳
其他
私信 提问
深入理解Spring MVC 思想

一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 父子上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、s...

qq58edf1d989a2d
2018/06/26
0
0
J2EE核心技术之Servlet详解

想必大家都知道J2EE核心技术是什么~~ 1.JSP (大多用于MVC中的是图层) 2.Servlet(大多用于MVC中的控制层) 3.JDBC(大多用于MVC的模型层) 那么我从中间给大家开始讲讲,什么是Servlet: ...

JavaOlder
2012/12/10
1K
0
spring mvc 访问静态文件的问题!请指教!

这是web—xml的配置 TalentCloud index.jsp default *.js default *.css default *.png default *.jpg default *.gif spring3mvc org.springframework.web.servlet.DispatcherServlet 1 spri......

Ales_小溪
2013/07/22
837
1
spring3 mvc的深入研究

转载博文 目录 一、前言: 二、核心类与接口: 三、核心流程图 四、DispatcherServlet说明 五、双亲上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、如何访问到静态的文件,如jpg...

macsql
2012/06/21
2K
0
Spring MVC 教程,快速入门,深入分析

资源下载: SpringMVC教程快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一、前言 二、spring mvc 核心类与接口 三、spring mv...

Idiot_s_Sky
2014/02/05
559
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部