不懂MVC设计模式,就永远编写不了好的JavaWeb项目

不懂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,完美。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值