自定义MVC框架之详述过程(二)

自定义MVC框架之详述过程(二)

前言

由于自定义MVC的使用不熟练,江今儿个又来说说这自定义MVC,之前也讲过关于自定义MVC的,指路:自定义MVC框架(一)

自定义MVC的流程

自定义MVC流程

案例讲述

MySQL+自定义MVC+bootstrap实现的
在这里插入图片描述
其实效果与之前的一样,就显示数据,增删改查看详情熬!
步骤按上方流程图讲述,首先是通过请求到达中央控制器,
1.获取请求路径
2.截取出请求路径
3.判断请求路径有没有找到 没有找到就抛出异常
4.通过path实例化处理网络请求URL的类
5.动态封装参数 判断此类有没有继承父类modelDroiven(这一点忘记在上面的流程图讲啦!)
6.动态调用方法,调用的execute中通过反射使用对应的方法,因为将req当做参数传递了过去所以可以获取到方法名
7.通过解析xml文件获取到path路径 再通过isRedirect方法判断是否需要重定向或者转发
8.最后显示结果

中央控制器:

package com.zengjing.framework;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

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;

@WebServlet(name="dispatcherServlet",urlPatterns="*.action")
public class DispatcherServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	private ConfigModel configModel;
	
	@Override
	public void init() throws ServletException {
		try {
			configModel = ConfigModelFactory.build();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			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 {
	//1.获取请求路径
		String uri=req.getRequestURI();
		req.setCharacterEncoding("utf-8");
		//2.截取出请求路径
		String path = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));//book
		//System.out.println(uri);
		//System.out.println(path);
		ActionModel actionModel = configModel.pop(path);
		//3.判断请求路径有没有找到 没有找到就抛出异常
		if(actionModel==null) {
			throw new RuntimeException(path+"action 标签没有配置");
		}
		
		//4.实例化处理网络请求URL的类
		try {
			Action action=(Action) Class.forName(actionModel.getType()).newInstance();
			//5.动态封装参数 判断此类有没有继承父类modelDroiven
			if(action instanceof ModelDriven) {
				ModelDriven md=(ModelDriven)action;
				//将前端jsp参数传递到后端的所有值封装到业务模型类中
				BeanUtils.populate(md.getModel(), req.getParameterMap());
			}
			//6.动态调用方法
			String code = action.execute(req, resp);
			ForwardModel forwardModel = actionModel.pop(code);
			//7.通过解析xml文件获取到path路径 再通过isRedirect方法判断是否需要重定向或者转发
			String jspPath=forwardModel.getPath();
			if(forwardModel.isRedirect()) {
				resp.sendRedirect(req.getServletContext()+jspPath);
			}else {
				req.getRequestDispatcher(jspPath).forward(req, resp);
			}
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
}


通过path实例化处理网络请求URL的工具类:

package com.zengjing.action;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

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

import com.zengjing.dao.RecruitmentDao;
import com.zengjing.entity.Recruitment;
import com.zengjing.framework.ActionSupport;
import com.zengjing.framework.ModelDriven;
import com.zengjing.util.PageBean;


public class RecruitmentServlet extends ActionSupport implements ModelDriven<Recruitment>{

	private static final long serialVersionUID = 1L;
	
	private Recruitment r=new Recruitment();

	public RecruitmentDao rd=new RecruitmentDao();
	
	public String list(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		Recruitment re=new Recruitment();
		req.setCharacterEncoding("utf-8");
		String name=req.getParameter("name");
		re.setCompany(name);
		
		PageBean pageBean=new PageBean();
		pageBean.setRequest(req);

		req.setAttribute("pageBean", pageBean);
		try {
			List<Recruitment> ls= rd.list(re, pageBean);
			req.setAttribute("recruitment", ls);
			req.setAttribute("name", name);
			req.getRequestDispatcher("/index.jsp").forward(req, resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "list";
	}

	public String add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		rd.add(r);
		return "toList";
	}
	
	public String del(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		rd.del(r);
		return "toList";
	}
	
	public String edit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		rd.edit(r);
		return "toList";
	}
	
	public String toEdit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		Recruitment re=this.rd.list(r, null).get(0);
		req.setAttribute("r", re);
		return "toEdit";
	}
	
	public String one(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		Recruitment re=this.rd.list(r, null).get(0);
		req.setAttribute("Recruitment", re);
		return "toOne";
	}
	
	@Override
	public Recruitment getModel() {
		// TODO Auto-generated method stub
		return r;
	}
	
}

用来动态调用方法的类:

package com.zengjing.framework;

import java.lang.reflect.Method;

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

public class ActionSupport implements Action{

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		String methodName=req.getParameter("methodName");
		Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
		m.setAccessible(true);
		return (String)m.invoke(this,req, resp);
	}

}

写完以上的自定义mvc框架之后,咱们调用dao方法也就简化了许多,也简明易懂:


public class RecruitmentDao extends BaseDao<Recruitment>{

	
	public List<Recruitment> list(Recruitment r,PageBean pageBean) throws Exception{
		String name=r.getCompany();
		String id=r.getId();
		String sql="select * from t_solr_job where true ";
		if(name!=null) {
			sql+=" and company like '%"+name+"%'";
		}
		if(id!=null) {
			sql+=" and id='"+id+"'";
		}
		return super.executeQuery(sql, r.getClass(), pageBean);
	}
	
	public int add(Recruitment r) throws Exception{
		String sql="insert into t_solr_job values(?,?,?,?,?,?,?,now(),?,?,?)";
		return super.executeUpdate(sql, r,new String[] {"id","job","company","address","salary","url","limit","desc","jobHandle","addressHandle"} );
		
	}
	
	public int del(Recruitment r) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException {
		String sql="delete from t_solr_job where id=?";
		return super.executeUpdate(sql, r, new String[] {"id"});
	}
	
	public int edit(Recruitment r) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException{
		String sql="update t_solr_job set `job`=?,`company`=?,`address`=?,`salary`=?,`url`=?,`limit`=?,`desc`=?,`jobHandle`=?,`addressHandle`=? where `id`=?";
		return super.executeUpdate(sql, r,new String[] {"job","company","address","salary","url","limit","desc","jobHandle","addressHandle","id"} );
	}
}
	

增加&模糊查询:
在这里插入图片描述
查看详情,里面数据不能改变需要点击修改进入修改界面才可以改:
在这里插入图片描述
修改,注意光标,是可以进行编辑(修改)的意思:
在这里插入图片描述

总结

关键性的代码我都搁上边啦,有啥问题欢迎指教哦摆摆!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值