MVC设计模式以及经典案例图书管理系统

前置知识

元数据

Meata data

描述数据的数据 String sql , 描述这份sql字符串的数据叫做元数据

数据库元数据 DatabaseMetaData

参数元数据 ParameterMetaData

结果集元数据 ResultSetMetaData

MVC设计模式

JSP的开发模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aqgDPx3-1603710376833)(img/img01.png)]

三层架构&MVC练习

经典案例:学生信息管理系统

数据库准备

	CREATE DATABASE stus;
	USE stus;
	CREATE TABLE stu (
		sid INT PRIMARY KEY  AUTO_INCREMENT,
		sname VARCHAR (20),
		gender VARCHAR (5),
		phone VARCHAR (20),
		birthday DATE,
		hobby VARCHAR(50),
		info VARCHAR(200)
	);

查询

  1. 先写一个JSP 页面, 里面放一个超链接 。

       <a href="StudentListServlet"> 学生列表显示</a>
    
  2. 写Servlet, 接收请求, 去调用 Service , 由service去调用dao

  3. 先写Dao , 做Dao实现。

    	public interface StudentDao 
    		/**
    *   查询所有学生
        * @return  List<Student>
           */
          List<Student> findAll()  throws SQLException ;
          }
        --------------------------------------------
      public class StudentDaoImpl implements StudentDao {
      	/**
      	 * 查询所有学生
      	 * @throws SQLException 
      	 */
      	@Override
      	public List<Student> findAll() throws SQLException {
      		QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
      		return runner.query("select * from stu", new BeanListHandler<Student>(Student.class));
      		}
    
      }	
    
  4. 再Service , 做Service的实现。

     	/**
     	 * 这是学生的业务处理规范
     	 * @author xiaomi
     	 *
     	 */
     	public interface StudentService {
     	
     		/**
     		 * 查询所有学生
     		 * @return  List<Student>
     		 */
     		List<Student> findAll()  throws SQLException ;
     	
     	}
     
     	------------------------------------------
     
     	/**
     	 * 这是学生业务实现
     	 * @author xiaomi
     	 *
     	 */
     	public class StudentServiceImpl implements StudentService{
     	
     		@Override
     		public List<Student> findAll() throws SQLException {
     			StudentDao dao = new StudentDaoImpl();
     			return dao.findAll();
     		}
     	}
    
  5. 在servlet 存储数据,并且做出页面响应。

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		try {
    			//1. 查询出来所有的学生
    			StudentService service = new StudentServiceImpl();
    			List<Student> list = service.findAll();
    			
    			//2. 先把数据存储到作用域中
    			request.setAttribute("list", list);
    			//3. 跳转页面
    			request.getRequestDispatcher("list.jsp").forward(request, response);
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
  6. 在list.jsp上显示数据

      EL + JSTL  + 表格
    

增加

  1. 先跳转到增加的页面 , 编写增加的页面

  2. 点击添加,提交数据到AddServlet . 处理数据。

  3. 调用service

  4. 调用dao, 完成数据持久化。

  5. 完成了这些存储工作后,需要跳转到列表页面。 这里不能直接跳转到列表页面,否则没有什么内容显示。 应该先跳转到查询所有学生信息的那个Servlet, 由那个Servlet再去跳转到列表页面。

  6. 爱好的value 值有多个。

    request.getParameter("hobby");
    String[] hobby = 	request.getParameterValues("hobby") ---> String[] 
    String value = Arrays.toString(hobby): // [爱好, 篮球, 足球]
    

删除

  1. 点击超链接,弹出一个询问是否删除的对话框,如果点击了确定,那么就真的删除。

     <a href="#" onclick="doDelete(${stu.sid})">删除</a>
    

  1. 让超链接,执行一个js方法

    	<script type="text/javascript">
    		function doDelete(sid) {
    			/* 如果这里弹出的对话框,用户点击的是确定,就马上去请求Servlet。 
    			如何知道用户点击的是确定。
    			如何在js的方法中请求servlet。 */
    			var flag = confirm("是否确定删除?");
    			if(flag){
    				//表明点了确定。 访问servlet。 在当前标签页上打开 超链接,
    				//window.location.href="DeleteServlet?sid="+sid;
    				location.href="DeleteServlet?sid="+sid;
    			}
    		}
    	</script>
    
  2. 在js访问里面判断点击的选项,然后跳转到servlet。

  3. servlet收到了请求,然后去调用service , service去调用dao

更新

  1. 点击列表上的更新, 先跳转到一个EditServlet

    在这个Servlet里面,先根据ID 去查询这个学生的所有信息出来。

  2. 跳转到更新的页面。 ,然后在页面上显示数据

      <tr>
     	<td>姓名</td>
     	<td><input type="text" name="sname" value="${stu.sname }"></td>
       </tr>
        <tr>
     	<td>性别</td>
     	<td>
     		<!-- 如果性别是男的,  可以在男的性别 input标签里面, 出现checked ,
     		如果性别是男的,  可以在女的性别 input标签里面,出现checked -->
     		<input type="radio" name="gender" value="男" <c:if test="${stu.gender == '男'}">checked</c:if>>男
     		<input type="radio" name="gender" value="女" <c:if test="${stu.gender == '女'}">checked</c:if>>女
     	</td>
       </tr>
      <tr>
     	<td>爱好</td>
     	<td>
     		<!-- 爱好: 篮球 , 足球 , 看书 
     		因为爱好有很多个,  里面存在包含的关系 -->
     		<input type="checkbox" name="hobby" value="游泳" <c:if test="${fn:contains(stu.hobby,'游泳') }">checked</c:if>>游泳
     		<input type="checkbox" name="hobby" value="篮球" <c:if test="${fn:contains(stu.hobby,'篮球') }">checked</c:if>>篮球
     		<input type="checkbox" name="hobby" value="足球" <c:if test="${fn:contains(stu.hobby,'足球') }">checked</c:if>>足球
     		<input type="checkbox" name="hobby" value="看书" <c:if test="${fn:contains(stu.hobby,'看书') }">checked</c:if>>看书
     		<input type="checkbox" name="hobby" value="写字" <c:if test="${fn:contains(stu.hobby,'写字') }">checked</c:if>>写字
     	
     	</td>
       </tr>
    
  3. 修改完毕后,提交数据到UpdateServlet

     提交上来的数据是没有带id的,所以我们要手动创建一个隐藏的输入框, 在这里面给定id的值, 以便提交表单,带上id。 
     		<form method="post" action="UpdateServlet">
     			<input type="hidden" name="sid" value="${stu.sid }">
     		
     			...
     		</form>
    
  4. 获取数据,调用service, 调用dao.

分页功能(重点功能)

  • 物理分页 (真分页)

来数据库查询的时候,只查一页的数据就返回了。

 	优点 内存中的数据量不会太大
	缺点:对数据库的访问频繁了一点。

	SELECT * FROM stu LIMIT	5 OFFSET 2 
  • 逻辑分页 (假分页)

一口气把所有的数据全部查询出来,然后放置在内存中。

优点: 访问速度快。
缺点: 数据库量过大,内存溢出。

总结

  1. jsp开发模式:

     模式一: JSP + JavaBean
     
     模式二: JSP + JavaBean  + Servlet  
     
     	M
     		对数据进行封装处理 
     	V
     		对显示有关
     	C
     		控制。
    
  2. 学生管理系统

    • 查询

    • 添加

    • 删除

      <a href=""  onclick="delete(${stu.sid})">删除</a>
      
      function delete (id){
      	
      	//确认
      	var flag = confirm("是否删除?");
      	if(flag){
      		//要删除。 请求servlet
      		//window.location.href=""
      		location.href="DeleteServlet?id="+id
      	}
      }
      
    • 更新

      在form表单里面添加一个隐藏的id文本框。
      
      按ID 更新。
      
    • 模糊查询

      //1. 只按姓名查询
      
      //2. 只按性别查询
      
      //3. 两者兼有。
      
      String sql = "select * from stu where 1=1";
      
      List<String> list = new ArrayList<String>();
      if(如果有姓名的话。){
      	sql = sql + " and sname like ?"
      	
      	list.add("%"+sname+"%");
      }
      
      if(如果有性别的话){
      	sql = sql + " and gender = ?"
      	
      	list.add(gender);
      }
      
      queryNunner.query(sql , new BeanListHandler<Student>(Student.class) ,list.toArray());
      
    • 分页 (最难点)

      分页属于一个业务, 里面包含多个逻辑单元。
      
      1. 每一页的数据包含:
      
      	class PageBean{
      		当前页		int currentPage
      		总页数   	int totalPage
      		总记录数    int totalSize
      		每页记录数  int pageSize
      		该页的学生集合。 List<Student>
      	}
      
      2. 在jsp页面上遍历显示的时候。
      
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值