经典的B/S结构+MVC模式: 

注意:MVC层次均位于server中。

下面通过一个简单并且具体的例子来体会下这种MVC模式:

--- 功能:查询所有图书;涉及到数据库,JSP,Servlet等

Step 1: 创建数据库表用于存储book信息,插入测试数据(其实该步骤已经规划出javaBean里的各个属性了)

CREATE TABLE books (
bookid VARCHAR (10) NOT NULL,
bookname VARCHAR (30),
author VARCHAR (20),
price FLOAT,
publisher VARCHAR (20),
PRIMARY KEY (bookid)
); INSERT INTO books VALUES('','Java','zhangsan',20,'电子工业');
INSERT INTO books VALUES('','JSP','lisi',22,'人民邮电');
INSERT INTO books VALUES('','Java EE','wang',30,'人民邮电');

Step 2:

整个查询过程可以规划为

浏览器借助jsp页面(View)发出请求-->Servlet拦截请求(Controller)-->调用业务逻辑方法(Controller)-->通过JDBC与数据库交互(Model)-->回到Servlet并设置jsp属性(View)-->查询结果展示(View)

下面一个个来说:

1) 浏览器借助jsp页面(View)发出请求

Navigator.jsp

<a href="${pageContext.request.contextPath}/findAllBooks">查看所有图书</a>

2) Servlet拦截请求(Controller)

web.xml

    <servlet>
<servlet-name>BookList</servlet-name>
<servlet-class>com.chris.web.servlet.BookListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BookList</servlet-name>
<url-pattern>/findAllBooks</url-pattern>
</servlet-mapping>

3) 调用业务逻辑方法(Controller)

BookListServlet.java

public class BookListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BookQueryService bqs = new BookQueryService();
Set<Book> bookSet = bqs.findAllBooks();
req.setAttribute("allBooks",bookSet);
RequestDispatcher rd = req.getRequestDispatcher("/jsp/books.jsp");
rd.forward(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}

4) 通过JDBC与数据库交互(Model)

BookQueryService.java

public class BookQueryService {

    public Set<Book> findAllBooks() {
Connection con = BasicJdbcOperation.getConnection();
String sql = "select * from books";
Set<Book> bookSet = new HashSet<Book>();
try {
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()){
Book book = new Book();
book.setBookId(rs.getString(1));
book.setBookName(rs.getString(2));
book.setAuthor(rs.getString(3));
book.setPrice(rs.getFloat(4));
book.setPublisher(rs.getString(5));
bookSet.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
BasicJbdcOperation.close();
}
return bookSet;
}
}

Book.java (JavaBean)

public class Book {
private String bookId;
private String bookName;
private String author;
private float price;
private String publisher; public String getBookId() {
return bookId;
} public void setBookId(String bookId) {
this.bookId = bookId;
} public String getBookName() {
return bookName;
} public void setBookName(String bookName) {
this.bookName = bookName;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public float getPrice() {
return price;
} public void setPrice(float price) {
this.price = price;
} public String getPublisher() {
return publisher;
} public void setPublisher(String publisher) {
this.publisher = publisher;
}
}

BasicJdbcOperation.java

public class BasicJdbcOperation {

    private static Connection con;

    public static Connection getConnection(){
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crud","root", "");
con = connection;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
} public static void close() {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//建立数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/shiro","root", "");
//创建SQL语句
String sql = "select * from users where username=? and password=?";
//创建语句对象
PreparedStatement ps = connection.prepareStatement(sql);
//变量赋值,替换?
ps.setString(1, "Chris");
ps.setString(2, "123");
//执行SQL语句
ResultSet resultSet = ps.executeQuery();
//处理ResultSet
while (resultSet.next()){
System.out.println(resultSet.getString(2));
}
//关闭相关对象
resultSet.close();
ps.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
} }

5) 回到Servlet并设置jsp属性(View)

回到3) 调用业务逻辑方法(Controller),

        RequestDispatcher rd = req.getRequestDispatcher("/jsp/books.jsp");
rd.forward(req,resp);

Demo下载

==============MVC模式小结==============

对于任何Java Web应用,在完全确定需求之后,就需要考虑应用的整体架构。MVC模式提供了设计架构的良性思维方式,也符合项目通常的开发规则。

对于任何一个功能/应用,首先考虑用户怎么用?既然是Java Web应用,必然涉及浏览器,也就需要大量的页面支持,这也就构成了View部分。

那么大量页面之间如何发生关系,如何跳转,也就需要控制器(通常是Servlet),这也构成Controller部分。

页面有了,如何跳转也有了,但是页面里的数据呢?这个就涉及Model部分了,同数据库或者其他数据源交互。

View部分:

  1. 用户发送请求方式:超链接href;浏览器地址栏(get);表单提交(post);Ajax请求
  2. 页面展示:采用EL表达式+Jstl,比如输出提示信息${info};输出对象信息${book.bookid}。当前流行的方式还是采用javascript

Model部分:

  1. JavaBean层:包括entity和dto(可能也叫domain, model等),对应于数据库表实体和前端信息实体
  2. Service层:供Controller层调用的业务逻辑
  3. DAO层:数据库CRUD的封装

