一.前节回顾
在前一节中,我们了解了:
1.什么是mvc框架?
2.mvc框架在企业中的大量使用
3.mvc框架和 三层架构区别?
4.分析mvc框架代码和缺陷
5.利用自定义mvc框架去优化三层架构 !
所以你学废了吗?
二.继续优化mvc框架
1..将中央控制器中的Action容器,变成可控制!
缺点:中央控制器 加载不可以灵活配置
1.1老版方法
首先我们的第一个问题就是子控制器的初始化配置问题,我在上篇中的最后一个版本“反射增强版”演示到如果需要对项目中的其他表进行操作,就必须编写子控制器并进行配置。通过这样操作就可以将action中的容器便活,可以适应各种使用
1.2新版方法
在新版本我们通过XML建模的方法来实现将原来写死的,将其变活!
然后那个build方法(通过此方法来调用我们的xml文件)展示为
xml文件
在typr位置进行修改,路径是你实现servelt的方法
1.3相对应的一些文件
1.3.1中央控制器
package com.lz.fraamework; import java.io.IOException; import java.util.HashMap; import java.util.Map; 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; import com.lz.fraamework.model.ActionModel; import com.lz.fraamework.model.ConfigModel; import com.lz.fraamework.model.ConfigModelFactory; import com.lz.fraamework.model.ForwardModel; import com.lz.servelt.OederAction; import com.lz.servelt.bookAction; /** * 对应图中的 ActionServelt:中央控制器 调用反射代码块 * * @author lzzxq * */ @WebServlet("*.action") public class DispathServelt extends HttpServlet { private static final long serialVersionUID = 1L; private ConfigModel configModel; @Override // 服务器启动就启用 public void init() throws ServletException { try { configModel = ConfigModelFactory.build(); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @SuppressWarnings("unused") // jsp传递的参数 String methodName = request.getParameter("methodName"); // 获取浏览器路径的book String uri = request.getRequestURI(); uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); // Action action = actionMap.get(uri); // 通过 uri= 在configModel寻找 ActionModel actionmodel = configModel.pop(uri); if (actionmodel == null) { throw new RuntimeException("action not config"); } String type = actionmodel.getType(); // bookAction bk=new bookAction(); Action action; try { action = (Action) Class.forName(type).newInstance(); if(action instanceof ModelDriver) { ModelDriver md = (ModelDriver) action; Object bean = md.getModel(); BeanUtils.populate(bean, request.getParameterMap()); } // 具体业务代码返回值 增加,删除,修改,查看 tolist list String res = action.ececute(request, response); // 通过此方法 获取返回值 ForwardModel forwardModel = actionmodel.pop(res); if (forwardModel != null) { boolean redirect = forwardModel.isRedirect(); String path = forwardModel.getPath(); if (redirect) { response.sendRedirect(request.getContextPath() + "/" + path); } else { request.getRequestDispatcher(path).forward(request, response); } } } catch (Exception e) { e.printStackTrace(); } } }
1.3.2需要配置的xml文件
<?xml version="1.0" encoding="UTF-8"?> <config> <action path="/order" type="com.lz.servelt.OederAction"> <forward name="failed" path="/reg.jsp" redirect="false" /> <forward name="success" path="/login.jsp" redirect="true" /> </action> <action path="/book" type="com.lz.servelt.bookAction"> <forward name="list" path="/res.jsp" redirect="false" /> <forward name="toList" path="/res.jsp" redirect="true" /> </action> </config>
1.3.3实现servelt的方法
package com.lz.servelt; import java.io.IOException; 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 com.lz.fraamework.Action; public class OederAction extends Action{ /** * 在此实现Orderservelt的方法 * @param request * @param response */ private void Ck(HttpServletRequest request, HttpServletResponse response) { System.out.println("ck....订单方法....刘兵小狗狗"); } private void upd(HttpServletRequest request, HttpServletResponse response) { System.out.println("upd....订单方法"); } private void del(HttpServletRequest request, HttpServletResponse response) { System.out.println("del....订单方法"); } private void add(HttpServletRequest request, HttpServletResponse response) { System.out.println("add....订单方法"); } }
package com.lz.servelt; import java.io.IOException; import java.util.Map; 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 com.lz.entity.Book; import com.lz.fraamework.Action; import com.lz.fraamework.ModelDriver; public class bookAction extends Action implements ModelDriver<Book>{ private Book book = new Book(); /** * 在此实现servelt的方法 * @param request * @param response * @throws Exception * @throws ServletException */ private String add(HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String, String[]> parameterMap = request.getParameterMap(); /* 1.要有表对应的类属性对象 Book book * 2.获取到所有的参数 及参数 * 3.将参数值封装到表对应的对象中 * 4.要做到所有子控制器通用 */ // String bid = request.getParameter("bid"); // String bname = request.getParameter("bname"); // String price = request.getParameter("price"); // Book book = new Book(); // book.setBid(Integer.valueOf(bid)); // book.setBname(bname); // book.setPrice(Float.valueOf(price)); System.out.println("add....方法"); //request.getRequestDispatcher("res.jsp").forward(request, response); request.setAttribute("content", "送快递盒饭"); return "toList"; } private String Ck(HttpServletRequest request, HttpServletResponse response) throws ServletException, Exception { System.out.println("ck....方法....刘兵小狗狗"); // response.sendRedirect("res.jsp"); request.setAttribute("content", "送快递盒饭"); return "List"; } private String upd(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("upd....方法"); // request.getRequestDispatcher("res.jsp").forward(request, response); request.setAttribute("content", "送快递盒饭"); return "toList"; } private String del(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("del....方法"); // request.getRequestDispatcher("res.jsp").forward(request, response); request.setAttribute("content", "送快递盒饭"); return "toList"; } @Override public Book getModel() { // TODO Auto-generated method stub return book; } }
2.针对于反射调用业务代码,最终页面跳转
1.老版的页面跳转
request.getRequestDispatcher("res.jsp").forward(request, response);
response.sendRedirect("res.jsp");
无非是通过这两个方法进行封面跳转,但是使用这种页面跳转在每一个页面都要写东,属于重复代码
2.新版本
实现思路:定义一个res,用此来接受我们的m.invoke方法并且将我们的方法从void变成String
在一个return 返回res
其次:
将我们的servelt方法void变成String 在一个return 返回“List”or"toList" (查询)为后面的配置xml做准备
将name属性变成 list or ltoist 然后把path路径变成我们要跳转的页面!
接着进行一个if判断是转发,还是重定向?
3.jsp页面参数传递后台的代码优化字段太多有影响!
3.1老版本的封装实体,获取参数
弊端:使用于字段名比较少,如果字段名太多就会增加代码数量,并且在编码的时候很容易出现错误 ,耗费时间
3.2新版本
模型驱动接口 替换 Book book = new Book();
定义一个集合保存存储的数据
Map<String, String[]> parameterMap = request.getParameterMap();
在 DispathServelt判断是否实现接口
三.对于这些方法总结
<p>版本5</p>
常识:查询必然转发,增删改使用重定向
弊端:中央控制器中的action容器加载不可以灵活配置
<hr>
<a href="book.action?methodName=add">增加</a>
<a href="book.action?methodName=del">删除</a>
<a href="book.action?methodName=upd">修改</a>
<a href="book.action?methodName=list">查询</a>
<p>版本6</p>
弊端:jsp传递到后台,封装到实体类的代码过多
<hr>
<a href="book.action?methodName=add&bid=1&bname=nb&price=9.9">增加</a>
<a href="book.action?methodName=del">删除</a>
<a href="book.action?methodName=upd">修改</a>
<a href="book.action?methodName=list">查询</a>
<p>版本7</p>
<hr>
<a href="book.action?methodName=add&bid=1&bname=nb&price=9.9">增加</a>
<a href="book.action?methodName=del">删除</a>
<a href="book.action?methodName=upd">修改</a>
<a href="book.action?methodName=list">查询</a>
</body>
</html>
所以你学废了吗?