【JavaWeb】简单实现DispatcherServlet

DispatcherServlet浅析 介绍 ​ DispatcherServlet是一个Servlet,在springmvc中被称为前端控制器,根据请求的路径、类型等进行请求的分发。 分析 DispatcherServlet类图 ​ 上图中的红色部分为Servlet接口,在Springmvc中实现并扩展了该Servlet接口。在我最早学javaweb开发时,并不是上来就使用各种MVC框架,而是从编写简单的Servlet开始,就是继承HttpServlet后,重写它的service方法。而Springmvc的设计同理,它也继承... 阅读详情

一、DispatcherServlet解决的问题

在这里插入图片描述**问题1:**如图所示,如果对于某一业务,增删改查如果都创建一个servlet,那么业务越多,对应的servlet就越多。以上述业务中增加和删除业务为例:

@WebServlet("/add.do")
public class AddServlet extends ViewBaseServlet {

    private FruitDAO fruitDAO = new FruitDAOImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        String fname = request.getParameter("fname");
        Integer price = Integer.parseInt(request.getParameter("price")) ;
        Integer fcount = Integer.parseInt(request.getParameter("fcount"));
        String remark = request.getParameter("remark");

        Fruit fruit = new Fruit(0,fname , price , fcount , remark ) ;

        fruitDAO.addFruit(fruit);

        response.sendRedirect("index");

    }
}
@WebServlet("/del.do")
public class DelServlet extends ViewBaseServlet {
    private FruitDAO fruitDAO = new FruitDAOImpl();
    @Override
    public void doGet(HttpServletRequest request , HttpServletResponse response)throws IOException, ServletException {
        String fidStr = request.getParameter("fid");
        if(StringUtil.isNotEmpty(fidStr)){
            int fid = Integer.parseInt(fidStr);
            fruitDAO.delFruit(fid);

            //super.processTemplate("index",request,response);
            response.sendRedirect("index");
        }
    }
}

解决方案:两个servlet重写了doGet方法,在doGet中进行相关操作,我们可以看到,两个servlet的url是不一样的,即@WebServlet(“/add.do”)和@WebServlet(“/del.do”)。那么可以根据路径参数不同,设置一个operate参数,这个参数由前台传入,

<input type="hidden" name="operate" value="add"/>

发送给服务器,服务器用来判断(条件判断)进入增删改查哪个方法。

 @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        request.setCharacterEncoding("UTF-8");

        String operate = request.getParameter("operate");
        if(StringUtil.isEmpty(operate)){
            operate = "index" ;
        }

        switch(operate){
            case "index":
                index(request,response);
                break;
            case "add":
                add(request,response);
                break;
            case "del":
                del(request,response);
                break;
            case "edit":
                edit(request,response);
                break;
            case "update":
                update(request,response);
                break;
            default:
                throw new RuntimeException("operate值非法!");
        }

    }

**存在问题:**但是使用条件判断也存在问题,随着业务增加,条件判断会越来越多,这也不符合修改封闭原则。
解决方案:我们可以规定方法名称和operate参数相同,这样就可以用反射的方法来根据operate进入不同的方法了,即使增加业务,也不用修改代码。

 @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        request.setCharacterEncoding("UTF-8");

        String operate = request.getParameter("operate");
        if(StringUtil.isEmpty(operate)){
            operate = "index" ;
        }
        try {
            Method method = this.getClass().getDeclaredMethod(operate, HttpServletRequest.class, HttpServletResponse.class);
            if (method != null) {
                method.invoke(this, request, response);
                return;
            }
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        throw new RuntimeException("Invalid operate.");

    }

这样,即使增加新的访问方法,也不用修改这一块代码。
存在问题:但是这样还是存在问题的,如果系统还有一个user相关业务,那我们也要在user里面写一套相同逻辑的反射代码,来处理这一块。
解决方案:因此我们可以继续向上提取,设计了中央控制器类:DispatcherServlet。

二、DispatcherServlet主要功能

中央控制器需要完成功能
在这里插入图片描述 1)从url中提取servletPath : /fruit.do -> fruit
2)根据fruit找到对应的组件:FruitController , 这个对应的依据我们存储在applicationContext.xml中
<bean id=“fruit” class="com.atguigu.fruit.controllers.FruitController/>
通过DOM技术我们去解析XML文件,在中央控制器中形成一个beanMap容器,用来存放所有的Controller组件
3)根据获取到的operate的值定位到我们FruitController中需要调用的方法

