[SpringMVC 01] SpringMVC原理

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了[SpringMVC 01] SpringMVC原理脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

SpringMVC


1. Servlet

导入的四个包:

servlet-api
jsp-api
spring-webmvc
jstl

2. SpringMVC

基于java实现的MVC轻量级web框架(可以把servlet等需要用到的bean注册到spring中,方便使用)

SpringMVC框架围绕一个DispatcherServlet的调度设计(做请求分发)

核心作用: 以前不同的业务有好多个servlet,在用户和servlet中间加一层,实现请求的转发

原理:

req进来的时候,先到Front controller, 相当于DispatcherServlet,用来分发请求;controller返回的结果是ModelandView, 然后Front controller发给View template来渲染,再返回Front controller然后return resp。

[SpringMVC 01] SpringMVC原理

3. Hello,SpringMVC

1. 以前的MVC构架:

  • 一个需求,写一个servlet(实现doGet);在web.xml中注册servlet映射servlet-mapping

  • 每一个需求都需要这么写(web.xml中注册很多个servlet)

2. SpringMVC构架:

  • web.xml中注册DispatcherServlet(其中有init-param标签包括spring-servlet.xml的位置和load-on-startup启动级别属性),并对其映射。老一套的
  • resource下添加spring-servlet.xml配置文件(spring的头文件,用于注册servlet,而文件已经添加到了上一步的配置文件中);其中配置三个bean:BeanNameUrlHandlerMapper SimpleControllerHandlerAdapter InternalResourceViewResolver,分别是:处理映射器,处理器适配器,视图解析器
  • HelloController类,实现Controller接口,和返回值为ModelAndView的handleRequest方法,其中new一个ModelAndView类,用mv.addObject方法放置键值对,mv.setViewName()设置视图名称,并返回视图
  • spring-servlet.xml中配置HelloController类的bean
  • 写访问页面,并访问(${})来取键中的值。

(遇到的问题:当maven项目是后添加的web支持时,需要自己配置tomcat中的lib依赖包,否则tomcat中没有lib依赖包报错404)原因:WEB-INF的默认位置不同,后添加的支持在根目录下

4. SpringMVC的执行原理

[SpringMVC 01] SpringMVC原理

流程:

  1. DispatcherServlet是整个SpringMVC的控制中心, 当用户发出请求:
    • 把url拆分为三个部分:总体:请求位于服务器域名上的web站点的hello控制器
    • 服务器域名
    • springMVC部署在服务器上的web站点名(web.xml中注册的映射)
    • 控制器的具体名称(spring中注册的控制器bean的id)
  2. HandlerMapping: 由DispatcherServlet自动调用, 根据请求url查找Handler;
  3. HandlerExecution 表示具体的Handler, 根据url查找控制器(其实就是HandlerMapping找sping中controller的id)
  4. HandlerExecution把解析后的学习传递给DispatcherServlet。
  5. HandlerAdapter表示处理器适配器,按照特定的规则执行Handler
  6. 具体的Controller执行(真正自己写的部分
  7. Controller返回一个ModelAndView(带数据和视图:数据就是模型、实体类,视图就是页面)给HandlerAdapter
  8. HandlerAdapter把东西返回给DispatcherServlet;
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析传递的逻辑视图名
  10. 将解析的结果返回给DispatcherServlet
  11. DispatcherServlet根据解析器解析的视图,调用具体的视图;
  12. 呈现给用户

其中,在web.xml中配置DispatcherServlet, 在spring-servlet.xml 中配置HandlerMapping, HandlerAdapter和ViewResolver。

主要分为三步:前端控制器接受用户的请求并拦截,根据对应的请求找到对应的Controller处理器,处理器调用业务层并返回信息给前端控制器,然后前端控制器调用视图解析器找到对应视图并将数据渲染

[SpringMVC 01] SpringMVC原理

5. Hello again(原理版本)

  1. 首先在web.xml中配置DispatcherServlet

DispatcherServlet需要截取所有的请求,但不需要截取.jsp, 所以在配置url时,使用/表示只截取请求,不截取jsp;

使用/*表示截取请求和.jsp。

<?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">
<!--配置DispatcherServlet, 是SpringMVC的核心,请求分发器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--    绑定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>
  1. 配置spring.xml, 包括Mapping、Adapter、ViewResolver(需要配置prefix和suffix)

    最后再注册controller,id是用户要访问的地址

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <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">
<!--        获取到视图名之后来解析视图,添加前缀和后缀获得jsp页面的位置-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="/hello" class="com.roy.controller.HelloController"/>

</beans>
  1. 写Controller.java,实现Controller接口,返回ModelAndView类
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
//        写业务
        mv.addObject("msg", "Hello,SpringMVC");
        mv.setViewName("test");
        return mv;
    }
}
  1. 写test.jsp视图
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 <%--获取数据--%>   
${msg}
</body>
</html>

脚本宝典总结

以上是脚本宝典为你收集整理的[SpringMVC 01] SpringMVC原理全部内容,希望文章能够帮你解决[SpringMVC 01] SpringMVC原理所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: