Model-View-Controller - 杂谈
经典的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);
==============MVC模式小结==============
对于任何Java Web应用,在完全确定需求之后,就需要考虑应用的整体架构。MVC模式提供了设计架构的良性思维方式,也符合项目通常的开发规则。
对于任何一个功能/应用,首先考虑用户怎么用?既然是Java Web应用,必然涉及浏览器,也就需要大量的页面支持,这也就构成了View部分。
那么大量页面之间如何发生关系,如何跳转,也就需要控制器(通常是Servlet),这也构成Controller部分。
页面有了,如何跳转也有了,但是页面里的数据呢?这个就涉及Model部分了,同数据库或者其他数据源交互。
View部分:
- 用户发送请求方式:超链接href;浏览器地址栏(get);表单提交(post);Ajax请求
- 页面展示:采用EL表达式+Jstl,比如输出提示信息${info};输出对象信息${book.bookid}。当前流行的方式还是采用javascript
Model部分:
- JavaBean层:包括entity和dto(可能也叫domain, model等),对应于数据库表实体和前端信息实体
- Service层:供Controller层调用的业务逻辑
- DAO层:数据库CRUD的封装
Controller部分:
通常采用Servlet实现,extends HttpServelt。按以下步骤实现一个控制器:
- 获取前端请求信息
- 调用Service,并与后台交互
- 保存服务器返回数据
- 转到响应界面
获取信息:
获取请求信息:
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 - 杂谈的更多相关文章
- MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作
MVC模式(Model View Controller): Model:DAO模型 View:JSP 在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...
- MVC(Model View Controller)框架
MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...
- 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 ...
- Model View Controller(MVC) in PHP
The model view controller pattern is the most used pattern for today’s world web applications. It ha ...
- 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 ...
- Model View Controller
On the iPhone or iPod touch, a modal view controller takes over the entire screen. This is the defau ...
- 设计模式 --- 模型-视图-控制器(Model View Controller)
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...
- MVC4 Model View Controller分离成独立项目
适合人群:了解MVC项目的程序员 开发工具:vs2012 开发语言:C# 小项目或功能比较单一的项目可以直接新建一个MVC基本项目类型即可,但随着需求不断迭代,项目的功能模块越来越多,甚至有些模块可以 ...
- Qt Model/View(官方翻译,图文并茂)
http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...
随机推荐
- 安装pdo.so和pdo_mysql.so还有pcntl.so扩展到php中
1.下载源码,解压tar -xzvf php-5.4.20.tar.gz cd /usr/local/src/php-5.4.20/ext/pdo /usr/local/php/bin/phpize ...
- 区间 (vijos 1439) 题解
[问题描述] 现给定n个闭区间[ai,bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排 ...
- 【原创】小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载五(给按钮加图标)
在范例5-4所使用的导航栏中,已经为按钮加入了图标的样式,但是当时并没有介绍按钮的图标究竟是怎么一回事.下面截取范例5-4中导航栏部分的代码: <divdata-role="foote ...
- opensuse 安装 Anaconda3 之后出现Could not start d-bus. Can you call qdbus?
最近在安装了opensue Leap42.1之后,想要学习一下python,就安装了Anaconda3,并且将Anaconda3的安装路径添加到了PATH里,但是在重新启动系统后,出现了"C ...
- ios开发笔记
@IBDesignable 可在第二视图中实时预览 @IBInspectable 可编辑属性
- Redo日志
undo日志有一个潜在的问题,即我们在将书屋改变的所有数据写到磁盘前不能提交该事务.有时,如果让数据库修改暂时只存在于主存中,我们可以节省磁盘IO;只要在崩溃发生时有日志可以恢复,这样做就是安全的. ...
- 【Javascript】: for循环中定义的变量在for循环体外也有效
for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ...
- WIndows7 多版本
Windows7 安装U盘 删除source\ei.cfg 以后开机安装会提示安装的版本
- mac中添加环境变量
sudo vi /etc/paths 来编辑 paths,将环境变量添加到 paths 中. vim 是一个编辑器,另外还有几个,如:Pico,Emacs.
- 微软职位内部推荐-Senior Software Development Engineer H/F
微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...