自定义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恐怕不容易测试吧?生成客户端更标准,利于搜索引擎友好