目录
1.mvc简介
2.最初的增删改查
3.反射版的增删改查
4.自定义MVC后台代码实现
1.mvc简介
什么是mvc?
m:model
v:view
c:controller
分工明确,各司其职
2.最初的增删改查
普通版的增删改查要写4-5个servlet,大量代码重复
AddBookServlet
package com.xbb.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");
}
}
DelBookServlrt
package com.xbb.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 DelBookServlrt 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");
}
}
EditBookServlrt
package com.xbb.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 EditBookServlrt 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");
}
}
ListBookServlrt
package com.xbb.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 ListBookServlrt 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");
}
}
上述问题:
1.关于单个实体/表操作的场景越来越多,造成的项目中的类的数量过的数量过于庞大
2.当新增了业务的时候,除了要添加该业务对应的方法,同时还要改动原有的代码
3.反射相关的代码,在每个实体类对应的selvlet中都存在
4.每一个servlet中都有doget,dopost方法
3.反射版的增删改查
package com.xbb.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);
//调用当前类实例的方法
m.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
private void edit(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用edit方法");
}
private void load(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用load方法");
}
private void del(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用del方法");
}
private void list(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用list方法");
}
private void add(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用add方法");
}
}
4.自定义MVC后台代码实现
中央控制器:
主要职能:接收浏览器请求,找的对应的处理人
package com.xbb.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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 com.xbb.web.BookAction;
@WebServlet("*.action")
public class DiapatcherServlet 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 {
String uri = req.getRequestURI();
//要拿到/book,就是最后一个/到最后一个.的位置
uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
Action action = actions.get(uri);
action.execute(req, resp);
}
}
子控制器:
对应请求的处理人
package com.xbb.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
void execute(HttpServletRequest request, HttpServletResponse response) ;
}
package com.xbb.framework;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionSupport implements Action{
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
//为了区分当前请求的目的:增删改查的目的,就从前台讲要调用的方法名传递到后台
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);
//调用当前类实例的方法
m.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
类数量过多问题的优化
增加
删除
修改
查询
回显
订单类
增加
删除
修改
查询
回显
效果:



