自定义mvc框架

自定义mvc框架分享

实现效果图

在这里插入图片描述

使用工具类

在这里插入图片描述

程序运行流程

1,发送一个请求
在这里插入图片描述
跳转到xml配置文件中处理请求
在这里插入图片描述
进入主控制器拦截到.action进行处理
在这里插入图片描述
获取到请求路径再获取* 号部分的内容进行截取,根据*查找子控制器
在这里插入图片描述
将请求委托给子控制器处理
在这里插入图片描述
子控制器
在这里插入图片描述
继承子实现类,调用反射方法,获取类对象
在这里插入图片描述
通用分页标签Tag类

private static final long serialVersionUID = -7216827811251209853L;

private PageBean pageBean;

public PageBean getPageBean() {
	return pageBean;
}

public void setPageBean(PageBean pageBean) {
	this.pageBean = pageBean;
}

public pageTag() {}
@Override
public int doStartTag() throws JspException {
	try {
		JspWriter out = this.pageContext.getOut();
		out.println(toHtml());
		
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
	return SKIP_BODY;
}
public String toHtml() {
	StringBuffer sb = new StringBuffer();
	//防止pagebean 空指针异常
	if(null==pageBean ||!pageBean.isPagination()) {
		return sb.toString();
	}
	//分页按钮
	sb.append("当前第"+this.pageBean.getPage()+" 页   共"+this.pageBean.getMaxPage()+"页   共"+this.pageBean.getTotal()+"条");
	sb.append("<a href='javascript:doForward(1)'>首页</a>");
	sb.append("	<a href=\"javascript:doForward('"+this.pageBean.getpreviousPage()+"')\">上一页</a>");
	sb.append("<a href=\"javascript:doForward('"+this.pageBean.getNextPage()+"')\">下一页</a>");
	sb.append("<a href=\"javascript:doForward('"+this.pageBean.getMaxPage()+"')\">末页</a> ");
	sb.append("<input type='text' id='numTxt'><a href='javascript:doSkip()'>go...</a>");
	
	//分页隐藏域表单  专门用来传递数据
	sb.append("<form id='pageForm' action='"+this.pageBean.getUrl()+"' method='post'>");
	sb.append("<input type='hidden' name='page'/>");
	//从map集合中获取参数
	Map<String, String[]> parameterMap = pageBean.getParameterMap();
	//遍历集合
	for(Map.Entry<String, String[]> entry :parameterMap.entrySet()) {
		String name = entry.getKey();
		String[] value = entry.getValue();
		
		if("page".equals(name)) {//将上一次的页码抛掉
			continue;//退出循环进入下一个循环
		}
		//遍历数组
		for(int i=0;i<value.length;i++) {
			System.out.println(value[i]);
			sb.append("<input='hidden' name='"+name+"' value='"+value[i]+"'>");
		}
	}
	sb.append("</form>");
	//动态拼接js
	sb.append("<script type=\"text/javascript\">\r\n" + 
			"		function doForward(page){\r\n" + 
			"			//alert(page);\r\n" + 
			"			var f = document.getElementById('pageForm');\r\n" + 
			"			f.page.value=page;\r\n" + 
			"			alert(f.page.value);\r\n" + 
			"			f.submit();\r\n" + 
			"		}\r\n" + 
			"		\r\n" + 
			"		function doSkip(){\r\n" + 
			"			var num = document.getElementById('numTxt').value;\r\n" + 
			"			if(!num||isNaN(num)||!/^[0-9]+$/.test(num)||parseInt(num)<=0||parseInt(num)>6){\r\n" + 
			"				alert(\"请输入1到11之间的整数\")\r\n" + 
			"			}\r\n" + 
			"			doForward(num)\r\n" + 
			"		}\r\n" + 
			"	</script>");
	return sb.toString();
}

分页助手类

//三大要素
private int page=1;//页码
private int rows =10;//页的大小
private  int total=0;//总记录数,从数据库中进行统计
private String url;//请求路径
private boolean pagination = true;//是否分页  默认分页
//存储页面传的参数
private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();

//专门写一个方法用来做pageBean的初始化方法
public void setRequest(HttpServletRequest request) {
	// page rows pagination 公共的参数  只能用来做分页
	//从界面获取到分页的参数
	String page = request.getParameter("page");
	String rows = request.getParameter("rows");
	String pagination = request.getParameter("pagination");
	//给参数赋值
	this.setPage(page);
	this.setRows(rows);
	this.setPagination(pagination);
	//获取请求路径
	this.url=request.getContextPath()+request.getServletPath();
	//获取页面传递的参数
	this.ParameterMap = request.getParameterMap();

}

//上一页
public int getpreviousPage() {
	int previousPage = this.page-1;
	if(0 == previousPage) {
		previousPage=1;
	}
	return previousPage;
}
//下一页
public int getNextPage() {
	int nextPage = this.page+1;
	if(nextPage>this.getMaxPage()) {
		nextPage=this.getMaxPage();
	}
	return  nextPage;
}

public String getUrl() {
	return url;
}

public void setUrl(String url) {
	this.url = url;
}

/**
 * 获取最大页数
 * @return
 */
public int getMaxPage() {
	int maxPage = this.total/this.rows;
	if(0!=this.total%this.rows) {
		maxPage++;
	}
	return maxPage;
}

public Map<String, String[]> getParameterMap() {
	return ParameterMap;
}
public void setParameterMap(Map<String, String[]> parameterMap) {
	ParameterMap = parameterMap;
}
public int getPage() {
	return page;
}

public void setPage(int page) {
	this.page = page;
}
public void setPage(String page) {
	if(null!=page &&!"".equals(page.trim())) {
		this.page = Integer.parseInt(page);
	}
}

public int getRows() {
	return rows;
}

public void setRows(int rows) {
	this.rows = rows;
}
public void setRows(String rows) {
	if(null!=rows &&!"".equals(rows.trim())) {
		this.rows = Integer.parseInt(rows);
	}
}

public int getTotal() {
	return total;
}

public void setTotal(int total) {
	this.total = total;
}

public boolean isPagination() {
	return pagination;
}

public void setPagination(boolean pagination) {
	this.pagination = pagination;
}
public void setPagination(String pagination) {
	if("false".equals(pagination)) {
		
		this.pagination = Boolean.parseBoolean(pagination);
	}
}
/**
 * 获得起始记录的下标
 * @return
 */
public int getStartsIndex() {
	return (this.page-1)*this.rows;
}


public PageBean() {
	super();
}

public PageBean(int page, int rows, int total, boolean pagination) {
	this.page = page;
	this.rows = rows;
	this.total = total;
	this.pagination = pagination;
}

@Override
public String toString() {
	return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
}

servlet方法
在这里插入图片描述

总结

MVC的优点在于关注点分享,够灵活,可扩展,可测试性。可在action级别上进行单元测试,webform恐怕不容易测试吧?生成客户端更标准,利于搜索引擎友好

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值