一.前节回顾
在前一节中,我们了解了:
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>
所以你学废了吗?