不懂MVC设计模式,就永远编写不了好的JavaWeb项目
什么是MVC设计模式
MVC全称: Model、View、Controller。分别表示模型、视图、控制器。
M:模型:应用程序的核心功能,专门用来管理数据和值的。通常是Bean、DAO层模块
V:视图:用来展示模式所处理的数据,拥有很好的显示效果。通常是Web下的HTML/JSP模块
C:控制器:从页面接收用户请求,并委托模型进行相应的处理,最后根据处理响应给页面。可以说控制器是视图与模型之间交互的桥梁。通常是serive/servlet等模块
大致流程如下:
1.用户先发送请求
2.控制器(接收请求,委托模型层处理)
3.模型(增删改查数据)
4.控制器(选择视图,并把模型的处理结果返回给视图)
5.视图(展示模型数据,提供相应的用户操作与用户进行交互)
为什么用MVC设计模式
为的是便于团队分工,也为了便于解耦合和可复用。JavaWeb
除非你只是一个人编写,并且编写的是小型且简单的JavaWeb项目,当然这只是我们初学时才会这样,随着我们编写的程序越来越多,我们不可能永远停留在这个阶段,我们总要挑战自己,去做大型项目,融入优秀的团队,一起合作做更大更棒的项目。那么这个时候为了能够合作,就必然要有一些规范,那么设计模式一定需要理解。
比如我们创建JavaWeb项目时,此时项目下代码不仅可以放在src目录下,也可以放在WebContent目录下。src可以建很多包,WebContent可以创建很多文件,那么问题来了,当我们创建出一个类,到底放在哪个目录哪个包里呢?解决办法就是要了解设计模式,根据设计模式去规范。
怎么用MVC设计模式
第一步:
先建立目录文件夹或包
M:模型:建立bean包、DAO包
C:控制器:建立service包、servlet包
V:视图:不用建立包,它的目录就是WebContent。
第二步:
引入Jar包,添加关于数据库的配置文件,建立util包,创建工具类。这一步主要是弄数据库连接池。
第三步:
写模型的代码
第四步:
写视图的代码
第五步:
写控制器的代码
第三、四、五步是可以分工的。
甚至每一步都是可以用到框架的。
实战阶段
第一步、第二步省略
第三步根据数据库的表字段进行创建实体类
package bean;
public class Book {
private String bid;
private String bname;
private double bprice;
private String bauthor;
private int bcount;
public Book() {
super();
}
public Book(String bid, String bname, double bprice, String bauthor, int bcount) {
super();
this.bid = bid;
this.bname = bname;
this.bprice = bprice;
this.bauthor = bauthor;
this.bcount = bcount;
}
public String getBid() {
return this.bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getBname() {
return this.bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public double getBprice() {
return this.bprice;
}
public void setBprice(double bprice) {
this.bprice = bprice;
}
public String getBauthor() {
return this.bauthor;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
public int getBcount() {
return this.bcount;
}
public void setBcount(int bcount) {
this.bcount = bcount;
}
}
继续创建Dao层接口及实现类
package dao;
import java.util.List;
import bean.Book;
public interface BookDaoInter {
//1.添加数据
public int insertBook(String id, String name, String author, double price, int count);
//2.删除数据
public int deleteBook(String id);
//3.修改数据
public int updateBook(double price, String name);
//4.查询数据
public List<Book> findByBook();
}
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import bean.Book;
import util.DruidUtil;
public class BookDao extends DruidUtil implements BookDaoInter{
private Connection conn =getConnection();
private PreparedStatement pre=null;
private ResultSet rs =null;
//添加数据(给每个字段都添加一次数据)
@Override
public int insertBook(String id,String name,String author,double price,int count) {
int i = 0;
String sql = "insert into Book values(?,?,?,?,?)";
try {
pre = conn.prepareStatement(sql);
pre.setString(1, id);
pre.setString(2, name);
pre.setDouble(3, price);
pre.setString(4, author);
pre.setInt(5, count);
i = pre.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
closs(conn,pre);
}
return i;
}
//删除数据(根据编号进行删除)
@Override
public int deleteBook(String id) {
int i = 0;
String sql = "delete from Book where bid = ?";
try{
pre = conn.prepareStatement(sql);
pre.setString(1, id);
i = pre.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
closs(conn,pre);
}
return i;
}
//修改数据(根据图书名称修改图书价格)
@Override
public int updateBook(double price, String name) {
int i = 0;
String sql = "update Book set bprice =? where bname =?";
try {
pre = conn.prepareStatement(sql);
pre.setDouble(1, price);
pre.setString(2, name);
i = pre.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
closs(conn,pre);
}
return i;
}
//读取数据(读取所有数据)
@Override
public List<Book> findByBook() {
String name;
String author;
List<Book> list=new ArrayList<>();
try {
conn = DruidUtil.getConnection();
String sql="select * from book";
pre = conn.prepareStatement(sql);
rs = pre.executeQuery();
while(rs.next()){
Book bk=new Book();
bk.setBid(rs.getString(1));
//name = new String(rs.getString(2).getBytes("ISO-8859-1"),"UTF-8");
bk.setBname(rs.getString(2));
bk.setBprice(rs.getDouble(3));
//author = new String(rs.getString(4).getBytes("ISO-8859-1"),"utf-8");
bk.setBauthor(rs.getString(4));
bk.setBcount(rs.getInt(5));
list.add(bk);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closs(conn,pre,rs);
}
return list;
}
}
第四步,由于代码篇幅太多,就只提供主页代码及查看书库的视图页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>欢迎你进入主页面,你将可以对我们的书库进行以下操作</h1>
<a href="insert.jsp">添加书库</a>
<a href="delete.jsp">删除书库</a>
<a href="update.jsp">修改书库</a>
<a href="rbook">查看书库</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>欢迎来到微光书店</h1>
<table>
<caption>今日书目</caption>
<tr>
<th>图书编号</th><th>图书名称</th><th>图书价格</th><th>作者</th><th>剩余数量</th>
</tr>
<c:forEach items="${book}" var="bk">
<tr>
<td>${bk.bid}</td>
<td>${bk.bname}</td>
<td>${bk.bprice}</td>
<td>${bk.bauthor}</td>
<td>${bk.bcount}</td>
</tr>
</c:forEach>
</table>
<input type="button" onclick="javascript:window.location.reload()" value="刷新"/>
<a href="index.jsp">返回</a>
</body>
</html>
第五步,service代码省略,我没有增加一点业务逻辑,Servlet提供rbook的Servlet,以便更好的了解到如何跳转页面,并把模型数据传给视图。
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Book;
import service.BookService;
@SuppressWarnings("serial")
@WebServlet(value = "/rbook")
public class RbookServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接收参数
//2.获取service方法
BookService bookService = new BookService();
List<Book> book = bookService.findByBook();
//3.跳转页面
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
req.setAttribute("book", book);
req.getRequestDispatcher("show.jsp").forward(req, resp);
}
}
结果展示:
OK,完美。