MVC
- 1. 什么是mvc开发模式
- 2. 基于servlet手写mvc框架
1. 什么是mvc开发模式
- mvc不是一种技术,只是一种开发模式
- 使用分层开发模式能在大型项目中,让开发人员更好的协同工作
- 便于项目的维护和扩展
- M: Model 模型层->数据库层->dao
- V: View 视图层->收集和展示用户数据->html/jsp
- C: Controller->数据封装->逻辑处理->流程控制->servlet/action/controller
2. 基于servlet手写mvc框架
- 什么是框架?
是一种标准或者规范,使用别人写好的东西,按照他的制造好的轮子,他的流程,去开发我想要实现的功能,提高开发效率,降低开发成本。
- 框架的分类,分为前后端框架
- 前端框架分为功能性的和美观性的
- 功能性的:
jQuery,vue,angular 判断数据合法性,dom操作- 美观性的:
bootstrap,easyui,react,qucikui…
- 什么是mvc框架
mvc是后端框架,专门用来解决controller与view层数据交互的问题,对这个交互过程中的各种操作进行规范和封装,让开发人员在开发web应用程序时对请求响应的控制更为方便(数据层的访问不属于mvc框架内)
- mvc框架的职责
- 规范开发流程
- 对请求数据进行封装(如页面有100个表单 多个表单)
- 流程跳转的规范 (是转发,重定向,还是js跳转)
-
工作流程图
-
ActionServlet好比一个大哥 (mvc框架的核心功能),大哥接收到老板的任务(接收到业务请求时),安排小弟(服务对象,实现业务的类)来完成任务,小弟最后执行任务(完成逻辑处理),把结果返回大哥,最后结果返回(流程控制)老板(客户端)。
-
基于servlet的mvc框架核心成员
- ActionServlet servlet 接收特定的请求,mvc框架的入口
- Action接口service方法,规范所有小弟的服务方法
- 小弟xxxAction实现接口,完成逻辑处理,为客户端提供服务
- .properties键值对配置文件,描述业务请求与xxxAction类的路径 (反射根据业务请求,取到配置文件的服务类)
- 可封装response流,输出js代码跳转
-
核心控制器ActionServlet
- 配置文件
<servlet><servlet-name>ActionServlet</servlet-name><servlet-class>com.lovely.mvc.ActionServlet</servlet-class></servlet><servlet-mapping><servlet-name>ActionServlet</servlet-name><url-pattern>*.do</url-pattern> <!-- 如接收query.do 的业务请求--></servlet-mapping>
- action接口,规范服务类
package com.lovely.mvc;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public interface Action {// service服务方法接口,返回要跳转的页面urlpublic String service(HttpServletRequest req, HttpServletResponse resp);}
-
创建配置文件(核心控制器根据业务请求,跳到对应的服务类完成业务)
-
控制器代码
package com.lovely.mvc;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ActionServlet extends HttpServlet {/*** 核心控制servlet* 根据访问方式 和 类的路径信息 到对应的servlet来处理*/private static final long serialVersionUID = 1L;private Properties property = null;@Overridepublic void init() throws ServletException {property = new Properties();// 加载配置文件InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config.properties");try {property.load(in);} catch (IOException e) {e.printStackTrace();} finally {try {if (in != null)in.close();} catch (IOException e) {e.printStackTrace();}}}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String uri = req.getRequestURI();String key = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));System.out.println(uri + "\t" + key);// 根据请求对象 拿到对应的类 进行服务String value = property.get(key).toString();try {// 反射拿到类对象Class<?> c = Class.forName(value);// 创建action对象Action action = (Action) c.newInstance();String result = action.service(req, resp);if (result != null) {// 根据返回结果 决定是请求转发 还是重定向if (result.startsWith("forward")) {String path = result.split(":")[1];req.getRequestDispatcher(path).forward(req, resp);} else if (result.startsWith("redirect")) {String path = result.split(":")[1];resp.sendRedirect(req.getContextPath() + path);} else {// 写路径默认请求转发req.getRequestDispatcher(result).forward(req, resp);} }} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}
- 提供服务对象类(以查询为例)
package com.lovely.action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.lovely.dao.CommonDao;
import com.lovely.entity.Ticket;
import com.lovely.mvc.Action;public class QueryAction implements Action {@Overridepublic String service(HttpServletRequest req, HttpServletResponse resp) {CommonDao dao = new CommonDao();req.setAttribute("list", dao.queryAll(Ticket.class));// 返回转发的地址return "/list.jsp";}}
- 以上就算一个基于servlet实现的mvc框架了,别人已经有更牛的框架,这里只是拿来分析。
- 上面的代码,离不开数据库操作,请看
反射和注解对dao层操作