自定义mvc框架(中)

简介: 自定义mvc框架(中)

                                      一.前节回顾

在前一节中,我们了解了:

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>

所以你学废了吗?

相关文章
|
1月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
1月前
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
67 0
|
3月前
|
设计模式 存储 前端开发
MVC 框架的主要问题是什么?
【8月更文挑战第30天】
77 0
|
5月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
|
6月前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
65 1
|
6月前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
84 1
|
6月前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
344 1
使用Java Web框架:Spring MVC的全面指南
|
6月前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
51 0
|
6月前
|
前端开发 JavaScript Java
MVC框架:SpringMVC(三)
MVC框架:SpringMVC
61 0
|
6月前
|
JSON 前端开发 JavaScript
MVC框架:SpringMVC(二)
MVC框架:SpringMVC
65 0
下一篇
无影云桌面