封装分页标签&&自定义MVC01

文章目录

  • 前言
  • 一、封装分页标签
  • 二、什么是MVC
  • 三、自定义MVC工作原理
  • 四、自定义mvc实现
    • 1.创建web工程
    • 2.中央处理器
    • 3.Action接口定义
    • 4.实现子控制器


前言

上一篇文章我们已经把分页功能实现了。

但是还存在一些问题,例如:
1)如果其他功能需要分页,则需要复制大量代码才能重用该功能
2)如何根据系统需要修改分页工具栏的显示风格

这一篇文章在原来的基础上进行封装分页标签解决刚刚提到的问题;


提示:以下是本篇文章正文内容,下面案例可供参考

一、封装分页标签

为了方便代码的复用,及可维护性,我们将分页功能封装了一个自定义标签(其实就是将原来写在页面中的代码,通过移入到自定义标签中去实现),开发自定义标签分成三步:

  • 编写助手类
  • 编写标签描述文件
  • 在页面上引入标签库,并使用

1) 编写助手类

import java.io.IOException;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.zking.mymvc.util.PageBean;

public class PagingTag extends BodyTagSupport{
	private PageBean pageBean;

	public PageBean getPageBean() {
		return pageBean;
	}

	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}
	
	@Override
	public int doStartTag() throws JspException {
		
		JspWriter out = this.pageContext.getOut();
		
		try {
			out.println(buildHtml());
			return SKIP_BODY;
		} catch (IOException e) {
			throw new JspException("分页标签异常", e);
		}
		
	}
	
	//生成Html内容
	private String buildHtml() {
		
		//构建分页页面元素
		String pagingElement = "<div style=\"text-align: right; width:98%;\">\r\n" + 
				"		第"  + pageBean.getPage() + "页&nbsp;&nbsp;&nbsp;\r\n" + 
				"		共" + pageBean.getTotal() + "条记录&nbsp;&nbsp;&nbsp;\r\n" + 
				"		<a href=\"javascript: goPage(1);\">首页</a>&nbsp;&nbsp;&nbsp;\r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getPreviousPage() + "');\">上页</a>&nbsp;&nbsp;&nbsp; \r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getNextPage() + "');\">下页</a>&nbsp;&nbsp;&nbsp; \r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getTotalPage() + "')\">尾页</a>&nbsp;&nbsp;&nbsp;\r\n" + 
				"		第<input type=\"text\" id=\"pagingPageNum\" size=\"2\" value='"+pageBean.getPage()+"' onkeypress=\"goSpecifiedPage(event,this.value);\"/> \r\n" + 
				"		<a href=\"javascript: goPage(document.getElementById('pagingPageNum').value)\">GO</a>\r\n" + 
				"	</div>";
		
		//构建隐藏表单,用于在分页时传递分页参数
		String hiddenForm = "<form action='" + pageBean.getUrl() + "' id=\"pagingForm\" method=\"post\">"
				+ "<input type=\"hidden\" name=\"page\" />";
		Map<String, String[]> parameterMap = pageBean.getParameterMap();
		for(Map.Entry<String, String[]> param: parameterMap.entrySet()) {
			String paramName = param.getKey();
			if("page".equals(paramName)) continue;
			String[] values = param.getValue();
			for(String val:  values) {
				hiddenForm += "<input type='hidden' name='" + paramName + "' value='" + val + "'>";
			}
		}
		hiddenForm += "</form>";
		
		//构建分页功能需要的js代码块
		String script = "<script>\r\n" + 
				"	function goPage(pageNum) {\r\n" + 
				"		var form = document.getElementById(\"pagingForm\");\r\n" + 
				"		form.page.value = pageNum;\r\n" + 
				"		form.submit();\r\n" + 
				"	}\r\n" + 
				"	\r\n" + 
				"	function goSpecifiedPage(event) {\r\n" + 
				"		if(event.keyCode == 13) {\r\n" + 
				"			var pageNum = document.getElementById(\"pagingPageNum\").value;\r\n" + 
				"			var form = document.getElementById(\"pagingForm\");\r\n" + 
				"			form.page.value = pageNum;\r\n" + 
				"			form.submit();\r\n" + 
				"		}\r\n" + 
				"	}\r\n" + 
				"	</script>";
		
		return pagingElement + hiddenForm + script;
	}
	
	
	
}

