MVC

一、 MVC 模式

MVC 代表 Model-View-Controller (模型-视图-控制器) 模式。

  • Model:模型代表 DAO (Data Access Object 数据访问对象) 或 POJO(Plain Ordinary Java Object 普通 JavaBeans)。是应用程序中用于处理应用程序数据逻辑的部分。
  • View:视图将数据可视化。
  • Controller:应用程序中处理用户交互的部分。控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。控制器分离了视图与模型。

二、 Model 2

Java Web 应用开发中有两种设计模型,Model 1 和 Model 2。

Model 1 的中心是 JSP 页面,由 JSP 调用业务逻辑,显示页面,适合于小应用开发。
由 JSP 充当 视图和控制器,JavaBeans 充当模型。

Model 2 基于 MVC 模式,几乎所有现代 Web 框架都是 Model 2 的实现。
由 JSP 充当视图,Servlet 或 Filter 充当控制器,JavaBeans 充当模型。

每个HTTP 请求都发送给控制器,请求中的 URI 标识出对应的 action。action 代表了应用可以执行的一个操作。 
控制器会解析 URI 并调用相应的 action,然后将模型对象放到视图可以访问的区域。
最后,控制器利用 RequestDispatcher 或者 HttpServletResponse.sendRedirect 方法跳转到视图。在 JSP 页面中,用表达式语言以及定制标签显示数据。

三、 Servlet 控制器

@WebServlet(name="ControllerServlet", urlPatterns={"/input-product", "/save-product"})
public class Controllerservlet extends HttpServlet{ private static final long serialVersionUID=1579L; @Override
public void doGet(HttpServletRequest request, HttpServletResponse response throws IOException, ServletException {
  process(request, response);
} @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  process(request, response);
} // 通过 process 方法处理所有输入请求
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
  // 获取 action
  String uri = request.getRequestURI(); // uri = /contextName/resourceName 或 /resourceName
  int lastIndex = uri.lastIndexOf("/");
  String action = uri.substring(lastIndex +1);   // 转发 url
  String dispatchUrl = null;   // 处理 action
  if("input-product".equals(action)){
    dispatchUrl = "/jsp/ProductForm.jsp";
  } else if("save-product".equals(action)){
  // 创建模型
    product = new Product();
    product.setName(request.getParameter("name"));
    product.setDescription(request.getParameter("description"));
    product.setPrice(Integer.parseInt(request.getParameter("price")));
    // 业务逻辑 保存模型等
    SaveProductAction saveProductAction = new SaveProductAction();
    saveProductAction.save(product);
    // 将模型添加到 request 属性中 以便视图访问
    request.setAttribute("product", product);     dispatchUrl = "/jsp/ProductDetails.jsp";
  }
  // 转发
  if(dispatchUrl != null){
    RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl);
    rd.forward(request, response);
  }
  }
}
<%--ProductForm.jsp--%>
<form method="post" action="save-product">
<h1>Add Product</h1>
<label>
  <span>Product Name:</span>
  <input id="name" type="text" name="name">
</1abel>
<label>
  <span>Description:</span>
  <input id="description" type="text" name="description">
</label>
<label>
  <span>Price:</label>
  <input id="price" name="price" type="number" step="any">
</label>
<label>
  <span>&nbsp:</span>
  <input type="submit">
</label>
</form>

三、 Filter 分发器

@WebFilter(filterName="DispatcherFilter", urlPatterns={"/*"})
public class DispatcherFilter implements Filter{
  @Override
  public void init(Filterconfig filterconfig) throws ServletException { }
  @Override
  public void destroy() { }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    String uri = req.getRequestURI();
    // ... 与 Servlet Controller 一致
    if (dispatchUrl! = null){
      RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl);
      rd.forward(request, response);
    } else {
      // 过滤器过滤包括静态目标在内的所有网址 如果没有 action 则继续传递下去
      filterChain.doFilter(request, response);
    }
  }
}

Java Web 学习(3) —— MVC的更多相关文章

  1. [Java Web学习]Spring MVC使用普通类对象,声明的对象为null

    由于对Spring还不熟悉,目前还处于学习阶段,因此经常会遇到一些小白问题,这个问题需要在Spring文件中将普通对象注入bean,然后在MVC中添加set方法,填充普通对象.

  2. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  3. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  5. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  7. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  8. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. java web 学习笔记 编码问题总结

       java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...

随机推荐

  1. 剑指offer笔记面试题4----二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含 ...

  2. Nexus-在项目中使用Maven私服,Deploy到私服、上传第三方jar包、在项目中使用私服jar包

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  3. Python如何运行程序

    人生苦短,我用Python. 作为一个开发人员,如何写代码是必须要知道的,代码如何运行也是有必要了解的.通过了解代码如何运行,可指导我们写出效率更高的代码.下午看了<Python学习手册> ...

  4. 47-准备 Overlay 网络实验环境

    为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...

  5. RabbitMQ基础理解

    RabbitMQ基本理解 MQ是消息中间件,常见的有RabbitMQ,Kafka,RocketMQ,activeMQ 等,用于分布式系统中.作用有三点 解耦 异步 削峰 RabbitMQ 整体上是一个 ...

  6. [洛谷P1122][题解]最大子树和

    这是一道还算简单的树型dp. 转移方程:f[i]=max(f[j],0) 其中i为任意非叶节点,j为i的一棵子树,而每棵子树都有选或不选两种选择 具体看代码: #include<bits/std ...

  7. dp习题

    仅收录有意思的题目 数的划分 导弹拦截 : LIS的两种优化 教主的花园:将不同的情况分类,最后取max 午餐 & 挂饰: 需要排序 挂饰:0-1背包处理负数体积 投资的最大效益 : 完全背包 ...

  8. 07. Go 语言接口

    Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...

  9. 【使用篇二】配置文件application.properties参数详解(21)

    springboot提供了许多启动器starter,大部分的启动器都有配置属性,这些配置属性一般可以在这里找到: xxxxxxxx-autoconfigure-xxxxx.jar/META-INF/s ...

  10. CF1062F Upgrading Cities

    题意 由于这是个\(DAG\),我们考虑拓朴排序,求某个点能到的和能到它的点,这是两个问题,我们可以正反两边拓朴排序,这样就只用考虑它能到的点了 设\(f[x]\)表示\(x\)能到的点数\(+\)能 ...