简单MVC理解与实现

MVC基本概念

MVC大家不陌生,包含模型(Model)、视图(View)、控制器(Controller),其中模型用于基本业务逻辑的实现,视图用于响应结果的表示,控制器用于模型控制和请求分派。先放上一张介绍MVC组件和功能的图,可以了解三个组件的关系与职能:

简单MVC实现

Servlet运行在容器(Tomcat)中,容器允许一个组件调用另一个组件。下图是《Head First Servlet&JSP》中推荐啤酒的例子,实现MVC的基本思想,其中Servlet为控制器,调用模型并得到结果信息,保存到请求对象中,然后将请求分派给JSP。

MVC调用过程:

  • 客户端体请求;
  • 容器接收请求,并根据请求URL和web.xml映射到对应的Servlet;
  • Servlet调用对应的模型,处理实际业务逻辑;
  • 模型处理完后,返回结果信息;
  • Servlet将模型返回的结果作为属性值封装到请求对象中;
  • 通过“请求分配”的功能,调用指定的视图(JSP等);
  • 视图调用请求对象中模型返回的结果,生成页面返回给容器;
  • 容器将结果反馈给客户端。

前端提交请求页面

客户端可以选择啤酒特征中的颜色作为条件进行查询,如下图:

代码实现如下,通过表单form声明以POST方式提交请求数据,并由SelectBeer.do处理:

 1 <html>
 2     <body>
 3         <h1 align = "center">Beer Selection Page</h1>
 4             <form method = "POST"
 5                 action = "SelectBeer.do">
 6                 Select beer characteristics<p>
 7                 Color:
 8                 <select name = "color" size = "1">
 9                     <option value = "light">light</option>
10                     <option value = "amber">amber</option>
11                     <option value = "brown">brown</option>
12                     <option value = "dark">dark</option>
13                 </select>
14                 <br><br>
15                 <center>
16                     <input type = "SUBMIT">
17                 </center>
18             </form>
19     </body>
20 </html>

根据web.xml实现映射Servlet

 1 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
 4                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5   version="3.1"
 6   metadata-complete="true">
 7
 8     <servlet>
 9         <servlet-name>Ch3 Beer</servlet-name>
10         <servlet-class>com.example.web.BeerSelect</servlet-class>
11     </servlet>
12     <servlet-mapping>
13         <servlet-name>Ch3 Beer</servlet-name>
14         <url-pattern>/SelectBeer.do</url-pattern>
15     </servlet-mapping>
16  </web-app>

一个Servlet对应三个名字:URL名、部署名和完全限定名。其中URL名是面向客户端的,由客户端进行调用;布署名是部署服务时秘密的内部名,可随意定义;完全限定名是对应真实Servlet。他们通过<servlet>和<servlet-mapping>进行映射和声明。上边URL为“/SelectBeer.do”,部署名为Ch3 Beer,安全限定名为com.example.web.BeerSelect。

接收请求的Servlet控制器

 1 package com.example.web;
 2
 3 import javax.servlet.*;
 4 import javax.servlet.http.*;
 5 import java.io.*;
 6 import java.util.*;
 7 import com.example.model.*;
 8
 9 public class BeerSelect extends HttpServlet{
10
11     public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
12
13         String c = request.getParameter("color");
14         BeerExport beerExport = new BeerExport();
15         List<String> result = beerExport.getBrands(c);
16
17         request.setAttribute("styles",result);
18
19         RequestDispatcher view = request.getRequestDispatcher("result.jsp");
20         view.forward(request,response);
21     }
22 }

BeerServlet继承自HttpServlet,可以接收HTTP请求。重写doPost方法接收表单数据、调用模型获取结果、将结果封装到请求对象中,并通过“请求分派”调用result.jsp,生成页面返回。

模型

 1 package com.example.model;
 2
 3 import java.util.*;
 4
 5 public class BeerExport{
 6
 7     public List<String> getBrands(String color){
 8         List<String> brands = new ArrayList<>();
 9         switch (color){
10             case "amber":
11                 brands.add("Jack Amber");
12                 brands.add("Red Moose");
13                 break;
14             default:
15                 brands.add("Jail Pale Ale");
16                 brands.add("Gout Stout");
17                 break;
18         }
19         return brands;
20     }
21 }

模型就是普通类,实现具体业务逻辑。

