目录
一、MVC简介
二、优缺点:
二、最初的增删改查
三、反射版的增删改查
四、自定义mvc后台代码实现
一、MVC简介
MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离。把众多的业务逻辑聚集到一个部件里面,当然这种比较官方的解释是不能让我们足够清晰的理解什么是MVC的。用通俗的话来讲,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程
二、优缺点:
【优点】
-
耦合性低,方便维护,可以利于分工协作
-
重用性高
【缺点】
-
使得项目架构变得复杂,对开发人员要求高
二、最初的增删改查
- demo1:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
- DelBookServlet:
package ps.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{
@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("处理书籍的 删除业务,调动BookBiz");
}
}
- AddBookServlet:
package ps.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{
@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("处理书籍的 增加业务,调动BookBiz");
}
}
- EditBookServlet:
package ps.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{
@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("处理书籍的 修改业务,调动BookBiz");
}
}
- ListBookServlet:
package ps.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{
@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("处理书籍的 查询业务,调动BookBiz");
}
}
- 运行结果:
MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离。把众多的业务逻辑聚集到一个部件里面,当然这种比较官方的解释是不能让我们足够清晰的理解什么是MVC的。用通俗的话来讲,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程
【优点】
耦合性低,方便维护,可以利于分工协作
重用性高
【缺点】
使得项目架构变得复杂,对开发人员要求高
二、最初的增删改查
- demo1:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
目前增删改查的方法
增加
删除
修改
查询
- DelBookServlet:
package ps.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{
@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("处理书籍的 删除业务,调动BookBiz");
}
}
- AddBookServlet:
package ps.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{
@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("处理书籍的 增加业务,调动BookBiz");
}
}
- EditBookServlet:
package ps.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{
@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("处理书籍的 修改业务,调动BookBiz");
}
}
- ListBookServlet:
package ps.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{
@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("处理书籍的 查询业务,调动BookBiz");
}
}
- 运行结果:
- 存在的问题:
1.关于单个实体/表操作场景越多,需要新建的类也就越多,
造成了项目中类的数量过于庞大
2.当新增了业务,除了要添加该业务对应的方法
3.反射相关代码,在每一个实体类对应的servlet中都存在
4.每一个servlet中都有doget、dopost
三、反射版的增删改查
尝试用一个servlet写共有的增删改查
package ps.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");
// methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
// 前台传递什么方法,就调用当前类的对应的方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在同一个servlet中调用load方法");
}
private void list(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方法");
}
}
- demo2:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
类数量过多问题的优化
增加
删除
修改
查看
回显
- 测试结果:
四、自定义mvc后台代码实现
最后就是解决测试类很多重复的dopost和doget方法
自定义mvc框架工作原理图
- demo3:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
订单类
增加
删除
修改
查看
回显
- OrderServlet:
package ps.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{
@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");
// methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
// 前台传递什么方法,就调用当前类的对应的方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在同一个orderservlet中调用load方法");
}
private void list(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在同一个orderservlet中调用list方法");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("再同一个orderservlet中调用edit方法");
}
private void del(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("再同一个orderservlet中调用del方法");
}
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("再同一个orderservlet中调用add方法");
}
}
- 所用到的包类:
新写上面framework包里的类:
- Action:
package framework;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
void execute(HttpServletRequest req,HttpServletResponse resp);
}
- ActionSupport: (用来判断是什么请求ActionSupport.java)
package 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()//BookServlet.class
.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- DispatherServlet: (创建一个中央控制器DispatcherServlet.java(处理所有以.action的请求))
package 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 ps.web.BookAction;
@WebServlet("*.action")
public class DispatherServlet 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 {
doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//http://localhost:8080/mvc/book.action?methodName=list
String uri = req.getRequestURI();
// 要拿到/book.就是最后一个/到最后一个.的为止
uri=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
Action action = actions.get(uri);
action.execute(req, resp);
}
}
- bookAction:
package ps.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import framework.Action;
import framework.ActionSupport;
public class BookAction extends ActionSupport{
private void load(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("在同一个servlet中调用load方法");
}
private void list(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方法");
}
}
- 运行结果:
今天的知识就分享到这里啦!咱们下次再见!



