目录
MVC:名字由model(模型层);view (视图层);controller (控制层)三种英文单词缩写,是一种软件设计典范
分为三层:
model:模型层
view :视图层
controller 控制层
<%@ 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>
<h3>目前增加删除修改查询</h3>
<a href="${pageContext.request.contextPath }/book/add">增加</a>
<a href="${pageContext.request.contextPath }/book/edit">修改</a>
<a href="${pageContext.request.contextPath }/book/del">删除</a>
<a href="${pageContext.request.contextPath }/book/list">查询</a>
</body>
</html>
======================================================增加删除修改查询依次创建专属servlet ===
package com.lucy.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;/**
* Servlet implementation class AddBookServlet
*/
@WebServlet("/book/add")
public class AddBookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
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");
}}
效果图如下:


<h3>类数量多问题优化</h3>
<a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
==================================================反射优化代码=========================================
package com.lucy.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;/**
* Servlet implementation class AddBookServlet
*/
@WebServlet("/book.action")
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
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");
// 为了区分当前请求的目的,增加删除查看修改的目的,就从前台讲要调用的二分法名传递到后台
// methodName 可能是load/add/list/del/edit等
String methodName=request.getParameter("methodName");
// 前台传递什么方法,就调用当前类的对应方法
try {
//调用方法
Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
// 如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
if("add".equals(methodName)) {
add(request,response);
}
else if("del".equals(methodName)) {
del(request,response);
}
else if("edit".equals(methodName)) {
edit(request,response);
}
else if("list".equals(methodName)) {
list(request,response);
}
else if("load".equals(methodName)) {
load(request,response);
}
}private void load(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用load方法");
}private void list(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用list方法");
}private void edit(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用edit方法");
}private void del(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用del方法");
}private void add(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个servlet中调用add方法");
}}
action :子控制器 interface 接口
actionSupport :专门写反射方法的类 implements Action
bookAction:该实体类所实现具备 的方法类 implements Action
DispatchServlet:中央控制器 extends HttpServlet
中央控制器---->
- package com.lucy.web;
-
- 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.lucy.framework.Action;
-
- /**
- * 中央控制器:
- * 主要接受浏览器,找到对应的处理人---action
- * @author lucy
- *
- */
- @WebServlet("*.action")
- public class DispatcherServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- // ?
- private Map<String, Action> actions=new HashMap<String, Action>();
-
- //处程序启动 会加载一次初始化
- @Override
- public void init() throws ServletException {
- actions.put("/book", new BookAction());
-
- }
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doPost(request, response);
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- String url=request.getRequestURI();//http://locatio:8080/mvc/book.action?methodName=list
- // 要拿到/book 就是最后一个.为止--截取地址
- url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
- // System.out.println("路径"+url);
- Action action=actions.get(url);//路径
- action.execute(request, response);//执行反射代码
-
-
-
- }
-
- }
=====================================================子控制器 =========================================
package com.lucy.framework;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**子控制器 --对应处理人
* 对应请求的人
* @author lucy
*
*/
public interface Action {
void execute(HttpServletRequest request, HttpServletResponse response) ;
}
======================================================= ActionSupport============================
package com.lucy.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 request, HttpServletResponse response) {
String methodName=request.getParameter("methodName");
// 前台传递什么方法,就调用当前类的对应方法
try {
//调用方法
Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
==========================BookAction====================================================
package com.lucy.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.lucy.framework.Action;
import com.lucy.framework.ActionSupport;/**具体action ---若实体类改变,则用此类来进行修改实体类
* @author lucy
*
*/
public class BookAction extends ActionSupport {
private void load(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个orderservlet中调用load方法");
}private void list(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个orderservlet中调用list方法");
}private void edit(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个orderservlet中调用edit方法");
}private void del(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个orderservlet中调用del方法");
}private void add(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个orderservlet中调用add方法");
}
}
==============================================================boookServlet=================================
- package com.lucy.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;
-
- /**
- * Servlet implementation class AddBookServlet
- */
- @WebServlet("/book.action")
- public class BookServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- 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");
- // 为了区分当前请求的目的,增加删除查看修改的目的,就从前台讲要调用的二分法名传递到后台
- // methodName 可能是load/add/list/del/edit等
- String methodName=request.getParameter("methodName");
- // 前台传递什么方法,就调用当前类的对应方法
- try {
- //调用方法
- Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
- m.setAccessible(true);
- //调用当前类实例的methodName方法
- m.invoke(this, request,response);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-
-
- // 如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
- if("add".equals(methodName)) {
- add(request,response);
- }
- else if("del".equals(methodName)) {
- del(request,response);
- }
- else if("edit".equals(methodName)) {
- edit(request,response);
- }
- else if("list".equals(methodName)) {
- list(request,response);
- }
- else if("load".equals(methodName)) {
- load(request,response);
- }
- }
-
- private void load(HttpServletRequest request, HttpServletResponse response) {
- System.out.println("在同一个servlet中调用load方法");
- }
-
- private void list(HttpServletRequest request, HttpServletResponse response) {
- System.out.println("在同一个servlet中调用list方法");
- }
-
- private void edit(HttpServletRequest request, HttpServletResponse response) {
- System.out.println("在同一个servlet中调用edit方法");
-
- }
-
- private void del(HttpServletRequest request, HttpServletResponse response) {
- System.out.println("在同一个servlet中调用del方法");
-
- }
-
- private void add(HttpServletRequest request, HttpServletResponse response) {
- System.out.println("在同一个servlet中调用add方法");
-
- }
-
- }
