经典的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. MongoDB简述

    简介 MongoDB is an open-source document database that provides high performance, high availability, an ...

  2. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  3. Json 调用 天气API 实例

    百度了一下,找了点别人的方法改进了一下. 获取天气网址:http://www.weather.com.cn/html/weather/101210701.shtml这里是温州的,当然其他城市自己搜索一 ...

  4. WIN10系统 Solidworks 2015 Toolbox插件提示 failed to create toolboxl ibrary object 解决方法

    网上大部分都是说卸载一个更新程序,但是在WIN10中根本没有. 但是也可通过以下方法解决: 1.关闭SW程序及进程,用管理员命令打开CMD 2.打开并复制SW目录,默认为 C:\Program Fil ...

  5. [读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例

    这是我的文章备份,原始出处:[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例 http://www.dotblogs.com.tw/mis2000lab/archive/ ...

  6. pandas聚合和分组运算——GroupBy技术(1)

    数据聚合与分组运算——GroupBy技术(1),有需要的朋友可以参考下. pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个 ...

  7. Oracle表变化趋势追踪记录

    #DBA_HIST_SEG_STAT可以看出对象的使用趋势,构造如下SQL查询出每个时间段内数据库对象的增长量,其中DB_BLOCK_CHANGES_DELTA为块个数 select c.SNAP_I ...

  8. Python核心编程--学习笔记--2--Python起步(下)

    16 文件和内建函数open(),file() 打开文件: fobj = open(filename, 'r') for eachLine in fobj: print eachLine, #由于每行 ...

  9. wpf 动画 2个窗体切换

    <Window x:Class="翻转.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xam ...

  10. SQL基础篇----select语句与排序问题

    一.检索--输出所有的列 SELECT * FROM my_friends WHEREfirst_name = 'cake'; 知识点1 * 代表选择出所有的行-----(什么行呢?)就是first_ ...