由于自定义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"} );
}
}
增加&模糊查询:
查看详情,里面数据不能改变需要点击修改进入修改界面才可以改:
修改,注意光标,是可以进行编辑(修改)的意思:
关键性的代码我都搁上边啦,有啥问题欢迎指教哦摆摆!