javaweb(二十一)——JavaWeb的两种开发模式

一、JSP+JavaBean开发模式

1.1、jsp+javabean开发模式架构

  jsp+javabean开发模式的架构图如下图(图1-1)所示

图1-1

  在jsp+javabean架构中,JSP负责控制逻辑、表现逻辑、业务对象(javabean)的调用。

  JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据。

1.2、JSP+JavaBean开发模式编写计算器

  首先分析一下jsp和javabean各自的职责,jsp负责显示计算器(calculator)页面,供用户输入计算数据,并显示计算后的结 果,javaBean负责接收用户输入的计算数据并且进行计算,JavaBean具有firstNum、secondNum、result、 operator属性,并提供一个calculate方法。

  1、编写CalculatorBean,负责接收用户输入的计算数据并且进行计算

  CalculatorBean代码如下:

复制代码
 1 package me.gacl.domain;
 2 
 3 import java.math.BigDecimal;  4  5 /**  6  * @author gacl  7  * CalculatorBean用于接收输入参数和计算  8 */  9 public class CalculatorBean { 10 11 //用户输入的第一个数 12 private double firstNum; 13 //用户输入的第二个数 14 private double secondNum; 15 //用户选择的操作运算符 16 private char operator = '+'; 17 //运算结果 18 private double result; 19 20 public double getFirstNum() { 21 return firstNum; 22  } 23 24 public void setFirstNum(double firstNum) { 25 this.firstNum = firstNum; 26  } 27 28 public double getSecondNum() { 29 return secondNum; 30  } 31 32 public void setSecondNum(double secondNum) { 33 this.secondNum = secondNum; 34  } 35 36 public char getOperator() { 37 return operator; 38  } 39 40 public void setOperator(char operator) { 41 this.operator = operator; 42  } 43 44 public double getResult() { 45 return result; 46  } 47 48 public void setResult(double result) { 49 this.result = result; 50  } 51 52 /** 53  * 用于计算 54 */ 55 public void calculate() { 56 57 switch (this.operator) { 58 case '+': { 59 this.result = this.firstNum + this.secondNum; 60 break; 61  } 62 case '-': { 63 this.result = this.firstNum - this.secondNum; 64 break; 65  } 66 case '*': { 67 this.result = this.firstNum * this.secondNum; 68 break; 69  } 70 case '/': { 71 if (this.secondNum == 0) { 72 throw new RuntimeException("被除数不能为0!!!"); 73 } 74 this.result = this.firstNum / this.secondNum; 75 // 四舍五入 76 this.result = new BigDecimal(this.result).setScale(2, 77 BigDecimal.ROUND_HALF_UP).doubleValue(); 78 break; 79 } 80 default: 81 throw new RuntimeException("对不起,传入的运算符非法!!"); 82 } 83 } 84 }
复制代码

  2、编写calculator.jsp,负责显示计算器(calculator)页面,供用户输入计算数据,并显示计算后的结果

  calculator.jsp页面代码如下:

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  2 <%--使用me.gacl.domain.CalculatorBean --%>  3 <jsp:useBean id="calcBean" class="me.gacl.domain.CalculatorBean"/>  4 <%--接收用户输入的参数 --%>  5 <jsp:setProperty name="calcBean" property="*"/>  6 <%  7 //使用CalculatorBean进行计算  8  calcBean.calculate();  9 %> 10 <!DOCTYPE HTML> 11 <html> 12 <head> 13 <title>使用【jsp+javabean开发模式】开发的简单计算器</title> 14 </head> 15 16 <body> 17 <br/> 18  计算结果是: 19 <jsp:getProperty name="calcBean" property="firstNum"/> 20 <jsp:getProperty name="calcBean" property="operator"/> 21 <jsp:getProperty name="calcBean" property="secondNum"/> 22  = 23 <jsp:getProperty name="calcBean" property="result"/> 24 25 <br/><hr> <br/> 26 <form action="${pageContext.request.contextPath}/calculator.jsp" method="post"> 27 <table border="1px"> 28 <tr> 29 <td colspan="2">简单的计算器</td> 30 </tr> 31 <tr> 32 <td>第一个参数</td> 33 <td><input type="text" name="firstNum"></td> 34 </tr> 35 <tr> 36 <td>运算符</td> 37 <td><select name="operator"> 38 <option value="+">+</option> 39 <option value="-">-</option> 40 <option value="*">*</option> 41 <option value="/">/</option> 42 </select></td> 43 </tr> 44 <tr> 45 <td>第二个参数</td> 46 <td><input type="text" name="secondNum"></td> 47 </tr> 48 <tr> 49 <td colspan="2"><input type="submit" value="计算"></td> 50 </tr> 51 </table> 52 </form> 53 </body> 54 </html>
复制代码

运行结果如下:

  

二、Servlet+JSP+JavaBean开发模式

  在平时的JavaWeb项目开发中,在不使用第三方mvc开发框架的情况下,通常会选择Servlet+JSP+JavaBean开发模式来开发JavaWeb项目,Servlet+JSP+JavaBean组合开发就是一种MVC开发模式了,控制器(Controller)采用Servlet、模型(Model)采用JavaBean、视图(View)采用JSP。在讲解Servlet+JSP+JavaBean开发模式之前,先简单了解一下MVC开发模式。

2.1、Web开发中的请求-响应模型

图2-1

  在Web世界里,具体步骤如下:

  1、Web浏览器(如IE)发起请求,如访问http://www.iteye.com/

  2、Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html)。

  3、web服务器处理完成后,返回内容给web客户端(一般就是我们的浏览器),客户端对接收的内容进行处理(如web浏览器将会对接收到的html内容进行渲染以展示给客户)。

  因此,在Web世界里:都是Web客户端发起请求,Web服务器接收、处理并产生响应。

  一般Web服务器是不能主动通知Web客户端更新内容。虽然现在有些技术如服务器推(如Comet)、还有现在的HTML5 websocket可以实现Web服务器主动通知Web客户端。

  到此我们了解了在web开发时的请求/响应模型,接下来我们看一下标准的MVC模型是什么。

