新手学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,一经查实,立即删除!

相关文章

中国首台千万亿次超级计算机,中国首台千万亿次超级计算机首批设备开始试用...

新华社天津&#xff11;月&#xff11;&#xff13;日电(记者 周润健 罗捷)记者&#xff11;&#xff13;日从国家超级计算天津中心获悉&#xff0c;中国首台千万亿次超级计算机“天河一号”首批设备调试工作结束&#xff0c;具备向客户提供服务的条件&#xff0c;“天河一号”…

Outlook Express 错误代码表

错误码 意义 一般 0x800C01310x800C013E 可能是 Folders.dbx 档案属性错误或损坏. 0x800CCC00 身份验证&#xff08;Authentication&#xff09;未载入 0x800CCC01 认证&#xff08;Certificate&#xff09;内容错误 0x800CCC02 认证日期错误 0x800CCC03 使用者已联机 0x800CCC…

USB设备枚举过程

&#xff08;1&#xff09;集线器检测新设备 &#xff08;集线器的英文称为“Hub”&#xff09;主机集线器监视着每个端口的信号电压&#xff0c;当有新设备接入时便可觉察。&#xff08;集线器端口的两根信号线的每一根都有15kΩ的下拉电阻&#xff0c;而每一个设备在D都有一个…

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…

计算机工作原理 公开课,《计算机的基本工作原理》公开课材料(11页)-原创力文档...

《计算机系统的组成》教学设计教师&#xff1a;吴军一、学习者分析初一的学生&#xff0c;具有活泼好动的特点&#xff0c;怀着对初中生活的憧憬来到一个新的环境里&#xff0c;对每样事物都充满着好奇&#xff0c;都想去探个究竟。随着社会的进步&#xff0c; 计算机的使用范围…

USB枚举过程分析

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

linux -- read(), write()

read()函数 2011-03-23 16:28:37| 分类&#xff1a; linux | 标签&#xff1a; |字号大中小 订阅 read函数从打开的设备或文件中读取数据。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值&#xff1a;成功返回读取的字节数&…

jquery的$.extend、$.fn.extend、 jQuery.extend( target, object1, [objectN])作用及区别

jQuery为开发插件提拱了两个方法&#xff0c;分别是&#xff1a; jQuery.fn.extend();jQuery.extend(); 虽然 javascript 没有明确的类的概念&#xff0c;但是用类来理解它&#xff0c;会更方便。 jQuery便是一个封装得非常好的类&#xff0c;比如我们用 语句 $("#btn1&…

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;…

[javaSE] 看博客学习java并发编程

共享性 多线程操作同一个数据&#xff0c;产生线程安全问题 新建一个类ShareData 设计一个int 型的成员变量count 设计一个成员方法addCount()&#xff0c;把count变量 在main函数中开启多个线程操作这个成员变量&#xff0c;在main函数里 获取ShareData对象&#xff0c;new 出…

GetProcAddress() LoadLibrary() DLL

GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。 函数原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名 ); 参数&#xff1a; hModule [in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary…

小学计算机输入法主题教研设计,《拼音输入法》教学设计.doc

10.拼音输入法【教材分析】《拼音输入法》是浙江摄影出版社出版的新版《小学信息技术》三年级下册第三单元第10课。信息技术是一门技能课&#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…

Compass样式重置

1. 全局样式重置 main.scss文件插入 import "compass/reset"; 对应的生成css为 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, sa…

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

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