首页 > 编程语言 >Java web 中央控制器

Java web 中央控制器

时间:2023-10-11 19:45:15浏览次数:49  
标签:web 控制器 Java String do edit request fruit response

Java web 中央控制器

mvc-servlet优化

03.MVC03

beanMap相当于一个容器

http://localhost:8080/pro15/fruit.do?operate=edit&fid=2

在上面的链接中使用fruit.do找到Controller控制器.然后再通过

operate找到edit方法

在原本的方法之中我们发现在FruitController的各种方法比如update(),edit(),del(),add(),index()方法里面都有一个 response.sendRedirect("fruit.do");重定向方法或者super.processTemplate("edit",request,response);获取视图模板技术.所以我们打算将这两个方法抽离到DispatcherServlet当中去让中央控制器来实现跳转与实现.

这一节主要的优化就是将上面的两个方法抽离到中央控制器当中去

  • 因为是中央控制器来调用这些方法所以我们可以将一个String返回给中央控制器.让中央控制器来接收.比如我们在update方法中返回redirect:fruit.do
   private String update(HttpServletRequest request) throws ServletException {
        //2.获取参数
        String fidStr = request.getParameter("fid");
        Integer fid = Integer.parseInt(fidStr);
        String fname = request.getParameter("fname");
        String priceStr = request.getParameter("price");
        int price = Integer.parseInt(priceStr);
        String fcountStr = request.getParameter("fcount");
        Integer fcount = Integer.parseInt(fcountStr);
        String remark = request.getParameter("remark");

        //3.执行更新
        fruitDAO.updateFruit(new Fruit(fid, fname, price, fcount, remark));
       //        response.sendRedirect("fruit.do");
        return "redirect:fruit.do";//只负责返回这个字符串
    }
  • 我们在edit()方法之中返回了edit
 private String edit(HttpServletRequest request) throws IOException, ServletException {
        String fidStr = request.getParameter("fid");
        if (StringUtil.isNotEmpty(fidStr)) {
            int fid = Integer.parseInt(fidStr);
            Fruit fruit = fruitDAO.getFruitByFid(fid);
            request.setAttribute("fruit", fruit);
//            super.processTemplate("edit", request, response);
            return "edit";
        }
        return "error";
    }

