SpringMVC入门就这么简单(二)

简介: SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架

创建SpringMVC控制器

我们在hello.xml配置文件中把SpringMVC的控制器创建出来

<!--
        注册控制器
        name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
    -->
    <bean class="HelloAction" name="/hello.action"></bean>

访问

当我们在浏览器访问http://localhost:8080/hello.action的时候,Spring会读取到我们的访问路径,然后对比一下我们的配置文件中是否有配置/hello.action,如果有。那么就交由对应的Action类来进行处理。Action类的业务方法将其请求输出到hello.jsp页面上。

微信图片_20220411234423.png


SpringMVC工作流程

微信图片_20220411234428.jpg

  • 用户发送请求
  • 请求交由核心控制器处理
  • 核心控制器找到映射器,映射器看看请求路径是什么
  • 核心控制器再找到适配器,看看有哪些类实现了Controller接口或者对应的bean对象
  • 将带过来的数据进行转换,格式化等等操作
  • 找到我们的控制器Action,处理完业务之后返回一个ModelAndView对象
  • 最后通过视图解析器来对ModelAndView进行解析
  • 跳转到对应的JSP/html页面

上面的工作流程中,我们是没有讲过映射器,适配器,视图解析器这样的东西的。但是SpringMVC的环境还是被我们搭建起来了。

下面就由我来一个一个来介绍他们是有什么用的!

映射器

我们在web.xml中配置规定只要是.action为后缀的请求都是会经过SpringMVC的核心Servlet

当我们接收到请求的时候,我们发现是hello.action,是会经过我们的核心Servlet的,那么核心Servlet就会去找有没有专门的Action类来处理hello.action请求的

也就是说:映射器就是用于处理“什么样的请求提交给Action”处理【默认可省略的】…..

其实我们在快速入门的例子已经配置了:name属性就是规定了hello.action到HelloAction控制器中处理

<!--
        注册控制器
        name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
    -->
    <bean class="HelloAction" name="/hello.action"></bean>

映射器默认的值是这样的:

<!-- 注册映射器(handler包)(框架)【可省略】 -->
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       </bean>

当然了,上面我们在创建控制器的时候【也就是HelloAction】可以不使用name属性来指定路径,可以使用我们的映射器来配置。如以下的代码:

<bean class="HelloAction" id="helloAction"></bean>
    <!-- 注册映射器(handler包)(框架) -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.action">helloAction</prop>
            </props>
        </property>
    </bean>

当我们需要多个请求路径都交由helloAction控制器来处理的话,我们只要添加prop标签就行了!

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.action">helloAction</prop>
                <prop key="/bye.action">helloAction</prop>
            </props>
        </property>
    </bean>

微信图片_20220411234434.png


适配器

当我们映射器找到对应的Action来处理请求的时候,核心控制器会让适配器去找该类是否实现了Controller接口【默认可省略的】

也就是说:适配器就是去找实现了Controller接口的类

<!-- 适配器【可省略】 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

视图解析器

我们把结果封装到ModelAndView以后,SpringMVC会使用视图解析器来对ModelAndView进行解析。【默认可省略的】

也有一种情况是不能省略的。我们在快速入门的例子中,将结果封装到ModelAndView中,用的是绝对真实路径!如果我们用的是逻辑路径,那么就必须对其配置,否则SpringMVC是找不到对应的路径的。

那什么是逻辑路径呢???我们在Struts2中,返回的是"success"这样的字符串,从而跳转到success.jsp这样的页面上。我们就可以把"success"称作为逻辑路径

在Action中返回hello,hello是一个逻辑路径。需要我们使用视图解析器把逻辑路基补全

public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        //跳转到hello.jsp页面。
        modelAndView.setViewName("hello");
        return modelAndView;
    }

如果不使用视图解析器的话,那么就会找不到页面:

微信图片_20220411234439.png

因此,我们需要配置视图解析器

<!--
    如果Action中书写的是视图逻辑名称,那么视图解析器就必须配置
    如果Action中书写的是视图真实名称,那么视图解析器就可选配置
-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 路径前缀 -->
        <property name="prefix" value="/"/>
        <!-- 路径后缀 -->
        <property name="suffix" value=".jsp"/>
        <!-- 前缀+视图逻辑名+后缀=真实路径 -->
    </bean>

目录
相关文章
|
SQL 安全 网络协议
网络安全产品之认识漏洞扫描设备
为了保障系统的安全性,需要及时发现和修复漏洞。这可以通过漏洞扫描设备等工具进行自动化检测和修复,同时也可以加强安全意识和培训,提高人员的安全防范能力。虽然无法完全避免漏洞的存在,但通过采取有效的措施可以大大减少漏洞的数量和危害程度,保障系统的安全性和稳定性。本文让我们一起来认识漏洞扫描设备。
775 0
|
4月前
|
NoSQL Dubbo 应用服务中间件
一条IM消息的分布式之旅:从发送到已读
一条消息从点击“发送”到对方收到,背后是分布式系统的精密协作:经WebSocket接入→Center事务落库→Redis查在线状态→定向投递→ACK确认→已读回执,全程保障可靠性与实时性。(238字)
766 116
|
测试技术 Docker 容器
自动化质量评估维度
上篇文章讲了下关于终端自动化的一个探索《终端自动化测试探索之路》,今天来聊聊关于自动化质量评估的维度,包括UI和接口。
1023 0
|
监控 搜索推荐 API
《巧用拼多多 API,精准分析拼多多店铺流量转化密码》
本文详解如何利用拼多多API实现店铺流量转化分析,通过数据驱动优化运营策略。内容涵盖API接入方法、流量与转化率计算模型、优化策略及实战案例,助力商家精准提升销售转化与运营效率。
企业多模型协同方案,为什么越来越绕不开 Claude
企业多模型协同正从“可选”变为“必然”——因业务需求多元,单一模型难覆盖全部场景。Claude凭借长上下文、代码与文档理解优势被纳入协同体系,但关键在统一接入(如147API),避免调用混乱、成本分散与治理失序。协同不是堆模型,而是科学分工与架构治理。
|
机器学习/深度学习 传感器 算法
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
749 0
|
canal 搜索推荐 关系型数据库
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中(三)
docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中
676 0
|
网络协议
iperf3的常用命令样例
iperf3是一个用于测量网络带宽的工具,以下是一些常用的iperf3命令样例: 1. 在服务器模式下启动iperf3: ``` iperf3 -s ``` 2. 在客户端通过TCP连接测试带宽: ``` iperf3 -c <服务器IP地址> ``` 3. 在客户端通过UDP连接测试带宽: ``` iperf3 -c <服务器IP地址> -u ``` 4. 指定连接端口号: ``` iperf3 -c <服务器IP地址> -p <端口号> ``` 5. 设置测试时间: ``` iperf3 -c <
3369 0
求100之内的素数
【6月更文挑战第18天】求100之内的素数。
165 1
|
Python
tkinter之StringVar
tkinter之StringVar
309 3