IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 自定义MVC框架 -> 正文阅读

[开发测试]自定义MVC框架

自定义MVC框架思维导图?

?1.需要导入的包

?2.帮助类和配置文件

?

一、解决控制器初始化的问题

? ? ? ? ?需求:
?? ? * ?? ?在增加一个商品类的增删改查
?? ? * ?? ?开发步骤:
?? ? * ?? ??? ?改动init中的代码
?? ? * ?? ?思考:
?? ? * ?? ??? ?能不能不改动代码完成这个需求
?? ? * ?? ??? ?参考DBAccess的数据源配置文件Config.properties
?? ? * ?? ??? ??? ?1.减少代码改动风险性
?? ? * ?? ??? ??? ?2.减少代码的编译次数(对于已经部署到服务器后)
?? ? * ?? ??? ??? ?**改代码有风险改配置文件不会影响代码
?? ? * ?? ?解决方案:
?? ? * ?? ?改成子控制器可配置
?? ? * ?解决步骤
?? ? * ??? ??? ?1.必须有配置文件config.xml
?? ? * ??? ??? ?2.配置文件config.xml中要包含处理业务的子控制器
?? ? * ??? ??? ?3.读取到配置文件config.xml中的对应的处理浏览器请求的子控制器
?? ? * ?编码
?? ? * ??? ?..........

1.代码块

package com.lijiayan.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 org.apache.commons.beanutils.BeanUtils;

import com.lijiayan.BookAction;
import com.lijiayan.GoodsAction;

/**
 * 目标:
 * 根据自定义MVC框架的原理图 完成 框架研发
 * @author 
 * 中央控制器
 * 	目标:寻找子控制器
 *
 * 2021年8月30日 下午8:10:17
 */
