目录
一、什么是MVC?
二、初版的增删改查
三、类过多的优化
四、反射优化
五、MVC工作原理以及对应打码
一、什么是MVC?
M:model
V:view
C:controller
分工明确,各司其职
降低代码耦合度
二、初版的增删改查
写一个Demo01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
再写四个servlet在com.cdl.web包下
AddBookServlet
package com.cdl.web;
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("/book/add")
public class AddBookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理书籍的增加业务,调用BookBiz");
}
}
DelBookServlet
package com.cdl.web;
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("/book/del")
public class DelBookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理书籍的删除业务,调用BookBiz");
}
}
EditBookServlet
package com.cdl.web;
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("/book/edit")
public class EditBookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理书籍的编辑业务,调用BookBiz");
}
}
ListBookServlet
package com.cdl.web;
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("/book/list")
public class ListBookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理书籍的查询业务,调用BookBiz");
}
}
当点击增加控制台输出
点其他时
三、类过多的优化
建一个BookServlet
package com.cdl.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 {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 为了区分当前请求的目的,增删改查的目的,就从前台将要调用的方法名传递到后台
String methodName = request.getParameter("methodName");
if("add".equals(methodName)){
如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
add(req,resp);
}
else if("del".equals(methodName)) {
del(req,resp);
}
else if("edit".equals(methodName)) {
edit(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("在用一个servlet中调用 list 方法");
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 list 方法");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 edit 方法");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 del 方法");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 add 方法");
}
}
Demo01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
类数量过多问题的优化
增加
删除
修改
查询
回显
结果
点击修改和删除 控制台:
四、反射优化
改变三中的BookServlet
package com.cdl.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 {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 为了区分当前请求的目的,增删改查的目的,就从前台将要调用的方法名传递到后台
String methodName = request.getParameter("methodName");
// methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
// 前台传递什么方法,就调用当前类的对应方法
try {
Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
// 调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// if("add".equals(methodName)){
// 如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
// add(req,resp);
// }
// else if("del".equals(methodName)) {
// del(req,resp);
// }
// else if("edit".equals(methodName)) {
// edit(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("在用一个servlet中调用 list 方法");
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 list 方法");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 edit 方法");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 del 方法");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用 add 方法");
}
}
和三一致效果
五、MVC工作原理以及对应打码
在com.cdl.web中建一个OrderServlet
package com.cdl.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("/order.action")
public class OrderServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 为了区分当前请求的目的,增删改查的目的,就从前台将要调用的方法名传递到后台
String methodName = request.getParameter("methodName");
// methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
// 前台传递什么方法,就调用当前类的对应方法
try {
Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
// 调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// if("add".equals(methodName)){
// 如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
// add(req,resp);
// }
// else if("del".equals(methodName)) {
// del(req,resp);
// }
// else if("edit".equals(methodName)) {
// edit(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("在用一个order中调用 list 方法");
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个order中调用 list 方法");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个order中调用 edit 方法");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个order中调用 del 方法");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个order中调用 add 方法");
}
}
Demo02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
类数量过多问题的优化
增加
删除
修改
查询
回显
订单类CRUD
增加
删除
修改
查询
回显
运行代码:
建一个com.cdl.framework的包
建一个DispatcherServlet
package com.cdl.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cdl.web.BookAction;
public class DispatcherServlet extends HttpServlet{
private Map actions = new HashMap();
// 程序启动时,只会加载一次
@Override
public void init() throws ServletException {
actions.put("/book", new BookAction());
// actions.put("/order", new BooKAction());
}
@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 {
//http://localhost:8080/mvc/book.aciton?methodName=list
String uri = req.getRequestURI();
//要拿到/book,就是最后一个/到最后一个点的位置
uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
Action action = actions.get(uri);
action.execute(req, resp);
}
}
ActionSupport
package com.cdl.framework;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionSupport implements Action {
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) {
String methodName = req.getParameter("methodName");
// methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
// 前台传递什么方法,就调用当前类的对应方法
try {
Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//打开访问权限
m.setAccessible(true);
// 调用当前类实例的methodName方法
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private void list(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用list方法");
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用list方法");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用edit方法");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用del方法");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在用一个servlet中调用add方法");
}
}
Action
package com.cdl.framework;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
void execute(HttpServletRequest req,HttpServletResponse resp);
}



