新手学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 {@Overrideprotected 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语句太多,造成一定的不稳定,在这基础上抽出一个接口,然后把具体的业务的实现封装到单独的类里面,:

这里写图片描述

    具体的实现代码如下:

@Overrideprotected 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实现原理(改良版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下apache+php+mysql 环境配置方法

转自&#xff1a;http://www.jb51.net/article/30128.htm 一 准备 1 下载apache http://httpd.apache.org/download.cgi#apache24 httpd-2.2.22-win32-x86-openssl-0.9.8t.msiopenssl表示带有openssl模块&#xff0c;利用openssl可给Apache配置SSL安全链接 2 下载php http://wi…

USB枚举过程分析

1. 枚举是什么? 枚举就是从设备读取一些信息&#xff0c;知道设备是什么样的设备&#xff0c;如何进行通信&#xff0c;这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备&#xff0c;很重要的一点就是USB的枚举过程&#xff0c;只要枚举成功了&#xff0c;那么就…

CATia对计算机配置要求,【2人回答】求CATIA对电脑的详细配置要求-3D溜溜网

回答&#xff1a;1、内存要求在32G和64G之间。2、硬盘要求选择7200转机械硬盘&#xff0c;4k以上分辨&#xff0c;就选择SSD固态硬盘。3、CPU要求睿频在4.1GHZ以上&#xff0c;核心在6和8核之间。4、显卡要求显存在6GB和11GB之间&#xff0c;位宽要求在192bit和384bit之间。5、…

如何制作自动更新程序?

原文出自&#xff1a;http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自动更新程序&#xff1f; [版权所有 邱秋 2014 metaphysisyeah.net, 转载请注明出处] 最近为单位写了一个C/S结构的软件&#xff0c;这个软件是工作在单位的局域网内的。为了减轻为程序…

包含JS交互的混淆出错

2019独角兽企业重金招聘Python工程师标准>>> 小上司离职&#xff0c;我接手他负责的项目&#xff0c;进行版本更新的时候&#xff0c;在生成jar包测试的时候&#xff0c;点击按钮没有反应&#xff0c;页面是webview&#xff0c;按钮则是与js交互&#xff0c;logcat打…

计算机常用代码大全,常用电脑命令大全【图文】

导语 &#xff1a;电脑&#xff0c;这个在前几年貌似还离我们非常遥远的词汇&#xff0c;现在随着信息化社会的不断发展&#xff0c;已经走进了我们的千家万户。现在每一家新 装修 &#xff0c;它都作为一种必备的家用电器来使用。由此可见电脑对我们 现代 人的重要性。但电脑毕…

细数技术指标-[转载]

技术指标类别庞杂&#xff0c;要一一学全&#xff0c;基本不可能&#xff0c;也没有这个必要。我们只要掌握几个常用的指标&#xff0c;了解它们的原理&#xff0c;从而举一反三&#xff0c;就足够了。其实任何一种技术指标都是从形态、价格、量、时间这四项出发的&#xff0c;…

图论测试题(一)第一题:longest

第一题&#xff1a;longest 乌托邦有n个城市&#xff0c;某些城市之间有公路连接。任意两个城市都可以通过公路直接或者间接到达&#xff0c;并且任意两个城市之间有且仅有一条路径&#xff08;What does this imply? A tree!&#xff09;。 每条公路都有自己的长度&#xff0…

RTC实时时钟驱动

RTC&#xff08;Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间&#xff0c;并且在断电的情况下&#xff0c;RTC实时时钟也可以通过电池供电&#xff0c;一直运行下去。 RTC通过STRB/LDRB这两个ARM指令向CPU传送8位数据&#xff08;BCD码&#xff09;。数据包括秒&am…

计算机表格复制粘贴后不变,excel表格复制粘贴后格式不变

Excel使用过程中经常需要将一个表格内容复制粘贴到其他表格中去。如果原始表格设置了行高和列宽&#xff0c;选中要复制的区域复制后&#xff0c;当在其他表格选择一个单元格进行粘贴时&#xff0c;行高和列宽就都变了。下面介绍excel表格复制粘贴后格式不变的操作方法。excel表…

C++ Primer章课后编程问题

1、代码#include<iostream> int main() {using namespace std;int num1;int num2;int total0;cout << "请输入開始数字\n";cin >> num1;cout << "请输入结束数字\n";cin >> num2;for (num1; num1<num2; num1)total num1…

vs 常见问题汇总

vs添加对dll的引用 我们在使用vs进行开发调试的时候经常会遇到一个问题&#xff0c;就是当我们的主工程引用到其他工程更新的dll&#xff08;我们经常采用copy到工程目录的方法&#xff09;、亦或者当我们的多个工程引用到同一个dll文件的时候&#xff0c;我们怎么来配置&#…

斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...

▶有望推出四驱版本▶专利图已经曝光▶外观没有变化斯柯达柯珞克大家应该不会特别陌生&#xff0c;虽然它在前两个月才正式上市&#xff0c;不过作为一款合资的紧凑型SUV来说&#xff0c;它的关注度还是不错的。销量上&#xff0c;4月份交出了2668辆的成绩&#xff0c;虽然还不…

javascript实例——鼠标特效篇(包含2个实例)

鼠标是现在电脑的基本配置之一&#xff0c;也是最常用的输入命令的工具之一。本文将将一些与鼠标有关系的特效。 1、跟随鼠标移动的彩色星星 如题&#xff0c;会根据鼠标的移动而移动&#xff0c;并在鼠标周围随机来回移动&#xff0c;让人感觉在放大缩小。根据书上的代码做了一…

Perforce使用指南_forP4V

第一章 前言 Perforce SCM System是一款构建于可伸缩客户/服务器结构之上的软件配置管理工具。仅仅应用 TCP/IP&#xff0c;开发人员就能够通过多种Perforce客户端&#xff08;几种平台的GUI、WEB、或命令行&#xff09;访问 Perforce服务器。Perforce能够被快速和容易地部署…

曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台

1Cloudview1.5核心优势对于云计算而言&#xff0c;国产厂商也有着自己独到的云方案。曙光Cloudview云计算操作系统采用新一代云计算中心的全新的管理模型&#xff0c;充分考虑云计算中心的资源分配、业务运行和运维服务等各种管理要素&#xff0c;实现云计算中心的软硬件平台资…

直连测速服务器异常,求证! 网件R7800, Speedtest测速的怪现象,200M宽带+R7800者进...

本帖最后由 毛毛雨 于 2017-11-18 18:50 编辑宽带是联通FTTH 200M&#xff0c;标准千兆网线&#xff0c;千兆网卡。问题前的插曲&#xff1a;R7800刚到手&#xff0c;就迫不及待的换上了&#xff0c;结果&#xff0c;无论是路由器内置Speedtest册数&#xff0c;还是电脑端的Spe…

iOS socket

为什么80%的码农都做不了架构师&#xff1f;>>> #import "ViewController.h"interface ViewController ()<NSStreamDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>{NSInputStream *_inputStream;//对应输入流NSOutputS…

Macosx 安装 ionic 成功教程

2019独角兽企业重金招聘Python工程师标准>>> 一、首先介绍一下ionic ionic是一个用来开发混合手机应用的&#xff0c;开源的&#xff0c;免费的代码库。可以优化html、css和js的性能&#xff0c;构建高效的应用程序&#xff0c;而且还可以用于构建Sass和AngularJS的…

mac显示无法连接adobe服务器,Mac安装Adobe软件,如遇Error提示解决方法

Mac10.15.3 安装Adobe Photoshop 2020的时候一直提示Error错误The installation cannot continue as the installer file may be damaged. Download the installer file again.看到这种问题&#xff0c;一般第一想法就是安装包损坏了&#xff0c;本能的会再下载一遍甚至多遍&am…