视图

 1 <%@ page import = "java.util.*" %>
 2 <html>
 3     </body>
 4         <h1 align="center"> Beer Recommendations JSP</h1>
 5         <p>
 6         <%
 7             List<String> brands = (List)request.getAttribute("styles");
 8             Iterator it = brands.iterator();
 9             while(it.hasNext()){
10                 out.print("<br>try: "+it.next());
11             }
12         %>
13     </body>
14 </html>

JSP是另一种Servlet,只是将原来写在Servlet中的HTML抽离出来,在第一次请求到来时转换为Servlet进行实例化。其将调用请求对象中的模型返回结果,生成页面。

返回给客户端的页面

其中,http://localhost:8080/Beer-v1/SelectBeer.do中,Beer-v1是Web应用上下文的根。

总结

  • MVC基本思想和调用过程
  • 简单MVC实现
  • 学习servlet相关概念:url映射、servlet实例实现等。
时间: 2024-08-14 01:52:47

简单MVC理解与实现的相关文章

[转]JAVA三大框架SSH和MVC理解

Java—SSH(MVC) JAVA三大框架的各自作用 hibernate是底层基于jdbc的orm(对象关系映射)持久化框架,即:表与类的映射,字段与属性的映射,记录与对象的映射 数据库模型 也就是Model; struts提供的丰富标签是用于显示层View;同时struts也充当了实现Control的功能(不管是Struts1,还是Struts2),接收参数,视图分发. Spring是用于降低层与层间耦合度的,就是所有的类都可以由spring统一创建,用时只需注入即可(IOC) 从功能上来说

【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) 上篇[SSH进阶之路]Struts基本原理 + 实现简单登录(二),我们介绍MVC和

javaEE MVC理解

MVC包括三个部分 : ①View:负责与用户交互,即在界面上展示数据对象给用户(html,jsp) ②Controller:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解 释用户的输入并将它们映射为模型层可执行的操作(Servlet) ③Model:实现系统的业务逻辑(javaBean) DAO:用于连接数据库,将resultset结果封装到DTO并返回 DTO:用于封装数据,包含一些列的get/set方法 VO(View Object) 视

Java框架-Spring MVC理解001

Spring MVC理解 最近在读一本<看透springMVC>的书,从了解到了一些更加精细系统的知识,边读变分享吧. 1.servlet--Spring MVC的本质 2.Spring MVC其实是一个工具,具体的理解可以分为两步:第一步,了解这个工具是怎么创建出来的:第二步,了解这个工具是怎么用的. 3.前期使用准备:环境的搭建 ①创建WEB项目,导入jar包,Maven项目简单的加入springMVC和servlet的依赖就可以了. //Maven项目加入依赖 <dependenc

特殊权限简介(简单的理解)

特殊权限: suid:运行程序时,相应的进程的属主是程序文件自身的属主,而不是启动者. chmod u+s(u-s) file sgid:运行某个程序时,对应进程的属组是程序文件自身的属组,而不是启动者的所属的基本组.(常常与sticky一起使用,控制公共文件,组人能修改所有文件不能删除别人文件) chmod g+s(g-s) file sticky:在一个公共的目录中,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t filedir 特殊权限简介(简单的理解),布

超简单MVC应用程序播放WMV视频

本篇博文,介绍给大家的是,在MVC应用程序中,播放Windows media video(.wmv) 视频文件. Insus.NET的实现方法,把media player组件,嵌入MVC的控制器的ContentResult的Action中即可.在本次的演示中,Insus.NET只是传入三个参数,视频的长与宽以及视频文件路径. 如果还想设置参其它参数,可以照此雷同即可. 参数可以直接在Action中设置,也可以是获取来自数据库,前提是你参数设置的程序,存储于数据库中. 第一步,建立控制器: 第二步

一个小例子对多态简单的理解

class Parent{ int age; String name; public Parent(String name, int age){ this.name = name; this.age = age; } public void writeWay(){ System.out.println("毛笔!"); } } class Child extends Parent{ int age; String name;//这里只说为了说明一个问题,其实完全可以有父类继承而来. pu

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有点拗口,实际上要想让一个迭代器工作,至少要实现__iter__方法和next方法.很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用.优雅.pythonic.下边是一个例子,从里边你会感受到不用列表而用迭代器的原因. #!/usr/bin/env python #c

python3----如何简单地理解Python中的if __name__ == &#39;__main__&#39;

1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '__main__'). if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行:当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行. 2. 程序入口