Controller部分:

通常采用Servlet实现,extends HttpServelt。按以下步骤实现一个控制器:

  1. 获取前端请求信息
  2. 调用Service,并与后台交互
  3. 保存服务器返回数据
  4. 转到响应界面

获取信息
获取请求信息:

request.getParameter(paraname), request.getParameterValues(paraname)
获取session中信息:

session.getAttribute(属性名)
获取Cookie中信息:

request.getCookies()

获取请求头信息

获取Servlet的配置信息

保存信息:
保存到session中:

session.setAttribute(属性名,要保存的对象),供用户后续的所有访问过程使用。

保存到request中:

request.setAttribute(属性名,要保存的对象),供后续页面使用(页面与当前的Servlet属于同一次请求)

保存到cookie,Cookie cookie =
new Cookie("name","value");
response.addCookie(cookie); 供客户端在以后的时间访问。

响应:

使用专门的文件进行响应:

方式一:
RequestDispatcher rd = request.getRequestDispatcher(目标文件); 
rd.forward(request,response); // 完成跳转

方式二:
response.sendRedirect(目标文件);

注意:如果当前功能完成的是对数据库的插入操作,如果用户刷新就会产生错误。要避免错误,不能使用RequestDispatcher,可以使用方式二。如果使用方式二,就不能在当前文件和目标文件之间通过request共享信息了。如果要共享可以用session。使用session的时候,用完一定要删除这个对象session.removeAttribute(属性名)。

Model-View-Controller - 杂谈的更多相关文章

  1. MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作

    MVC模式(Model View Controller): Model:DAO模型 View:JSP  在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...

  2. MVC(Model View Controller)框架

    MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...

  3. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  4. Model View Controller (MVC) Overview

    By Rakesh Chavda on Jul 01, 2015 What is MVC?Model View Controller is a type of user interface archi ...

  5. Model View Controller(MVC) in PHP

    The model view controller pattern is the most used pattern for today’s world web applications. It ha ...

  6. What is the difference between Reactjs and Rxjs?--React is the V (View) in MVC (Model/View/Controller).

    This is really different, React is view library; and Rxjs is reactive programming library for javasc ...

  7. Model View Controller

    On the iPhone or iPod touch, a modal view controller takes over the entire screen. This is the defau ...

  8. 设计模式 --- 模型-视图-控制器(Model View Controller)

    模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...

  9. MVC4 Model View Controller分离成独立项目

    适合人群:了解MVC项目的程序员 开发工具:vs2012 开发语言:C# 小项目或功能比较单一的项目可以直接新建一个MVC基本项目类型即可,但随着需求不断迭代,项目的功能模块越来越多,甚至有些模块可以 ...

  10. Qt Model/View(官方翻译,图文并茂)

    http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...

随机推荐

  1. luigi学习5-task详解

    task是代码执行的地方.task通过target互相依赖. 下面是一个典型的task的大纲视图. 一.Task.requires requires方法用来指定本task的依赖的其他task对象,依赖 ...

  2. 一款jQuery实现重力弹动模拟效果特效,弹弹弹,弹走IE6

    一款jQuery实现重力弹动模拟效果特效 鼠标经过两块黑色div中间的红色线时,下方的黑快会突然掉落, 并在掉落地上那一刻出现了弹跳的jquery特效效果,非常不错,还兼容所有的浏览器, 适用浏览器: ...

  3. spark概论

    一.概述 1.轻:(1)采用语言简洁的scala编写:(2)利用了hadoop和mesos的基础设施   2.快:spark的内存计算.数据本地性和传输优化.调度优化,使其在迭代机器学习,ad-hoc ...

  4. delphi TFileStream.create

    Value  Meaning  fmCreate Create a file with the given name. If a file with the given name exists, op ...

  5. 银河英雄传说 (codevs 1540) 题解

    [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰 ...

  6. Python脚本控制的WebDriver 常用操作 <十> 层级定位

    下面将使用WebDriver来模拟操作一个层级定位元素的操作 测试用例场景 在实际的项目测试中,经常会有这样的需求:页面上有很多个属性基本相同的元素,现在需要具体定位到其中的一个.由于属性基本相当,所 ...

  7. java软件包的访问权限和继承

    public:公共权限,可以修饰类.成员变量和成员函数,不论是否在同一个包中均可自由访问 package wang; //当一个类的权限为public时,类名必须和文件名相同 public class ...

  8. 菜鸟学习Struts——国际化

    一.概念 国际化:界面上的语言可以根据用户所在的地区改变显示语言. 如图: 二.实例 下面就一步一步的教大家利用Struts实现国际化. 1.编写资源文件 这个资源文件就是界面上显示的字符,资源文件里 ...

  9. poj 1679 The Unique MST

    题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...

  10. iOS-打包成ipa

    第一步:模拟器选择栏,选择"Generic iOS Device ".早期版本需要断开手机连接,才可以找到. 第二步:选择"Product"菜单下的" ...