2) 标签库描述文件中添加paging标签

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>Simple Tags</short-name>
	<uri>/zking</uri>
	
	<tag>
		<!-- 标签名 -->
		<name>paging</name>
		<!-- 标签助手类 -->
		<tag-class>com.zking.mymvc.tag.PagingTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<attribute>
			<!-- 属性名, PagBean类中的val属性相匹配 -->
			<name>pageBean</name>
			<!-- 表示该属性为必要的属性 -->
			<required>true</required>
			<!-- 该属性可以接受EL表示式的值 -->
			<rtexprvalue>true</rtexprvalue>
			
		</attribute>
		
		
	</tag>

	
	
</taglib>

3) 使用分页标签
首先在页面中引入标签;


<%@taglib prefix="z" uri="/zking" %> 

将原来的分页功能,替换为标签即可

<z:paging pageBean="${pageBean}"/>

二、什么是MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。 它是一种软件设计典范。

用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。

  • 模型(model): 它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的dao类)和数据模块(pojo类)。pojo一般可以叫做实体域模型,dao和service称为过程域模型。
  • 视图(view): 用户与之交互的界面、在web中视图一般由jsp,html组成,其他的还包括android,ios等等。
  • 控制器(controller): 接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用。

不足的地方:

  • 增加系统结构和实现的复杂性。对于简单的界面,严格遵守MVC,需要使模型、视图与控制器分离,增加系统复杂性
  • 视图和控制器之间的关系太过紧密了

三、自定义MVC工作原理图

核心组件说明:

  • 中央控制器(ActionServlet): 复杂接收所有的请求,并分别给控制器具体处理。
  • 自控制器(Action):负责处理中央处理器分配的请求
  • 视图(view): jsp页面,负责显示
  • 模型(Model): 负责业务处理逻辑

四、自定义mvc实现

1 创建web工程

创建一个web工程,需要加入必要的依赖。

2 中央处理器

通过servlet来实现一个中央控制器,负责所有请求的接收。(后续中央控制器在再将请求转发给各个子控制器,此处可以先把请求接进来,转发功能后面再加)

代码如下(示例):


import java.util.HashMap;
import java.util.Map;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.mymvc.action.BookAction;
import com.zking.mymvc.action.StudentAction;
/**
 * 中央控制器,负责接收所有的请求并分别给控制器具体处理
 * @author Administrator
 */
@WebServlet("*.action")
public class ActionDispatchServlet extends HttpServlet{
	//用于保存path与action子控制器的映射
		public static Map<String, Action> actionMap = new HashMap<>();
		static {
			actionMap.put("/bookAction", new BookAction());
			actionMap.put("/studentAction", new StudentAction());
			
		}	
		
		
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		doPost(request, response);
	}
	
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("dopost ..... ");
		
		//请求分发给指定的action
		String path = getPath(request);
		
		Action action = actionMap.get(path);
		
		action.exeute(request, response);
	}
	
	private String getPath(HttpServletRequest request) {
		return "/bookAction";
	}
	

}

3 Action接口定义

Action接口定义了每个子控制器需要遵循的行为,使得所有的子控制器都有一个同一的抽象类型,所以我们可以在中央控制器中使用Action接口类型来引用所有的子控制器。这样就为用户扩展自定义的子控制器提供了条件。

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

/**
 * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求
 * @author Administrator
 */
public interface Action {
	/**
	 * 处理请求
	 * @param request  请求
	 * @param response 响应
	 * @return String 返回转发或重定向的jsp页面名称
	 */
	String exeute(HttpServletRequest request, HttpServletResponse response);
}

4 实现子控制器

为方便调试,实现两个子控制器,

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

import com.zking.mymvc.framework.Action;

public class BookAction implements Action{
	@Override
	public String exeute(HttpServletRequest request, HttpServletResponse response) {
		
		return null;
	}
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.mymvc.framework.Action;

public class StudentAction implements Action{
	@Override
	public String exeute(HttpServletRequest request, HttpServletResponse response) {
		
		return null;
	}
}


总结


以上就是今天要讲的内容,本文进一步把分页功能进行完善,以及讲解了MVC的相关内容;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值