新手学Struts(一)----JSP+Servlet讲解MVC实现原理

  • MVC基本原理
    • 一个简单的例子
  • 改良的例子
  • Struts基本流程的实现

    最近在学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);
    }

}

    配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <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>*.action</url-pattern>
  </servlet-mapping>    

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

当用户发送请求时,比如:(http://localhost:8080/test_servlet/servlet/queryUser.action),然后根据有一定特点的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、渲染页面,返回给客户显示

    流程如下:

源码打包下载:JSP+Servlet讲解MVC实现原理

JSP+Servlet讲解MVC实现原理(改良版)

时间: 2016-04-24

新手学Struts(一)----JSP+Servlet讲解MVC实现原理的相关文章

Java Web开发速学宝典(JSP+Servlet+Struts 2 + Hibernate + Spring)源代

文为原创,如需转载,请注明作者和出处,谢谢!      由于有些读者因随书光盘遗失,应广大读者的要求,特提供<Java Web开发速学宝典>一书的源代码下载,由于源代码所使用的jar包过大(随书光盘中包含了完整的源代码和jar包),在这里只提供了jar文件的列表,读者可以自行获得这些jar包,见下图. 各章节例子源码 综合项目案例源码 jar文件列表 定购china-pub当当网北京新华书店 市场价 : ¥59.00 普通会员 : ¥48.38 1-3星会员: ¥47.20 4-5星会员: ¥

Java Web开发速学宝典(JSP+Servlet+Struts 2 + Hibernate + Spring)源代码下载

文为原创,如需转载,请注明作者和出处,谢谢!      由于有些读者因随书光盘遗失,应广大读者的要求,特提供<Java Web开发速学宝典>一书的源代码下载,由于源代码所使用的jar包过大(随书光盘中包含了完整的源代码和jar包),在这里只提供了jar文件的列表,读者可以自行获得这些jar包,见下图. 各章节例子源码 综合项目案例源码 jar文件列表 定购china-pub当当网北京新华书店 市场价 : ¥59.00 普通会员 : ¥48.38 1-3星会员: ¥47.20 4-5星会员: ¥

新手学Struts(二)----Struts2工作机制

    Struts2的体系结构如图所示:     从上图可以看出,一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助:) 3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Spring+Ajax (附源代码)

本文为原创,如需转载,请注明作者和出处,谢谢! 源代码下载 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23 图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Sp

本文为原创,如需转载,请注明作者和出处,谢谢! 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23   图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.对 AJ

基于jsp+servlet图书管理系统之后台用户信息插入操作

前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研知识,趁着这学期的结束(马上就要放寒假了),写写最近练习的基于jsp+servlet+前台模板写的图书管理系统,一点一点写吧,详细的注释已经在代码上说明,希望对学习基于java开发的web方向的童鞋有所帮助.今天先把写的用户信息管理的添加(插入)操作分享一下,使用了一些特殊的知识,也会做一下说明.更

Without SSH/JSP/Servlet,不走寻常路,Java可以更酷

标题的构思来源于Rod Johnson的那本"Without EJB"以及CCTV5中一句耳熟能详的广告词, 不过此文并不是用来批判SSH(Struts.Spring.Hibernate)/JSP/Servlet的, 也不是为某品牌做广告,而是用来分享这将近一年来的研究心得. 设计的起点最初是以JSP/Servlet为基础的, 但是跟Rails这样的框架相比还是没有明显的优势, 比如在不使用反射的情况下, 很难将不同的uri对应到Servlet类中的public方法. (Servlet

请问jsp,servlet,javabean之间如何相互访问

问题描述 请问jsp,servlet,javabean之间如何相互访问 有几张jsp页面,页面之间需要数据往来.具体问题如下: 方法1.用session传值,各个jsp页面提交后,servlet将网页传来的值写到session中,下一张jsp读出session的值,显示在相应位置.问题是,下一张jsp中要取得的值不完全是上一张提交的,可能需要上一张提交的内容进行大量运算得到,要用一个javabean进行计算,javabean中如何取得session的值呢?我想通过在jsp中构造函数传递用<%Re

Struts VS Spring 两种MVC框架比较

比较 基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC 框架有Spring MVC.Tapestry.JSF等.这些大多是著名团队的作品,另外还有一些边缘团队的作品,也相当出色,如Dinamica.VRaptor等.这些框架都提供了较好的层次分隔能力.在实现良好的MVC 分隔的基础上,通过提供一些现成的辅助类库,同时也促进了生产效率的提高. 如何选择