1.什么是MVC?
MVC全名:Model View Controller,其中Model(模型层)、View(视图层)、Controller(控制层) 它是一种软件设计典范,用于业务逻辑处理、数据、界面显示分离
常用模式: model1:jsp+jdbc model2:mvc 实现高内聚 ?低耦合 ? 各司其职?
注意:1)不能跳层调用方法
? ? ? ? ? ?2)只能由上往下进行调用;View -> Controller -> Model
?2.三层架构和MVC的区别?
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可 MVC是一种设计模式,其目的是让视图和业务逻辑分开
3.MVC的结构
? ? V(视图层) --》JSP/HTML/freemarker
? ? C(控制层) --》Servlet/Action/Controller
? ? M(模型层) --》entity(实体域模型)、dao(过程域模型) 自定义MVC工作原理图
?举例:
曾经我们写增删改查,每写一个方法就要写一个servlet用来调用方法获取数据,然后传给jsp界面
这样就会有很多重复的代码,那么就有人会传值,然后在servlet里面进行判断就可以调相应的方法
如下:
servlet:
?
package com.mvc.Servlet;
import java.io.IOException;
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("/index.do")
public class indexServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String a=req.getParameter("a");
if("add".equals(a)) {
add();
}else if("del".equals(a)) {
del();
}else if("upd".equals(a)) {
upd();
}else if("find".equals(a)) {
find();
}
}
private void find() {
// TODO Auto-generated method stub
System.out.println("查询。。。。。。。。。");
}
private void upd() {
// TODO Auto-generated method stub
System.out.println("修改。。。。。。。。。");
}
private void del() {
// TODO Auto-generated method stub
System.out.println("删除。。。。。。。。。");
}
private void add() {
System.out.println("增加。。。。。。。。。");
}
}
?这样确实简便不少,可是还是有弊端,如:
每次新增加一个方法,都要改动原有的逻辑,使代码过于冗余,例如:
当做修改功能时,需要回显,就得在servlet里面再加一个else?if,要是方法不停的增加,势必不太好,于是,我们可以利用放射,不改动原有逻辑,也能实现需求
package com.mvc.Servlet;
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("/index.do")
public class indexServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String a=req.getParameter("a");
// if("add".equals(a)) {
// add();
// }else if("del".equals(a)) {
// del();
// }else if("upd".equals(a)) {
// upd();
// }else if("find".equals(a)) {
// find();
//
// }
try {
Method m = this.getClass().getDeclaredMethod(a, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
m.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
private void find(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("查询。。。。。。。。。");
}
private void upd(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("修改。。。。。。。。。");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("删除。。。。。。。。。");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("增加。。。。。。。。。");
}
private void ref(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("ref()。。。。。。。。。");
}
}
sjp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="add.do">增加1</a>
<a href="del.do">删除1</a>
<a href="upd.do">修改1</a>
<a href="find.do">查找1</a>
<hr>
<a href="index.do?a=add">增加2</a>
<a href="index.do?a=del">删除2</a>
<a href="index.do?a=upd">修改2</a>
<a href="index.do?a=find">查找2</a>
<a href="index.do?a=ref">ref()</a>
</body>
</html>
界面如下
?点击ref()控制台:
?利用放射,可以修复改动代码的缺陷
反射这段代码相当于中央控制器,并不直接处理浏览器请求
处理浏览器请求的是子控制器
?
?
|