三、代码实现

package com.lucky.myssm.myspringmvc;

import com.lucky.myssm.io.BeanFactory;
import com.lucky.myssm.io.ClassPathXmlApplicationContext;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.servlet.ServletContext;
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 javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@WebServlet("*.do")
public class DispatcherServlet extends ViewBaseServlet {

    private BeanFactory beanFactory ;

    // 生命周期 实例化 初始化 服务 销毁
    public DispatcherServlet() {

    }

    @Override
    public void init() throws ServletException {
        super.init();
        beanFactory = new ClassPathXmlApplicationContext();

    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置编码
        request.setCharacterEncoding("UTF-8");
        // 假设url http://localhost:8080/pro10/hello.do
        String servletPath = request.getServletPath();
        // /hello.do
        // 通过字符串截取获取 hello
        int lastDot = servletPath.lastIndexOf(".do");
        servletPath = servletPath.substring(1, lastDot);
        // 获取到了hello
        System.out.println(servletPath);
        // 根据service path 获取controller对象
        Object controller = beanFactory.getBean(servletPath);
        // 找到hello对应的controller

        // 调用controller里面对应operate的方法
        request.setCharacterEncoding("UTF-8");
        String operate = request.getParameter("operate");
        if (Objects.isNull(operate) || "".equals(operate)) {
            operate = "index";
        }
        try {
            // 获取名称为operate, 参数为request和response的方法
            Method[] methods = controller.getClass().getDeclaredMethods();
            for (Method method : methods) {
               if (operate.equals(method.getName())) {
                   // 获取请求参数
                   Parameter[] parameters = method.getParameters();
                   Object[] paramValues = new Object[parameters.length];
                   for (int i = 0; i < paramValues.length; i++) {
                       // 获取参数名称
                       Parameter param = parameters[i];
                       String paramName = param.getName();
                       if ("request".equals(paramName)) {
                           paramValues[i] = request;
                       } else if ("reponse".equals(paramName)) {
                           paramValues[i] = response;
                       } else if ("session".equals(paramName)) {
                           paramValues[i] = request.getSession();
                       }
                       else {
                           // 跟据name去request获取参数值
                           String paramValue = request.getParameter(paramName);
                           // 如果参数不是string,那么就需要强转
                           if (paramValue != null) {
                               if ("java.lang.Integer".equals(param.getType().getName())) {
                                   paramValues[i] = Integer.parseInt(paramValue);
                               }
                               else {
                                   paramValues[i] = paramValue; // 这个直接获取的是string
                               }
                           } else {
                               paramValues[i] = null;
                           }

                       }
                   }

                   method.setAccessible(true);
                   Object retVal = method.invoke(controller, paramValues);
                   // 视图处理
                   if (Objects.nonNull(retVal)) {
                       String retValStr = (String)retVal;
                       if (retValStr.startsWith("redirect:")) {
                           // 把redirect:后面拿过来
                           String redirectPath = retValStr.substring("redirect:".length());
                           response.sendRedirect(redirectPath);
                       } else {
                           super.processTemplate(retValStr, request, response);
                       }
                   }
//                   else {
//                       throw new RuntimeException("Invalid operate!");
//                   }
               }
            }
        } catch (IllegalAccessException|InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}

获取Controler以及Controler中相关属性装配,才用application.xml配置,相当于简单实现一个IOC容器。
xml文件配置

<?xml version="1.0" encoding="utf-8"?>

<beans>
    <!-- 这个bean标签的作用是 将来servletpath中涉及的名字对应的是fruit(前面的id,这就和dispatch对应起来了),
    那么就要FruitController这个类来处理 -->
    <bean id="fruitDAO" class="com.lucky.fruit.dao.impl.FruitDAOImpl"/>
    <bean id="fruitService" class="com.lucky.fruit.service.impl.FruitServiceImpl">
        <property name="fruitDAO" ref="fruitDAO"/>
    </bean>
    <bean id="fruit" class="com.lucky.fruit.controllers.FruitController">
        <property name="fruitService" ref="fruitService"/>
    </bean>
</beans>

获取controller以及设置controller属性。

package com.lucky.myssm.io;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class ClassPathXmlApplicationContext implements BeanFactory {

    private Map<String,Object> beanMap = new HashMap<>();

    public ClassPathXmlApplicationContext(){
        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 beanClass = Class.forName(className);
                    //创建bean实例
                    Object beanObj = beanClass.newInstance() ;
                    //将bean实例对象保存到map容器中
                    beanMap.put(beanId , beanObj) ;
                    //到目前为止,此处需要注意的是,bean和bean之间的依赖关系还没有设置
                }
            }
            //5.组装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");
                    NodeList beanChildNodeList = beanElement.getChildNodes();
                    for (int j = 0; j < beanChildNodeList.getLength() ; j++) {
                        Node beanChildNode = beanChildNodeList.item(j);
                        if(beanChildNode.getNodeType()==Node.ELEMENT_NODE && "property".equals(beanChildNode.getNodeName())){
                            Element propertyElement = (Element) beanChildNode;
                            String propertyName = propertyElement.getAttribute("name");
                            String propertyRef = propertyElement.getAttribute("ref");
                            //1) 找到propertyRef对应的实例
                            Object refObj = beanMap.get(propertyRef);
                            //2) 将refObj设置到当前bean对应的实例的property属性上去
                            Object beanObj = beanMap.get(beanId);
                            Class beanClazz = beanObj.getClass();
                            Field propertyField = beanClazz.getDeclaredField(propertyName);
                            propertyField.setAccessible(true);
                            propertyField.set(beanObj,refObj);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Override
    public Object getBean(String id) {
        return beanMap.get(id);
    }
}

SpringMVC请求处理流程:DispatcherServlet工作原理 DispatcherServlet是SpringMVC框架的核心,它扮演着前端控制器(Front Controller)的角色,是整个请求处理流程的调度中心。作为一个标准的Servlet,DispatcherServlet继承自HttpServlet,遵循Servlet生命周期,在Web容器启动时初始化并加载SpringMVC相关配置。它的主要职责是接收HTTP请求,并根据请求信息将其分发给相应的处理器(Handler),随后协调视图解析器(ViewResolver)渲染结果,最终返回响应给客户端。 阅读详情

相关推荐

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月12日-生产期间维护用的双重隔离

生产期间维护用的双重隔离。该程序用于准备将一个或多个双工位设置为维护状态,同时SABRE 3D/3DxT/3D Scimitar保持生产运行。其目的是在不中断生产的情况下将双工位与运行中的设备隔离。

weixin_46735260的博客 574

Java架构直通车——DispatcherServlet详解

文章目录引入DispatcherServlet处理流程DispatcherServlet与WebApplicationContext处理流程DispatcherServlet源码分析init()service()destroy() 前文介绍了Java架构直通车——理解Tomcat架构设计,我们知道Tomcat实际上就是Servlet容器, 引入 Spring MVC框架是围绕DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时

No_Game_No_Life_的博客 1523

中小团队必看!用Harbor+Jenkins打造轻量级K3S交付流水线(含成本优化方案)

本文为中小团队详细介绍了如何利用K3S、Harbor与Jenkins构建一套高性价比的自动化交付流水线。内容涵盖单节点K3S集群的效能配置、Harbor镜像仓库的磁盘空间优化、Jenkins共享库实现流水线复用,并提供了完整的实战案例与成本优化方案,帮助团队以较低成本快速落地高效的自动化部署。

weixin_29223603的博客 503

Spring MVC官方文档学习笔记(二)之DispatcherServlet(转)

(1) 前面已经提过了,DispatcherServlet会将实际的请求处理过程委托给那些特殊的组件来干,而它本身起一个统一分配与调度的作用,这些特殊的组件已经由Spring提供了默认的实现,但同时Spring也允许我们自己实现替换它们,下表列出了由 DispatcherServlet检测到的这些特殊的Bean类型。针对请求搜索恰当的handler,如果搜索到的话,与该handler相关的执行链(HandlerExecutionChain)将会被执行,以准备渲染模型(model)

朱塔山的博客 2086

modbus-esp8266库深度解析:工业级Modbus协议栈实现

Modbus是一种广泛应用于工业自动化领域的通用串行通信协议,其核心在于标准化的功能码、寄存器模型与帧结构设计。基于RTU、ASCII和TCP三种传输变体,Modbus协议通过主从架构实现设备间可靠数据交互,具备低开销、高兼容性与强实时性等技术价值。在边缘计算与工业物联网场景中,它被广泛用于PLC通信、传感器数据采集、HMI集成及远程固件升级(FOTA)等关键任务。针对ESP8266/ESP32等Wi-Fi微控制器平台,modbus-esp8266库提供了完整协议栈支持,涵盖多实例并发、回调驱动架构、零拷贝

weixin_42315569的博客 349

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 254

java的dispatcher_Springmvc DispatcherServlet原理及用法解析

DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。DispatcherServlet 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:文件上传解析,如果请求类型是 multipart 将通过 MultipartResolv...

weixin_35275073的博客 531

win 11bitlocker恢复密匙一般情况的解决方式(这里指的是你现在使用的微软账户一直没有变更过)

本来没有打算写这一篇解决帖子的,但是最近好多微博的友友都在私我询问解决方法,孩子虽然很热心,但是真的回复不过来了,打字太累了,这里给大家简单指个路,希望能够对大家有所帮助。 当时出现这个问题的时候,一搜网上的解决方法都是重装系统什么的,真是吓死孩子啦。后来去微软的官网倒腾了半天解决了问题。其实只要你没有改过微软账户,你可以直接试试我这个方法,大概三到五分钟解决问题吧。 和我情况不一样的也可以参考一下贴吧里一些大佬的分享,或者实在着急我感觉去淘宝上找个解决也不是未尝不可。 出现问题: 解决方案: 直接去微软

zhiqingxue的博客 2万+

Spring提供的DispatcherServlet是怎么调用我们的Controller里的业务接口的?

前言 在分析问题前,先看下Tomcat的架构图,有助于后面看代码: 这里可以看出一个Tomcat就是一个Server,一个Server下会有多个Service,Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳,不负责具体功能),而Container(也叫engine)下又有多个Host,每个Host下对应多个Context,Context下才是我们的Servlet,Tomcat为了使整个架构灵

肆頭的博客 1499

AOI检测总误判?五大常见问题与实战解决方案

通过对图像质量、检测程序、外界干扰、算法优化以及设备维护和校准的全面把控,企业可以有效降低误判率,提升AOI检测的准确性和可靠性,为工业生产提供更有力的质量保障。表现描述:在AOI检测时,元器件字符因印刷颜色深浅、模糊或受到灰尘干扰等差异,再加上元件库参数未根据实际生产优化,会使系统误将合格元件判定为不合格,严重影响生产效益和产品质量。优化元件库:着重检测关键差异字符,如型号编码等关键信息,剔除不必要字符的检测项,减少干扰,专注于关键识别的准确性。检测时,根据物料信息动态更新检测参数,使系统适应物料变化。

ALeader_AOI的博客 3494

YTM32B1M SDK解析31:软件I2C驱动详解

YTM32B1M微控制器软件I2C驱动解析 本文详细介绍了YTM32B1M微控制器中通过GPIO引脚模拟I2C总线的软件实现方案。核心内容包括: 驱动架构:采用swi2c_config_t配置结构体和swi2c_state_t状态结构体管理I2C参数 功能接口:提供初始化、数据传输(主/从模式)、底层控制等API 应用示例:包含基本配置、EEPROM读写、传感器数据采集、总线扫描等典型应用场景 优化建议:给出引脚选择、时序配置、错误处理等方面的最佳实践 该驱动在硬件I2C资源不足时提供可靠替代方案,支持标准

VehSwHwDeveloper的博客 158

【JavaEE进阶】 拦截器(DispatcherServlet)源码简介

上一篇博客我们使用了拦截器,那么拦截器是如何实现拦截的呢?接下来我们将从源码来看一下是如何实现拦截的。适配器模式,也叫包装器模式.将⼀个类的接⼝,转换成客⼾期望的另⼀个接⼝,适配器让原本接⼝不兼容的类可以合作⽆间.简单来说就是⽬标类不能直接使⽤,通过⼀个新类进⾏包装⼀下,适配调⽤⽅使⽤.把两个不兼容的接⼝通过⼀定的⽅式使之兼容.比如下⾯两个接⼝,本⾝是不兼容的(参数类型不⼀样,参数个数不⼀样等等可以通过适配器的⽅式,使之兼容。

m0_71731682的博客 2297

R语言 Chow Test

Chow 测试用于测试不同数据集上的两个不同回归模型中的系数是否相等。 该测试通常用于计量经济学领域,使用时间序列数据来确定数据在某个时间点是否存在结构性中断。 本教程提供了如何在 R 中执行 Chow 测试的分步示例 首先,我们将创建一些假数据: #create data data <- data.frame(x = c(1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13,

Mrrunsen的博客 1946

02【SpringMVC基础】使用SpringMVC搭建第一个javaweb项目

本文尤为枯燥,请同步观看:【SpringMVC】项目具体请求流程 目录1.概念2.搭建一个简单的javaweb项目1).新建一个动态web项目2).导入springMVC所需要的jar包3).配置DispatcherServlet3.5).这里插入一点内容:4).配置处理器适配器SimpleControllerHandlerAdapter5).编写处理器Handler6).配置处理器handle...

