MVC框架

一个实现 MVC 模式的应用包含模型、视图、控制器 3 个模块:

模型:封装了应用的数据和业务逻辑,负责管理系统业务数据

视图:负责应用的展示

控制器:负责与用户进行交互,接收用户输入、改变模型、调整视图的显示

基于MVC架构模式的 Java Web 开发

采用了 Servlet + JSP + JavaBean 的技术实现

基于MVC架构模式的 Java Web 开发步骤

1. 定义一系列的 Bean 来表示数据

2. 使用一个 Dispatcher Servlet 和控制类来处理用户请求

3. 在 Servlet 中填充 Bean

4. 在 Servlet 中,将 Bean 存储到 request、session、servletContext中

5. 将请求转发到 JSP 页面

6. 在 JSP 页面中,从 Bean 中提取数据。

其中 Dispatcher servlet 必须完成如下功能:

1. 根据 URI 调用相应的 action

2. 实例化正确的控制器类

3. 根据请求参数值来构造表单 bean

4. 调用控制器对象的相应方法

5. 转发到一个视图(JSP页面)

每个 HTTP 请求都发送给控制器,请求中的 URI 标识出对应的 action。action 代表了应用可以执行的一个操作。一个提供了 Action 的 Java 对象称为 action 对象。

控制器会解析 URI 并调用相应的 action,然后将模型对象放到视图可以访问的区域,以便服务器端数据可以展示在浏览器上。最后控制器利用 RequestDispatcher 跳转到视图(JSP页面),在JSP页面使用 EL 以及定制标签显示数据。

注意:调用 RequestDispatcher.forward 方法并不会停止执行剩余的代码。因此,若 forward 方法不是最后一行代码,则应显示的返回。

使用MVC模式的实例

目录结构如下

代码如下

DispatcherServlet.java

package app16c.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import app16c.controller.InputProductController;
import app16c.controller.SaveProductController;@WebServlet(name = "DispatcherServlet", urlPatterns = {"/product_input.action", "/product_save.action"})
public class DispatcherServlet extends HttpServlet {private static final long serialVersionUID = 1L;public DispatcherServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {process(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String uri = request.getRequestURI();int lastIndex = uri.lastIndexOf("/");String action = uri.substring(lastIndex + 1);String dispatcherUrl = null;if (action.equals("product_input.action")) {InputProductController controller = new InputProductController();dispatcherUrl = controller.handleRequest(request, response);} else if (action.equals("product_save.action")) {SaveProductController controller = new SaveProductController();dispatcherUrl = controller.handleRequest(request, response);}if (dispatcherUrl != null) {RequestDispatcher rd = request.getRequestDispatcher(dispatcherUrl);rd.forward(request, response);}}
}

Controller.java

package app16c.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public interface Controller {public abstract String handleRequest(HttpServletRequest request, HttpServletResponse response);
}

InputProductController.java

package app16c.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class InputProductController implements Controller {@Overridepublic String handleRequest(HttpServletRequest request, HttpServletResponse response) {return "/WEB-INF/jsp/ProductForm.jsp";}
}

SaveProductController.java

package app16c.controller;import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import app16c.domain.Product;
import app16c.form.ProductForm;
import app16c.validator.ProductValidator;public class SaveProductController implements Controller {@Overridepublic String handleRequest(HttpServletRequest request, HttpServletResponse response) {ProductForm productForm = new ProductForm();productForm.setName(request.getParameter("name"));productForm.setDescription(request.getParameter("description"));productForm.setPrice(request.getParameter("price"));ProductValidator productValidator = new ProductValidator();List<String> errors = productValidator.validate(productForm);System.out.println(errors);if (errors.isEmpty()) {Product product = new Product();product.setName(productForm.getName());product.setDescription(productForm.getDescription());product.setPrice(Float.parseFloat(productForm.getPrice()));// insert code to save product to the databaserequest.setAttribute("product", product);return "/WEB-INF/jsp/ProductDetails.jsp";} else {request.setAttribute("errors", errors);request.setAttribute("form", productForm);return "/WEB-INF/jsp/ProductForm.jsp";}}
}

ProductValidator.java

package app16c.validator;import java.util.ArrayList;
import java.util.List;
import app16c.form.ProductForm;public class ProductValidator {public List<String> validate(ProductForm productForm) {List<String> errors = new ArrayList<>();String name = productForm.getName();if (name == null || name.trim().isEmpty()) {errors.add("Product must have a name");}String price = productForm.getPrice();if (price == null || price.trim().isEmpty()) {errors.add("Product must have a price");}else {try {Float.parseFloat(price);} catch (NumberFormatException e) {errors.add("Invalid price value.");}}return errors;}
}

Product.java

package app16c.domain;import java.io.Serializable;public class Product implements Serializable { // 一个JavaBean 实现该接口,其实例可以安全的将数据保存到 HttpSession 中。private static final long serialVersionUID = 1L;private String name;private String description;private float price;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}
}

ProductForm.java

package app16c.form;// 表单类与 HTML表单相映射,是HTML表单在服务端的代表
public class ProductForm {  // 表单类不需要实现 Serializable 接口,因为表单对象很少保存在 HttpSession 中。private String name;private String description;private String price;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}
}

ProductForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  <!-- taglib指令用来引用标签库并设置标签库的前缀  --><!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Add Product Form</title><link rel="stylesheet" type="text/css" href="css/main.css" />  <!-- 外部样式表 -->
</head>
<body><div id="global"><c:if test="${requestScope.errors != null }">  <!-- EL表达式 --><p id="errors">Error(s)!<ul><c:forEach var="error" items="${requestScope.errors }">  <!-- jstl 遍历 --><li>${error }</li></c:forEach></ul></p></c:if><form action="product_save.action" method="post"><fieldset><legend>Add a product</legend><p><label for="name">Product Name: </label><input type="text" id="name" name="name" tabindex="1" /></p><p><label for="description">Description: </label><input type="text" id="description" name="description" tabindex="2" /></p><p><label for="price">Price: </label><input type="text" id="price" name="price" tabindex="3" /></p><p id="buttons"><input id="reset" type="reset" tabindex="4" /><input id="submit" type="submit" tabindex="5" value="Add Product" /></p></fieldset></form></div>
</body>
</html>

ProductDetails.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Save Product</title><link rel="stylesheet" type="text/scc" href="css/main.css" />
</head>
<body><div id="global"><h4>The product has been saved.</h4><p><h5>Details</h5>Product Name: ${product.name } <br />Description: ${product.description } <br />Price: $${product.price }</p></div>
</body>
</html>

测试结果

转载于:https://www.cnblogs.com/0820LL/p/9949873.html

MVC 模式和模型 2相关推荐

  1. mvc框架java包怎么划分_java – 在MVC模式中将模型和动作划分为类...

    原则上,例如domain model,模型层,例如"模型",应分为以下几个部分: > Entities,例如域对象(如您的员工)和value objects.每个实体不仅包含 ...

  2. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  3. MVC模式计算一元二次方程的根及梯形面积

    文章目录 一.实验目的 二.实验内容 实验6-1: 实验6-2: 三.参考代码 实验6-1: 实验6-2: 四.实验结果 实验6-1: 实验6-2: 五.讨论 一.实验目的 本实验的目的是掌握在MVC ...

  4. MVC模式 与 Model2模型 介绍

    Model1回顾 MVC模式:MVC(Model.View.Controller)是软件开发过程中比较流行的设计思想.旨在分离模型.控制.师徒.是一种分层思想的体现. Model2简介 Java We ...

  5. Standup Timer的MVC模式及项目结构分析

    前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的 ...

  6. 理解MVC—从实例出发:基于MVC模式的简易算术计算器

    MVC模式:MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...

  7. (iOS-框架封装)iOS设计模式——MVC模式

    MVC模式是iOS编程中提到的最多次的设计模式,也是使用最频繁的设计模式之一.网络上有很多的MVC模式的分析文章,但都是从原理上来解释,很少能找到配套的案例来说明到底在实际的项目中要如何的使用这种模式 ...

  8. MVC模式与三层架构的区别

    MVC模式与三层架构的区别 原文地址:http://www.cnblogs.com/yourshj/p/5197310.html 之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MV ...

  9. Jsp+Servlet+JavaBean经典MVC模式理解

    MVC模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能.M, Model(模型)实现系统的业务逻辑 1.通 ...

最新文章

  1. python链接安卓 跳一跳
  2. “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”
  3. Hibernate从入门到精通(十)多对多单向关联映射
  4. 怎样判断ios app 第一次启动
  5. android listview asynctask,Android精通之AsyncTask与ListView讲解
  6. 如何选择物联网通讯技术?
  7. Delphi XE2 - 点点滴滴设置
  8. 04SpringMvc_映射器_BeanNameUrlHanderMapping
  9. 左右侧边栏固定宽,中间宽度自适应
  10. 正则表达式删除字符串中 html 标签
  11. 手把手教做无人驾驶算法(二十六)--基于终端约束的MPC 控制
  12. MPLAB X IDE 用Pickit3烧录 提示“找不到目标器件。你必须连接一个目标器件来使用PICkit 3”,解决办法!
  13. win10显示隐藏文件_u盘内隐藏文件怎么显示 u盘内隐藏文件显示方法【详细步骤】...
  14. matlab 电力电子仿真电路,基于Matlab_Simulink的电力电子电路仿真.pdf
  15. 无线承载根据承载的内容不同分为SRB和DRB EPS承载根据用户业务需求和Qos的不同可以分为GBR/ Non-GBR 承载...
  16. kafka如何创建topic
  17. 大数据分析R语言RStudio使用教程
  18. Kali Linux查看信息
  19. 搜索框的代码css,css搜索框_精美css搜索框代码
  20. jmeter基础(二)-JMeter证书

热门文章

  1. c语言画爱心附带解释,用C语言画一个“爱心”
  2. python 贪吃蛇大作战_python实现简单贪吃蛇游戏
  3. java php js_【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景...
  4. oracle用户密码复杂度查询,11gR2 Database用户密码复杂度验证
  5. 2021泗阳致远中学高考成绩查询,2021高考成绩什么时候发布?可通过哪些途径查询?...
  6. HTML+CSS+JS实现 ❤️卡通湖面上日出动画特效❤️
  7. 基于javaweb(springboot+mybatis)宠物医院预约管理系统设计和实现
  8. c语言抓取抖音视频,【FiddlerScript】利用Fiddler中的FiddlerScript自动抓取抖音无水印视频并且自动保存...
  9. linux redis 5.6扩展,Windows下为PHP5.6安装Redis扩展和memcached扩展
  10. java class private_Java class 中public、protected 、friendly、private的区别