博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新手学Struts(一)----JSP+Servlet讲解MVC实现原理
阅读量:6717 次
发布时间:2019-06-25

本文共 4765 字,大约阅读时间需要 15 分钟。

    最近在学SSH(Struts+ Hibernate+Spring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊~~

这里写图片描述

    现在开始自己也要捣鼓捣鼓这些东西,还是有点小激动哒~~,Struts是基于MVC框架实现的,今天主要讲讲Struts的实现过程。

MVC基本原理


    MVC框架,相信大家也都已经耳熟蓝(能)翔(详)了!

这里写图片描述

  • 1、终端接受到用户的请求,然后转发给Controller进行处理。
  • 2、控制器接收到用户的请求后,确认采用什么样的业务逻辑来处理该请求,并将该请求转给相应的业务请求来进行处理。
  • 3、模型中包含处理该用户请求的所有业务组件,并且也执行用户所需要的全部数据存取,代表终端用户查询检索出的任何数据都被打包返回给控制器。
  • 4、控制器在经过业务的处理之后确定去调哪一个视图,并将处理后的数据传到视图上去,显示视图给用户。
        

一个简单的例子

    不灵活的Servlet的实现:

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 {
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI= request.getRequestURI(); System.out.print("requestURI"+requestURI); String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf(".")); System.out.println("path="+path); //获取界面的用户名 String username=request.getParameter("username"); UserManager userManger=new UserManager(); String forward=""; //通过截取url来判断执行的是什么方法 if("/servlet/delUser".equals(path)){ userManger.del(username); //页面跳转 forward="/del_success.jsp"; }else if("/servlet/addUser".equals(path)){ userManger.add(username); //页面跳转 forward="/add_success.jsp"; }else if("/servlet/modifyUser".equals(path)){ userManger.modify(username); //页面跳转 forward="/modify_success.jsp"; }else if("/servlet/queryUser".equals(path)){ List userList=userManger.query(username); request.setAttribute("userList", userList); //页面跳转 forward="/query_success.jsp"; }else{ throw new RuntimeException("请求失败!"); } //统一进行跳转 request.getRequestDispatcher(forward).forward(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}

    配置文件:

TestServlet
com.bjpowernode.servlet.TestServlet
TestServlet
*.action
index.jsp

当用户发送请求时,比如:(),然后根据有一定特点的URL来访问相应的Servlet。

    在上边的例子中的配置文件可以看出,URL连接的尾部为*.action,当用户访问该连接的时候,就会截取相应的URL段(servlet/…),然后根据截取的这一段来进行判断和页面转向。
    看上边的代码明显的可以看出其中的缺陷,代码中有大量的if…else语句,不稳定,如果说想要添加新的连接的时候,就要在不断的添加新的if…else语句,还有就是在页面跳转的时候,如果页面的名称换掉了,那么还要手动的去代码中修改,我的天哪,真是太麻烦了!

改良的例子

    由于if…else语句太多,造成一定的不稳定,在这基础上抽出一个接口,然后把具体的业务的实现封装到单独的类里面,:

这里写图片描述

    具体的实现代码如下:

@Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String requestURI= request.getRequestURI();        System.out.print("requestURI"+requestURI);        String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));        System.out.println("path="+path);        Action action=null;        //通过截取url来判断执行的是什么方法        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 ModifyUserAction();           }else if("/servlet/queryUser".equals(path)){            action=new QueryUserAction();            }else{            throw new RuntimeException("请求失败!");        }        String forward=null;        try{            forward=action.execute(request, response);        }catch(Exception e){            e.printStackTrace();        }        //进行统一转向        request.getRequestDispatcher(forward).forward(request, response);    }

    经过以上的改良,这个已经算是一个基本的MVC的实现了,有专门的前台UI界面,Servlet负责URL的截取,业务的处理以及页面的转向。对功能的实现进行了很好的分离,从而来保证其稳定性和扩展性。

    时序图如下:

Created with Raphaël 2.1.0web客户端web客户端TomcatTomcatHttpServletRequestHttpServletRequestHttpServletResponseHttpServletResponseFrontControllerServletFrontControllerServletActionAction视图视图1、request(请求是有规则的,如*.action或*.do)2、new3、new4、doGet/doPost5、截取URL6、根据URL分发到相应的Action7、读取配置文件8、new9、execute(request/response)10、返回转向信息11、根据返回信息转向到相应的视图12、渲染视图13、response

Struts基本流程的实现


    下面来说一说Struts的基本流程是怎么实现的,也就是MVC的基本流程,和上面的时序图类似:

  • 1、web客户端发送请求给Servlet(要遵守一定的规则)
  • 2、Servlet截取URL,读取配置文件(struts-config.xml)中的这次请求相关的Action
  • 3、然后去调用相应的Action,分发(dispatch)
  • 4、调用模型层,获取相应的数据,并返回给Servlet
  • 5、转向,跳转到相应的jsp界面
  • 6、渲染页面,返回给客户显示

    流程如下:

这里写图片描述

源码打包下载:

你可能感兴趣的文章
FTP服务器搭建下的主动模式和被动模式
查看>>
owncloud在CentOS上详细部署
查看>>
MyEclipse 代码运行生产的key
查看>>
Ubuntu下彻底删除vim
查看>>
HTML页面静态化实现
查看>>
关于selenium中断言判断url获取错误解决
查看>>
mysql的排障之二
查看>>
oracle 恢复学习 案例1 一个数据文件丢失 完全恢复数据库
查看>>
OpenStack 搭建(三)
查看>>
sendmail在企业网中的应用(下)
查看>>
zabbix日志监控
查看>>
竖直滚动 jquery 文字 图片
查看>>
设计模式系列-装饰模式
查看>>
C# Lambda表达式Contains方法 like
查看>>
第三章--进程
查看>>
Docker部署CouchDB
查看>>
关于namespace的一点点心得体会(2017年8月3日14:55:37)
查看>>
Android Studio中默认图标的引用
查看>>
keepalived的原理和基本实现
查看>>
Android Activity之间动画完整版详解
查看>>