宇某的博客 1557

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JavaWeb开发 —— 请求响应

请求HttpServletRequest和响应HttpServletResponse概述、请求中六大参数形式以及响应@ResponseBody和统一响应结果方式

hdakj22的博客 1625

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SpringBootWeb请求响应(day05)

方法注解、类注解Controller 方法上/类上将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为 JSON 格式响应说明:@RestController = @Controller + @ResponseBody/*** 测试响应数据*/addr.setProvince("广东");addr.setCity("深圳");addr.setProvince("广东");addr.setCity("深圳");addr2.setProvince("陕西");

用来自己学习,复习 998

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java:SpringBootWeb请求响应

用java编写的服务器端程序客户端发送请求至服务器服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器服务器将响应返回给客户端。

qq_55630615的博客 1584

Spring MVC框架的使用

在sayHello()方法中,我们将一个名为“message”的属性添加到模型中,并返回一个名为“hello”的逻辑视图名称。在Spring MVC中,模型表示应用程序的数据和业务逻辑。然而,使用Spring MVC框架也需要一定的学习成本,并且可能会导致一定的性能损失。因此,在选择框架时,需要权衡其优缺点,并根据具体的需求和情况做出选择。Spring MVC是一种基于MVC模式的Java Web框架,它提供了一组工具和API,可以帮助开发人员更轻松地构建Web应用程序。