@WebServlet("*.action")
public class DispatchServlet extends HttpServlet {
	//容器 =配置文件 建模
	private ConfigModel configmodel = null;
//	初始化子控制器容器(集合),经过初始化,actions容器内部就有了子控制器
//	init service destroy
	@Override
	public void init() throws ServletException {
		//初始化 此时子控制器有内容了
		try {
			configmodel  = ConfigModelFactory.build();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	@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 {
//		完成寻找子控制器的过程
//		浏览器:http://localhost:8080/T266_mvc/book.action?methodName=add
//		目标:调用BookAction.add()...方法
		/**
		 * 思路:
		 * 	1.从浏览器URL中获得"/book"字符串
		 * 	2.在子控制器容器中拿到BookAction
		 * 	3.BookAction.add()
		 */
		
		//获得用户的请求地址(*.action)
		String url = req.getRequestURI();
		//先获取最后后斜杆的位置
		int start = url.lastIndexOf("/");
		//在获取最后点的位置
		int end = url.lastIndexOf(".");
		//在进行截取
		url = url.substring(start,end);//拿到 /book
		//拿到子控制器 action=BookAction
		//相当于ActionSupport action = new BookAction()
		ActionModel actionmodel = configmodel.pop(url);
		//拿到全路径名=com.lijiayan.BookAction
		String type = actionmodel.getType();
		
		ActionSupport  action;
		try {
			 //反射实例化 相当于ActionSupport action = actions.get(url);	
			  action = (ActionSupport)Class.forName(type).newInstance();
			  if(action instanceof ModelDriver) {//有的有对象有的没有对象
				  //转性为ModelDriver 因为他实现这个接口
				  ModelDriver m = (ModelDriver) action;
				  //拿到这个对象
				  Object obj = m.getModel();
				  //有对象
				  //接受所有前端JSP传递到后台的参数
				  Map<String, String[]> parameterMap = req.getParameterMap();
//				    对 对象赋值
				  //所有前端JSP传递到后台的参数(parameterMap)键值 赋值给obj
				  BeanUtils.populate(obj, parameterMap);
				  
			  }
			//因为:BookAction 继承 ActionSupport 所以TA会有 excute 这个方法,就直接访问到BookAction.add()或其他方法
			  String res = action.execute(req, resp);
			  /**
			   * 思路:
			   * 1.方法执行完毕必须有一个返回值
			   * 2.通过返回值决定是否重定向,还是转发
			   * 3.通过返回值决定跳转那个页面
			   * 
			   */
			  //拿到config对象
			  ForwardModel forwardModel = actionmodel.pop(res);
			  //判断
			  if(forwardModel.isRedirect()) {
				  //是否是重定向
				  resp.sendRedirect(req.getContextPath()+forwardModel.getPath());
			  }else {
				  req.getRequestDispatcher(forwardModel.getPath()).forward(req, resp);
			  }
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		
	}

}

运行index.jsp

<%@ 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>
	目前多数人增删改查的代码
	<a href="${pageContext.request.contextPath}/book/add" >增加</a>
	<a href="${pageContext.request.contextPath}/book/delete" >删除</a>
	<a href="${pageContext.request.contextPath}/book/edit" >修改</a>
	<a href="${pageContext.request.contextPath}/book/list" >查看</a>
	<hr>
	增删改查的代码V2.0
	<a href="${pageContext.request.contextPath}/book.action?methodName=add" >增加</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=delete" >删除</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=edit" >修改</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=list" >查看</a>
	<hr>
	增删改查的代码V3.0
	<a href="${pageContext.request.contextPath}/book.action?methodName=load" >回显</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=ref" >关联</a>
	<hr>
	演示初始化的控制器的缺陷
	<a href="${pageContext.request.contextPath}/goods.action?methodName=add" >增加</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=delete" >删除</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=edit" >修改</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=list" >查看</a>
	<hr>

</body>
</html>

运行结果界面

?结果图

?二、解决参数实体类的封装的问题
?? ??? ?


?? ??? ? * 缺陷:对于前端传参,实体类属性封装req.getParammeter("")代码 是重复
?? ??? ? * 需求:做一个book的新增功能
?? ??? ? * 思考:将JSP参数塞进实体类的属性中,问题是每个实体类的属性是一样的,没有办法做到重复
?? ??? ? * 思路:
?? ??? ? * ?? ??? ?1.不知道是哪一个实体类-》泛型T代替
?? ??? ? * ?? ??? ?2.不知道实体类有哪些属性,但是又要给属性赋值-》反射动态设置属性值
?? ??? ? * 解决方案:泛型+反射
?? ??? ? * 编码:
?? ??? ? * ?模型驱动接口:ModelDriver

?? ??? ? * ?? ??? ?
? ? ? ?

1.代码块

package com.lijiayan;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.entity.Book;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;

/**
 * 
 * @author 
 * 子类(BookAction)继承 父类 (继承ActionSupport)实现(ModelDriver)这个接口才会有这个方法,才可以找到对象
 */
public class BookAction extends ActionSupport  implements ModelDriver<Book>{
	
	private Book book = new Book();
	//除了有以下的一些方法他还会 有excute 这个方法,因为:BookAction 继承 ActionSupport 所以TA会有 excute 这个方法
	//子控制器:关注业务代码
	private void add(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("BookAction调用bookDao.add()...");
	}
	private String delete(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("BookAction调用bookDao.delete()...");
		//删除重新查一遍
		return "toList";
	}

	private String list(HttpServletRequest req,HttpServletResponse resp) {
		//查询
		return "list";
		}
	
	private void load(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("BookAction调用bookDao.load()...");

	}
	
	
	private void ref(HttpServletRequest req,HttpServletResponse resp) {
		//打印接受的值
		System.out.println(book);
		System.out.println("BookAction调用bookDao.ref()...");

	}
	@Override
	public Book getModel() {
		//返回这个对象book 注意现在是空的
		return book;
	}

}

运行index.jsp

<%@ 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>
	目前多数人增删改查的代码
	<a href="${pageContext.request.contextPath}/book/add" >增加</a>
	<a href="${pageContext.request.contextPath}/book/delete" >删除</a>
	<a href="${pageContext.request.contextPath}/book/edit" >修改</a>
	<a href="${pageContext.request.contextPath}/book/list" >查看</a>
	<hr>
	增删改查的代码V2.0
	<a href="${pageContext.request.contextPath}/book.action?methodName=add" >增加</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=delete" >删除</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=edit" >修改</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=list" >查看</a>
	<hr>
	增删改查的代码V3.0
	<a href="${pageContext.request.contextPath}/book.action?methodName=load" >回显</a>
	<a href="${pageContext.request.contextPath}/book.action?methodName=ref" >关联</a>
	<hr>
	演示初始化的控制器的缺陷
	<a href="${pageContext.request.contextPath}/goods.action?methodName=add" >增加</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=delete" >删除</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=edit" >修改</a>
	<a href="${pageContext.request.contextPath}/goods.action?methodName=list" >查看</a>
	<hr>
	解决参数实体类的封装的问题
	<form action="${pageContext.request.contextPath}/book.action?methodName=ref" method="post">
		<input type="text" name="bid" value="1">
		<input type="text" name="bname" value="queen">
		<input type="text" name="price" value="40">
		<input type="text" name="author" value="moumou">
		<input type="text" name="publish" value="qbg">
		<!-- <input type="text" name="remark" value="kkkkk"> -->
		<input type="submit" value="提交请求">
	</form>
	
</body>
</html>

运行结果界面

?结果图

三、解决结果集代码重复问题?


?? ??? ? * 需求:删除数据后跳转到书籍展示页面
?? ??? ? * 缺陷:1.出现大量重复代码 ?2.不好处理((重定向)增删改重新跳到(转发)查询界面)
?? ??? ? * 解决方案:在一个地方统一管理重定向还是转发,并且是定位跳转到哪一个界面
?? ??? ? * 预测结果:BookAction调用bookDao.delete()...

config.xml代码块

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<action path="/book" type="com.lijiayan.BookAction">
		<forward name="list" path="/bookList.jsp" redirect="false" />
<!--增删改操作之后要再一次查询数据库的新的数据做展示(list) -->
		<forward name="toList" path="/book.action?methodName=list" redirect="true" />
	</action>
</config>

BookiAction类的方法执行完毕必须有一个返回值

private String delete(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("BookAction调用bookDao.delete()...");
		//删除重新查一遍
		return "toList";
	}

	private String list(HttpServletRequest req,HttpServletResponse resp) {
		//查询
		return "list";
		}

DispatchServlet中央控制器代码

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		完成寻找子控制器的过程
//		浏览器:http://localhost:8080/T266_mvc/book.action?methodName=add
//		目标:调用BookAction.add()...方法
		/**
		 * 思路:
		 * 	1.从浏览器URL中获得"/book"字符串
		 * 	2.在子控制器容器中拿到BookAction
		 * 	3.BookAction.add()
		 */
		
		//获得用户的请求地址(*.action)
		String url = req.getRequestURI();
		//先获取最后后斜杆的位置
		int start = url.lastIndexOf("/");
		//在获取最后点的位置
		int end = url.lastIndexOf(".");
		//在进行截取
		url = url.substring(start,end);//拿到 /book
		//拿到子控制器 action=BookAction
		//相当于ActionSupport action = new BookAction()
		ActionModel actionmodel = configmodel.pop(url);
		//拿到全路径名=com.lijiayan.BookAction
		String type = actionmodel.getType();
		
		ActionSupport  action;
		try {
			 //反射实例化 相当于ActionSupport action = actions.get(url);	
			  action = (ActionSupport)Class.forName(type).newInstance();
			  if(action instanceof ModelDriver) {//有的有对象有的没有对象
				  //转性为ModelDriver 因为他实现这个接口
				  ModelDriver m = (ModelDriver) action;
				  //拿到这个对象
				  Object obj = m.getModel();
				  //有对象
				  //接受所有前端JSP传递到后台的参数
				  Map<String, String[]> parameterMap = req.getParameterMap();
//				    对 对象赋值
				  //所有前端JSP传递到后台的参数(parameterMap)键值 赋值给obj
				  BeanUtils.populate(obj, parameterMap);
				  
			  }
			//因为:BookAction 继承 ActionSupport 所以TA会有 excute 这个方法,就直接访问到BookAction.add()或其他方法
			  String res = action.execute(req, resp);
			  /**
			   * 思路:
			   * 1.方法执行完毕必须有一个返回值
			   * 2.通过返回值决定是否重定向,还是转发
			   * 3.通过返回值决定跳转那个页面
			   * 
			   */
			  //拿到config对象
			  ForwardModel forwardModel = actionmodel.pop(res);
			  //判断
			  if(forwardModel.isRedirect()) {
				  //是否是重定向
				  resp.sendRedirect(req.getContextPath()+forwardModel.getPath());
			  }else {
				  req.getRequestDispatcher(forwardModel.getPath()).forward(req, resp);
			  }
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

运行界面


? ? ? ?

调到查询界面结果

?控制台结果

?四、代码错误截图

原因:type加了双引号导致措

?

?解决:去掉双引号即可

五、错误截图2

原因图:

?

?

?

?

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:14:13  更:2021-09-01 12:14:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 4:23:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码