2.2、标准MVC模型概述

  MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离。如下图(图2-2)所示:

图2-2

2.3、MVC(Model-View-Controller)的概念

  首先让我们了解下MVC(Model-View-Controller的概念:

  Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型(domain)或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

  View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

  Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。

  从图2-1我们还看到,在标准的MVC中模型能主动推数据给视图进行更新(观察者设计模式,在模型上注册视图,当模型更新时自动更新视图),但在Web开发中模型是无法主动推给视图(无法主动更新用户界面),因为在Web开发是请求-响应模型。

  那接下来我们看一下在Web里MVC是什么样子,我们称其为 Web MVC 来区别标准的MVC。

2.4.、Web MVC概述

  Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念一样,我们再看一下Web MVC标准架构,如下图(图2-3)所示:

图2-3

  在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请求(即请求-响应模型)。

2.5、Servlet+JSP+JavaBean开发模式介绍

    Servlet+JSP+JavaBean架构其实可以认为就是我们所说的Web MVC模型,只是控制器采用Servlet、模型采用JavaBean、视图采用JSP,如图2-3

图2-4

具体示例代码:

1、模型(model)

  

2、视图(View)

  

3、控制器(controller)

  

  从Servlet+JSP+JavaBean(Web MVC)架构可以看出,视图和模型分离了,控制逻辑和展示逻辑分离了。

三、Servlet+JSP+JavaBean开发模式的缺点

  Servlet+JSP+JavaBean(Web MVC)架构虽然实现了视图和模型分离以及控制逻辑和展示逻辑分离,但也有一些比较严重的缺点

3.1、Servlet作为控制器的缺点

  此处的控制器使用Servlet,使用Servlet作为控制器有以下几个缺点:

  1、控制逻辑可能比较复杂,其实我们可以按照规约,如请求参数submitFlag=toLogin,我们其实可以直接调用toLogin方法,来简化控制逻辑;而且每个模块基本需要一个控制器,造成控制逻辑可能很复杂。现在流行的Web MVC框架(如Struts2)都支持"请求参数submitFlag=toAdd,就可以直接调用toAdd方法"这样的处理机制,在Struts2中类似这样的处理机制就称为"动态方法调用"

  2、请求参数到模型的封装比较麻烦,如果能交给框架来做这件事情,我们可以从中得到解放。

  请求参数到模型的封装代码:

复制代码
1 // 1收集参数
2 String username = req.getParameter("username");
3 String password = req.getParameter("password"); 4 // 2封装参数 5 UserBean user = new UserBean(); 6 user.setUsername(username); 7 user.setPassword(password);
复制代码

  当有几十个甚至上百个参数需要封装到模型中时,这样写恐怕就痛苦万分了,要写几十次甚至上百次这样的代码,估计写到吐了,所以现在流行的Web MVC框架(如Struts2)都提供了非常方便的获取参数,封装参数到模型的机制,减少这些繁琐的工作。

  3、选择下一个视图,严重依赖Servlet API,这样很难或基本不可能更换视图。

例如:使用Servlet API提供的request对象的getRequestDispatcher方法选择要展示给用户看的视图

复制代码
1  private void toLogin(HttpServletRequest req, HttpServletResponse resp)
2             throws ServletException, IOException { 3 //使用Servlet API提供的request对象的getRequestDispatcher方法选择视图 4 // 此处和JSP视图技术紧密耦合,更换其他视图技术几乎不可能 5 request.getRequestDispatcher("/mvc/login.jsp").forward(request, response); 6 }
复制代码

  4、给视图传输要展示的模型数据,也需要使用Servlet API,更换视图技术也要一起更换,很麻烦。

例如:使用Servlet API提供的request对象给视图传输要展示的模型数据

//使用Servlet API提供的request对象给视图login.jsp传输要展示的模型数据(user)
request.setAttribute("user", user);
request.getRequestDispatcher("/mvc/login.jsp").forward(request, response)

3.2、JavaBean作为模型的缺点

  此处模型使用JavaBean,JavaBean组件类既负责收集封装数据,又要进行业务逻辑处理,这样可能造成JavaBean组件类很庞大,所以一般现在项目都是采用三层架构,而不直接采用JavaBean

3.3、视图的缺点

  现在被绑定在JSP,很难更换视图,比如Velocity、FreeMarker;比如我要支持Excel、PDF视图等等。

  关于JavaWeb的两种开发模式的讲解就介绍到这里,下一篇将使用servlet+jsp+javabean来开发一个用户登录注册功能,以此来加深servlet+jsp+javabean开发模式的理解。

转载于:https://www.cnblogs.com/zy-jiayou/p/7373192.html

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

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

相关文章

概率论与数理统计思维导图知识框架_考研概率论与数理统计 综合题型秘籍思维导图① 随机变量1~3章 [21考研上岸之旅]...

Hello World&#xff0c;我的朋友&#xff0c;这里是一颗小白蛋&#xff0c;大千世界&#xff0c;很高兴以这样的方式与你相遇前言在复习过程中发现概率论知识点很少且集中 所以没有分开章节去整理王安式概率论辅导讲义张宇概率论9讲方浩强化班1800题 综合题型秘籍在学习过程中…

php mysql删除失败_php+MySQL实战案例【七】数据编辑、删除

​本节内容中讲解用户管理模块中的修改用户信息和删除用户。修改用户信息&#xff1a;可对选择的用户记录进行编辑&#xff0c;可修改用户名、密码、性别、手机、邮箱和地址信息。删除用户信息&#xff1a;将列表中指定的用户进行删除操作。二、编辑用户信息编辑用户信息&#…

1.three.js世界的4大要素

一、三大组件 在Three.js中&#xff0c;要渲染物体到网页中&#xff0c;我们需要3个组建&#xff1a;场景&#xff08;scene&#xff09;、相机&#xff08;camera&#xff09;和渲染器&#xff08;renderer&#xff09;。有了这三样东西&#xff0c;才能将物体渲染到网页中去。…

架构设计 例子和实践

系统设计说明书(架构、概要、详细)目录结构 虽然这些文档一般来说公司都是有模板的&#xff0c;但我写这些文档以来基本上是每写一次就把目录结构给改一次&#xff0c;应该说这是因为自己对这些文档的理解开始加深&#xff0c;慢慢的越来越明白这些文档的作用和其中需要阐述的东…

activiti 批量 mysql_Activiti6系列(3)- 快速体验

一、部署启动activiti####1、部署&#xff0c;将两个war包拷贝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、启动tomcat&#xff0c;访问http://127.0.0.1:8080/activiti-app默认账号密码&#xff1a;ad…

【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll...

今天在安装了jetbrains官网上的ToolBox软件后&#xff0c;没有办法启动起来&#xff0c;报错如下&#xff1a; 无法启动此程序&#xff0c;因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll 尝试重新安装了并没有什么用&#xff0c;现在来解决方法&#xff1a; 直接找到官方的…

论文: YOLO9000-Better,Faster,Stronger

论文阅读&#xff1a; YOLO9000-Better,Faster,Stronger YOLOv2 是经过改造之后的YOLO Batch Normalization&#xff1a;在所有的conv layer后加了BN之后提高了2% mAP&#xff0c;BN可以帮助regularize模型&#xff0c;这样的话就可以放弃 dropout。 High Resolution Classifi…

怎么ie取消要打开或保存来自_取消认证后,发票抵扣就这么简单!

点击标题下「中财讯集团」可快速关注3月1日起&#xff0c;取消增值税发票认证的纳税人范围扩大至全部一般纳税人。一般纳税人可以自愿使用增值税发票选择确认平台查询、选择用于申报抵扣、出口退税或者代办退税的增值税发票信息。具体如何操作呢&#xff1f;掌握以下步骤&#…

好的软件架构设计

什么是架构 前言&#xff1a;软体设计师中有一些技术水平较高、经验较为丰富的人&#xff0c;他们需要承担软件系统的架构设计&#xff0c;也就是需要设计系统的元件如何划分、元件之间如何发生相互作用&#xff0c;以及系统中逻辑的、物理的、系统的重要决定的作出。在很多公…

python线程状态_Python线程

1. 线程基础1.1. 线程状态线程有5种状态&#xff0c;状态转换的过程如下图所示&#xff1a;1.2. 线程同步(锁)多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时&#xff0c;可能存在数据不同步的问题。考虑这样一种情况&#xff1a;一个列…

JavaScript中错误正确处理方式,你用对了吗?

JavaScript的事件驱动范式增添了丰富的语言&#xff0c;也是让使用JavaScript编程变得更加多样化。如果将浏览器设想为JavaScript的事件驱动工具&#xff0c;那么当错误发生时&#xff0c;某个事件就会被抛出。理论上可以认为这些发生的错误只是JavaScript中的简单事件。 本文将…

文件分割机

文件分割与合并 要求&#xff1a;实现对大文件的分割与合并。 按指定个数切&#xff08;如把一个文件切成10份&#xff09;或按指定大小切&#xff08;如每份最大不超过10M&#xff09;&#xff0c;这两种方式都能够。 程序说明&#xff1a; 文件分割&#xff1a;把一个文件分割…

mysql pow函数怎么用_pow函数怎么用

PHP pow函数表示指数表达式。pow函数怎么用&#xff1f;php pow()函数 语法作用&#xff1a;pow()函数的作用是将一个数进行n次方计算后返回语法&#xff1a;pow(X,Y);参数&#xff1a;X表示要做处理的数字Y表示指定n次方中的n数值说明&#xff1a;返回X的Y次方幂&#xff0c;如…

【IntelliJ IDEA】添加一个新的tomcat,tomcat启动无法访问欢迎页面,空白页,404

第一部分&#xff0c;添加一个tomcat 1.先把Toolbar 和 Tool Buttons显示出来 2.选择Edit Configurations 3.添加一个新的tomcat server进来 解决no artifacts configured问题&#xff0c;就是没有项目加入里面 先添加一个没有的项目 启动之后找不到 页面 第二部分&#xff0c…

mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql开发 j2ee(一)

在这里是使用eclipse&#xff0b;tomcat&#xff0b;mysql的方式。1、软件下载(1) eclipse我使用的是mac&#xff0c;因为本人是苹果客户端开发者&#xff0c;所以目前只有苹果机器了。首先下载eclipse for mac&#xff0c;选择mac 64位&#xff0c;下载eclipse-jee-kepler-SR1…

社交系统ThinkSNS-plus(TS+)V1.0发布!

2019独角兽企业重金招聘Python工程师标准>>> 需要购买源码的同志们&#xff0c;依然随时可以联系我们手机&#xff1a;18108035545&#xff08;同微信&#xff09;&#xff1b;电话&#xff1a;028-82884828 &#xff1b;QQ&#xff1a;3298713109&#xff1b; 从决…

.net 读取mysql数据库配置文件_.NETCore添加及读取默认配置文件信息

这里的默认配置文件指的是项目中的appsettings.json文件&#xff0c;我们可以把一些配置信息保存在里面&#xff0c;比如数据库连接信息。来吧&#xff0c;看例子&#xff1a;1、先在appsettings.json文件中写入数据库的连接信息&#xff1a;{"Logging": {"LogL…

h5 img js 点击图片放大_H5实现移动端图片预览:手势缩放, 手势拖动,双击放大......

查看示例效果&#xff1a;一、功能介绍图片预览主要有以下几个功能点组成&#xff1a;监听图片点击事件&#xff0c;进入图片预览模式自定义手势事件, (双指缩放&#xff0c;滑动&#xff0c;双击。。。)监听图片手势事件&#xff0c;通过 transform-matrix 实现图片的各种变换…

[转载]建立团队沟通协作工作方式

很多初创团队、以及刚开始尝试敏捷的团队&#xff0c;没有工作协议的概念&#xff0c;热热闹闹&#xff0c;混混乱乱。本文介绍了关于工作协议的What, Why, Who, When, 以及How。 What:什么是工作协议 工作协议&#xff1a;由团队共同商议&#xff0c;达成一致遵守的一组规则、…

linux安装自带mysql吗_Linux下安装mysql

前提下必须要有这三个文件夹A.jpgB.jpg还要安装这两个软件&#xff1b;直接百度官网即可&#xff1b;先通过Xftp6这个软件&#xff0c;编译文件夹&#xff0c;C.jpg搭建mysql1.查看CentOS自带的mysqlrpm -qa | grep mysql2.卸载CentOS自带的mysqlrpm -e --nodeps 要卸载的软件3…