思维导图
一、自定义MVC
1.什么是MVC?
MVC全名:Model View Controller,其中Model(模型层)、View(视图层)、Controller(控
层)它是一种软件设计典范,用于业务逻辑处理、数据、界面显示分离,
2、三层架构和MVC的区别?
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可
MVC是一种设计模式,其目的是让视图和业务逻辑分开
3、MVC结构?
? ?①、?V(视图层) -->JSP/HTML/freemarker
? ?②、 C(控制层) -->Servlet/Action/Controller
? ?③、M(模型层) -->entity、dao
注:(1)不能跨层调用; ? ? ? ?(2)只能由上往下进行调用;View -> Controller -> Model
4、自定义MVC工作原理图
? ? ? ? ? ? ? *.action ? ? ? ? ? 调度 ? ? ? ? ? 截取*(请求路径名) 处理具体业务逻辑 ? ?JSP ---------> Servlet(中央控制器)--------------------->Action(子控制器)--->Model(Dao、DB)
5 之前的开发模式
①、 绝大多数人采用这种方法做增删改查,需要多少个servlet就建多少
package com.mwy.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/book/add")
public class AddBookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--Add增加--");
}
}
//jsp界面
绝大多数人采用这种方法做增删改查(select层)
<a href="${pageContext.request.contextPath }/book/add">新增</a>
<a href="${pageContext.request.contextPath }/book/del">删除</a>
<a href="${pageContext.request.contextPath }/book/upd">修改</a>
<a href="${pageContext.request.contextPath }/book/list">查询</a>
②、少数人采用这种方法做增删改查(select层)
package com.mwy.web;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/book.action")
public class BookServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String methodName = req.getParameter("methodName");
if("add".equals(methodName)) {
add(req,resp);
}else if("del".equals(methodName)){
del(req,resp);
}else if("upd".equals(methodName)){
upd(req,resp);
}else if("list".equals(methodName)){
list(req,resp);
}else if("load".equals(methodName)){
load(req,resp);
}
}
private void list(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--查询--");
}
private void upd(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--修改--");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--删除--");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--增加--");
}
jsp界面
少数人采用这种方法做增删改查(select层)
<a href="${pageContext.request.contextPath }/book.action?methodName=add">新增</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=upd">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
③、反射优化
package com.mwy.web;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 为什么要学习自定义MVC框架?关键词:自定义MVC 框架
* 之前的开发模式:
* MVC:模型层(Model)视图层(View)控制层(controller)
* mvc怎么出现的:各司其职
*编码:实体类。数据处理Dao、servlet、jsp 代码量多了
*
*自定义MVC
*分析:
*1、数据处理Dao 代码思路基本重复(前几次讲到)
*2、servlet 代码思路基本重复
*2.1、doget/dopost,实际上doGet基本用不上
*2.2、实体类参数接受代码冗余(req.getParammeter(""),尤其当实体类属性多的情况)
*2.3、关于结果页面的跳转(转发、重定向)
* req.getdispather(/index.jsp).forward(req,resp);
* resp.sendredirect(/index.jsp);
*3、jsp 代码思路基本重复(HTML、JS前几次讲到)
*解决方案
*1、通用分页(讲过的)、单表的增删改(优化)
*2、servlet不需要写冗余的代码->自定义mvc框架
*3、自定义jsp标签
*框架:反射+设计模式(极大地减少了代码量,把重复性的代码给框架完成,让程序员关注点放在项目业务)
*1、通用分页指点+通用的增删改
*2、各层(MC)数据Dao层、控制层代码缩减
*3、前台代码的缩减优化
*/
@WebServlet("/book.action")
public class BookServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 优点:相交于前一种,代码量时间少的,由原来4个类变成了1个类
* 缺点:
* 每一次新增一个方法,都要改动原有逻辑,使代码过于冗余
* 举例:一般当修改的时候,需要做数据回显load
* 思考:
* 不改动原有逻辑,也能实现需求
* 解决方案:
* 调用哪个方法,实际上是取决于methodName,加if不是必要条件
* 直白一点:动态调用methodName方法,并且是当前类实例的methodName方法
* 总结:
* 反射可以修复上面改动代码才能解决需求问题缺陷
* 反射这段代码,相当于中央控制器,并不直接处理浏览器请求
* 处理浏览器请求的是子控制器
*/
String methodName = req.getParameter("methodName");
try {
Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
m.invoke(this,req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--回显--");
}
private void ref(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("--ref--");
}
}
jsp界面
反射优化
<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=ref">关联查询</a>
①、②、③最终出现结果
还没有写完哦~~在等等
|