springmvc 基础配置和原理

1、springmvc原理:
springmvc工作流程
图一:
在这里插入图片描述

图二:
在这里插入图片描述
2、项目结构图:
在这里插入图片描述
开始学习spring的时候,很好奇为什么明明在项目里找不到相应的index.jsp,但是每回都是自动访问index.jsp;后来经过测试和百度,终于发现了原来在springmvc中默认第一个访问的页面是index.jsp页面,其默认内容为:

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

3、开始配置
根据图二,按照步骤一步一步的走。
(1):用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,即 / 。故这里再web.xml中进行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <!--配置DispatchServlet:这是springmvc的核心-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatchServlet需要绑定spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--设置启动级别:1   即跟服务器一起启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--springmvc中过滤配置: /   /*
    /:匹配除了jsp之外的所有请求
    /* :匹配包括jsp的请求
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

(2):前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc-servlet.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。
springmvc-servlet.xml如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!--处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean name="/hello" class="com.pht.controller.Hellocontroller"/>


</beans>

(3)映射器会根据上面的:<bean name="/hello" class="com.pht.controller.Hellocontroller"/>来对Controller进行映射,找到处理类,处理类HelloController如下:(除了中间的业务代码和视图跳转,其他相当于模板了)

package com.pht.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class Hellocontroller implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();

        //业务代码,业务代码都有返回值,这里写了个result假装是返回值
        String result="assum return some thing......";
        mv.addObject("msg",result);

        //视图跳转
        mv.setViewName("view1");

        return mv;
    }
}

addObject在源代码中的定义:

public ModelAndView addObject(String modelName, Object modelObject)

此外,视图跳转部分的view1,即用于在视图解析器中进行拼接,最终拿到项目中的view1.jsp页面文件。
view1.jsp文件如下:(这里即页面中出现msg(上面的result))

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/9/4
  Time: 17:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

(4)HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。

(5)处理器会返回一个ModelAndView对象给HandlerAdapter
通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)。即处理类HelloController的返回值mv。

(6)前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析【第三步中的拼接】成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象
(7)返回视图对象到前端控制器。并视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值