MVC分层开发模式
程序员文章站
2022-04-02 10:42:21
...
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服务方法接口,返回要跳转的页面url
public 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;
@Override
public 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();
}
}
}
@Override
protected 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 {
@Override
public String service(HttpServletRequest req, HttpServletResponse resp) {
CommonDao dao = new CommonDao();
req.setAttribute("list", dao.queryAll(Ticket.class));
// 返回转发的地址
return "/list.jsp";
}
}
- 以上就算一个基于servlet实现的mvc框架了,别人已经有更牛的框架,这里只是拿来分析。
- 上面的代码,离不开数据库操作,请看
反射和注解对dao层操作