自定义MVC——1
程序员文章站
2022-03-05 12:05:35
...
文章目录
mvc全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。他的核心思想就是各司其职,互不干扰。
为什么使用自定义MVC
以前写的MVC:
实体类、dao、web
AddBookServlet
DelBookServlet
。。。。。。
web.xml
AddBookServlet
DelBookServlet
。。。。。。
BookServlet
web.xml
BookServlet
String methodName = req.getParamater("methodName");
String methodName = req.getParamater("bname");
String methodName = req.getParamater("pice");
String methodName = req.getParamater("type");
........
Book b = new Book();
b.set()
......
if("add".equals(methodName)){
add(req,resp);
}
重定向、转发
req.getResquestDispather("xxx.jsp").forward(req,resp);
resp.sendRedirect();
jsp--->methodName=add/del/....
使用自定义MVC和之前的MVC对比,:
1、之前的MVC,BookServlet中的if语句判断非常多
2、自定义MVC可以省去jsp传递到后台封装成对象的过程
3、自定义MVC可以省去结果集的处理。
所有今天讲的是如何自定义MVC:
自定义MVC工作原理图
主控制动态调用子控制器调用完成具体的业务逻辑
请求、主控制器、子控制器
主控制器:查看是否有对应的子控制器来处理用户请求,如果就调用子控制器来处理请求
没有就报错,就处理不了请求
子控制器:就是处理用户请求用的。
举个例子,接下来写一个简易计算机页面:
首先第一步:
UI界面
第一步,写好UI界面代码,
<script type="text/javascript">
function doSub(val){
if(val==1){
calForm.action="${pageContext.request.contextPath}/addCal.action";
}
else if(val==2){
calForm.action="${pageContext.request.contextPath}/delCal.action";
}
else if(val==3){
calForm.action="${pageContext.request.contextPath}/chenCal.action";
}
else if(val==4){
calForm.action="${pageContext.request.contextPath}/chuCal.action";
}
calForm.submit();
}
</script>
<body>
<form id="calForm" name="calForm" action="${pageContext.request.contextPath}/addCal.action">
num1:<input type="text" name="num1"><br>
num2:<input type="text" name="num2"><br>
<button onclick="doSub(1)">+</button>
<button onclick="doSub(2)">-</button>
<button onclick="doSub(3)">*</button>
<button onclick="doSub(4)">%</button>
</form>
</body>
</html>
根据不同的请求进入不同的servlet,使用这种方法的前提,是需要子控制器和主控制器。
写好UI界面,再写主控制器:
package com.shl.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.shl.web.AddCalAction;
import com.shl.web.ChenCalAction;
import com.shl.web.ChuCalAction;
import com.shl.web.DelCalAction;
public class DispatcherServlet extends HttpServlet{
private static final long serialVersionUID = -3419628442945899931L;
private Map<String, Action> actionMap=new HashMap<>();
public void init() {
actionMap.put("/addCal", new AddCalAction());
actionMap.put("/delCal", new DelCalAction());
actionMap.put("/chenCal", new ChenCalAction());
actionMap.put("/chuCal", new ChuCalAction());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
init();
String url = req.getRequestURI();
url=url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));//获取请求的路径
Action action = actionMap.get(url);//获取请求对应的子控制器
action.execute(req, resp);//调用子控制器处理请求
}
}
在主控制器中,根据传来的请求路径,调用不同的servlet,这是自定义MVC的重点,调用子控制中的方法,获得相应,所有再写子控制器。
package com.shl.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 子控制器
* 专门用来处理业务逻辑的
* @author Administrator
*
*/
public interface Action {
void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
}
子控制器在这主要的作用就是让所有请求可以在主控制器中调用这个方法。这里运用了接口实现然后响应。
上一篇: C#基础笔记(四)