这样我们就将字符串返回给了中央控制器.同时如果我们都这样处理的话,这些类中的HttpServletResponse response,以及很多异常就不在需要了.所以是可以进行删除的

  • 让我们继续回到中央控制器,来进行进一步的抽取工作.我们在service()方法中找到了通过反射调用的方法.首先对代码Object returnObj = method.invoke(controllerBeanObj, request);的返回值接受为一个object对象,然后将这个对象强制转换为String类型.

  • 然后开始进行处理,首先判断该字符串是不是以redirect:为开头,如果是以redirect:为开头的话,这种情况就是要求重定向的方法,就截取redirect:后面的部分,然后通过response.sendRedirect(redirectStr);来调用截取的字符串.

  • 如果该字符串不是以redirect:为开头的话那么就要求调用视图模板技术,我们让DispatcherServlet 继承 ViewBaseServlet这样的话就可以直接通过uper.processTemplate(methodReturnStr, request, response);直接调用方法

    @WebServlet("*.do")
    public class DispatcherServlet extends ViewBaseServlet {
    
        private Map<String, Object> beanMap = new HashMap<>();
    
        public DispatcherServlet() {
        }
    
        public void init() throws ServletException {
            super.init();
            try {
                InputStream inputStream = getClass().getClassLoader().getResourceAsStream("applicationContext.xml");
                //1.创建DocumentBuilderFactory
                DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                //2.创建DocumentBuilder对象
                DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                //3.创建Document对象
                Document document = documentBuilder.parse(inputStream);
    
                //4.获取所有的bean节点
                NodeList beanNodeList = document.getElementsByTagName("bean");
                for (int i = 0; i < beanNodeList.getLength(); i++) {
                    Node beanNode = beanNodeList.item(i);
                    if (beanNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element beanElement = (Element) beanNode;
                        String beanId = beanElement.getAttribute("id");
                        String className = beanElement.getAttribute("class");
                        Class controllerBeanClass = Class.forName(className);
                        Object beanObj = controllerBeanClass.newInstance();
                        beanMap.put(beanId, beanObj);
                    }
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置编码
            request.setCharacterEncoding("UTF-8");
            //假设url是:  http://localhost:8080/pro15/hello.do
            //那么servletPath是:    /hello.do
            // 我的思路是:
            // 第1步: /hello.do ->   hello   或者  /fruit.do  -> fruit
            // 第2步: hello -> HelloController 或者 fruit -> FruitController
            String servletPath = request.getServletPath();
            servletPath = servletPath.substring(1);
            int lastDotIndex = servletPath.lastIndexOf(".do");
            servletPath = servletPath.substring(0, lastDotIndex);
    
            Object controllerBeanObj = beanMap.get(servletPath);
    
            String operate = request.getParameter("operate");
            if (StringUtil.isEmpty(operate)) {
                operate = "index";
            }
    
            try {
                Method method = controllerBeanObj.getClass().getDeclaredMethod(operate, HttpServletRequest.class);
                if (method != null) {
                    //2.controller组件中的方法调用
                    method.setAccessible(true);
                    Object returnObj = method.invoke(controllerBeanObj, request);
                    //3.视图处理
                    String methodReturnStr = (String) returnObj;
                    if (methodReturnStr.startsWith("redirect:")) {
                        String redirectStr = methodReturnStr.substring("redirect".length());//获取redirect后面的内容
                        response.sendRedirect(redirectStr);
                    } else {
                        //这种情况返回的就是edit
                        super.processTemplate(methodReturnStr, request, response);
                    }
                } else {
                    throw new RuntimeException("operate值非法!");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    
    

标签:web,控制器,Java,String,do,edit,request,fruit,response
From: https://www.cnblogs.com/harper886/p/17758003.html

相关文章

  • 软件测试|测试平台开发-Flask 入门:编写第一个简单 Web 应用
    简介Flask是一个轻量级的PythonWeb框架,它使得创建Web应用变得简单快捷。相比于Django框架,它具有以下的优点:轻:Flask是一个轻量级的Web框架,使用Python语言编写易:较其他同类型框架更为灵活、轻便且容易上手快:小型团队在短时间内就可以完成功能丰富的中小型网站或We......
  • JAVA设计模式——策略模式
    策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装起来并使它们可以相互替换。策略模式使算法的变化独立于使用算法的客户端。在策略模式中,我们有一个上下文对象,该对象包含一个指向策略对象的引用。策略对象实现了一个公共接口,该接口......
  • JAVA图搜索算法之DFS-BFS
    图算法DFS与BFSBFS和DFS代表对图进行遍历,即搜索的算法,搜索算法中常用的只要有两种算法:深度优先遍历(Depth-First-Search:DFS)和广度优先遍历(Breadth-First-Search:BFS)。一个图结构可以用来表示大量现实生活中的问题,比如,道路网络,计算机网络,社交网络,用户身份解析图①DFS......
  • Jmeter控制器
    常用的逻辑控制器1、循环控制器:可以设置该控制器内的sampler执行的次数,循环次数与线程的循环次数各自独立2、if控制器:根据判断条件决定是否执行该控制器内的请求,如果是字符串比较条件,参数和字符串都需要加引号条件格式:${__jexl3(条件表达式)}如:${__jexl3(${num}>10)}、${__......
  • Java 导出Excel根据单元格内容计算并设置列宽度、行高
    话不多说,上代码:importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.ss.util.CellRangeAddress;importjava.util.HashMap;importjava.util.Map;importjava.util.Objects;/***根据单元格内容计算并设置列宽度、行高*/publicclassExcelUtil{//......
  • 1——of C++ and Java togather
    因为那个C++最全的笔记是从第18课开始做(笔者说18课之前都很基础),所以这里就对前18课的知识做个笔记总结C++的工作过程这里提到的C++工作过程主要涉及两个:编译与链接之前考研时候学到,(在组成原理的某个章节),计算机的工作过程其实就涉及“将源程序转换成可执行文件”,与其中便......
  • java 后台防止重复提交(注解方式)
    /***自定义注解防止表单重复提交**@authorframework*/@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRepeatSubmit{/***间隔时间(ms),小于此时间视为重复提交*/intinterval(......
  • java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a M
    原文链接:https://www.longkui.site/error/java-lang-illegalargumentexception-expected-multiparthttpservletrequest-is-a-multipartresolver-configured/4837/0.背景JAVA后台一个上传excel的接口,如下:importData(@RequestParam("file")MultipartFilefile)然后,前台按......
  • WebAssembly C++开发环境搭建
    WebAssembly开发环境搭建简介WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行-它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C/C++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两......
  • Java程序【生产问题】排查
    1.查看线程数:方法一:查看/proc/[进程ID]/grepThreads/proc/[进程ID]/status方法二:ps-L-opid,tid,comm,state-p[进程ID]2.jstack分析Java堆栈jstack-l[进程ID]3.查看IOeg:如果有toomanyopenfiles的报错,则说明程序打开的文件过多1.查看该进程打开......