weixin_70320260的博客 274

Spring MVC教程第一篇

Spring MVC教程第一篇

qq_25073223的博客 168

SpringMVC入门

MVC(Model-View-Controller)模式是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。MVC可对程序的后期维护和扩展提供方便,也为程序某些部分的重用提供了方便。MVC 设计模式并不是Java Web应用的专属,几乎现在所有 B/S 结构的软件都采用了MVC 设计模式:在早期的 Java Web 开发中,主要是JSP+Java Bean模式,如图所示。

qq_73686203的博客 195

DispatcherServlet

DispatcherServlet

蔡林浩的博客 601

SSM3.2【Spring:SpringMVC简介】

SpringMVC概述 传统java web SpringMVC web SpringMVC快速入门 实现步骤(如上图) 代码实现 pom.xml中需要配置的依赖 <!--spring坐标--> <dependency> <groupId>org.springframework</groupI...

yubaby 107

SpringMVC配置和基本原理

Java web的发展历史 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是:JSP+JavaBean的模式,它的核心是Jsp页面,在这个页面中,Jsp页面负责整合页面和JavaBean(业务逻辑),而且渲染页面,它的基本流程如下: 2.Model II开发模式 在Model II的模式下。利用jsp页面、servlet和JavaBean组件分工协作共同完成系统的所有任务。其中jsp负责数据显示逻辑任务,servlet负责程序的流程控制任务,Jav

qq_57381370的博客 224

学习JavaWeb时候学习的一个DispatcherServlet.....

1.写一个类继承serlve 1.1类中先获取请求的URI(请求地址) 就是找到那个请求中对应的方法. /** * 根据uri获取截取action * @param requestURI * @return */ private String getActionName(String requestURI) { //1.获取"/"的最后索引,最后一个斜杠就是action int index = requestURI.lastIn

y736456的博客 284

《从零开始写Javaweb框架》知识点--dispatcherServlet

之前学习springmvc时,其springmvc的原理,都是围绕着DispatcherServlet,借用别人的图例与分析 SpringMVC流程 1、  用户发送请求至前端控制器DispatcherServlet。 2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、  处理器映射器找到具体的处理器(可以

qq_28384753的博客 773

javaweb之Thymeleaf,mvc,reflect,dispatcherServlet,controller超详细内容拆解

Thymeleaf,mvc,reflect,dispatcherServlet,controller

小颖同学 156
上一篇: 【JavaWeb】会话跟踪技术Session
下一篇: 【JavaWeb】Filter过滤器
Aiwoniulucky
博客等级 码龄5年 17粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值