Spring MVC官方文档学习笔记(一)之Web入门

这篇具有很好参考价值的文章主要介绍了Spring MVC官方文档学习笔记(一)之Web入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注: 该章节主要为原创内容,为后续的Spring MVC内容做一个先行铺垫

1.Servlet的构建使用

(1) 选择Maven -> webapp来构建一个web应用

Spring MVC官方文档学习笔记(一)之Web入门

(2) 构建好后,打开pom.xml文件,一要注意打包方式为war包,二导入servlet依赖,如下

<!-- 打war包 -->
<packaging>war</packaging>

<!-- 导入servlet依赖 -->
<dependencies>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

(3) 替换webapp/WEB-INF/web.xml文件为如下内容,采用Servlet 3.1版本

<?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_3_1.xsd"
         version="3.1">
  
</web-app>

(4) 在main目录下,新建java目录和resources目录,并在java目录下新建包,最终项目目录结构如下

Spring MVC官方文档学习笔记(一)之Web入门

(5) 编写一个简单的servlet如下

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("example...");
    }
}

(6) 有了servlet后,我们得让服务器知道哪个请求要交给哪个servlet处理,因此还需要配置web.xml如下

<!-- web.xml中 -->
<web-app ...>
    <!-- 配置servlet,给指定的servlet取一个名字 -->
    <servlet>
        <servlet-name>exampleServlet</servlet-name>
        <servlet-class>cn.example.springmvc.boke.servlet.ExampleServlet</servlet-class>
    </servlet>
    
    <!-- 配置哪个请求交由哪个servlet来进行处理,这里为了方便使用 / ,即拦截所有的请求都交由exampleServlet来处理 -->
    <servlet-mapping>
        <servlet-name>exampleServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

(7) 然后,为了能够在网页上访问,我们得把这个项目部署到tomcat服务器中

首先,在URL栏中,添加上项目名称,此处为springmvc

Spring MVC官方文档学习笔记(一)之Web入门

然后,在Deployment中添加我们的项目

Spring MVC官方文档学习笔记(一)之Web入门

最后,注意 Application Context 中的值,应与前面在URL栏中添加的项目名称相同,此处均为springmvc

Spring MVC官方文档学习笔记(一)之Web入门

(8) 最后,启动tomcat服务器,在浏览器上输入 http://localhost:8080/springmvc/example ,如果能看到 example... 字符串,则说明项目配置成功

2.基于web.xml,整合Spring与Servlet

(1) 现在,web应用已经搭建好了,但是我们希望能够在该应用中使用Spring容器,该怎么办呢? 在之前的非web环境中,我们都是在main方法中创建ioc容器(如 new ClassPathXmlApplicationContext()),然后直接使用的,但是现在没有了main方法,该由谁来创建ioc容器呢? 答案就是由我们的web容器,可以在web应用初始化的时候来帮助我们创建,但创建好之后,我们该怎么获取到ioc容器呢? Servlet规定了4大作用域,分别为page域(PageContext),当前页面有效; request域(HttpServletContext),一次请求内有效; session域(HttpSession),一次会话内有效; application域(ServletContext),在当前整个web应用内有效,因此我们可以将创建好的ioc容器直接放到application域中,这样在任何位置,我们都能拿到ioc容器进行使用,具体示例如下

首先导入相关的Spring依赖包

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.22.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.22.RELEASE</version>
  </dependency>
</dependencies>

接着,修改我们的代码,配置一个普通的bean

//创建一个普通的java类
public class ExampleService {
    public String get() {
        return "user";
    }
}

//然后,在resources目录下新建一个springmvc.xml,并将上面的ExampleService注册为一个bean
<beans ....>
    <bean class="cn.example.springmvc.boke.service.ExampleService"></bean>
</beans>

接下来,我们就得让web容器来为我们创建ioc容器了,具体由谁来创建呢? Servlet有三大核心组件,即Servlet,用于处理请求;Filter,过滤器,用来拦截或修改请求;Listener,监听器,用于监听某个事件。显然,这里使用Listener最合适,那就由Listener来为我们创建ioc容器

<!-- web.xml中 -->
<!-- 当然,具体的Listener实现类代码是不需要由我们来写的,因为Spring早已内置了一个监听器(ContextLoaderListener),就是用于在基于web.xml的配置中来初始化ioc容器 -->
<web-app ....>
   <!-- ContextLoaderListener实现了ServletContextListener,而这个ServletContextListener就是用于监听web应用的生命周期的,当web容器启动或终止web应用的时候,会触发ServletContextEvent事件,而该事件就会由ServletContextListener来处理,因此ContextLoaderListener就会在web应用启动的同时创建ioc容器,加载配置文件,具体可详见源码 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 注意:如果未指定配置文件的路径,那么默认会寻找/WEB-INF/applicationContext.xml配置文件,如果这个配置文件找不到,启动时就会报错
    基于web.xml的配置所创建的ioc容器是基于xml配置的ioc容器(XmlWebApplicationContext),它会在容器启动的时候读取加载配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>exampleServlet</servlet-name>
        <servlet-class>cn.example.springmvc.boke.servlet.ExampleServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>exampleServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

现在ioc容器有了,而且被Spring以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为key放到了application域中,现在我们可以在任何地方被获取到它,如下所示

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取application域中的ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性值,即我们的ioc容器
        XmlWebApplicationContext ctx = (XmlWebApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
        //或者也可以使用Spring提供的工具类WebApplicationContextUtils来获取ioc容器,如下
        //XmlWebApplicationContext ctx = (XmlWebApplicationContext) WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
        //使用ioc容器,获取其中的bean
        ExampleService exampleService = ctx.getBean(ExampleService.class);
        resp.getWriter().write(exampleService.get());
    }
}

//最后,重新启动容器,访问 http://localhost:8080/springmvc/example,会发现页面上出现 user 字符串

当然,向上面这样每次都通过get方法获取,很麻烦,我们可以借助Spring提供的工具类,在Servlet初始化的时候对Servlet进行依赖注入,如下

@WebServlet(urlPatterns = "/example")
public class ExampleServlet extends HttpServlet {
    
    //使用@Autowired注解标注需要进行依赖注入的bean
    @Autowired
    private ExampleService exampleService;
    
    //Servlet初始化方法
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        //获取application域
        ServletContext servletContext = config.getServletContext();
        //使用Spring提供的自动注入工具类SpringBeanAutowiringSupport,直接进行依赖注入
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletContext);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println(exampleService.get());
    }
}

3.基于Servlet扩展接口,整合Spring与Servlet

(1) 在上一节中,我们将ioc的创建配置于web.xml中,但此外我们还可以利用java代码的方式来创建ioc容器,可通过Servlet 3.0提供的ServletContainerInitializer接口,来在web容器启动的时候为第三方组件提供初始化的机会(例如注册Servlet等),如果要使用ServletContainerInitializer接口,那么就必须要在项目或所其依赖的jar包中的/META-INF/services目录下创建一个名称为javax.servlet.ServletContainerInitializer 的文件,而这个文件的具体内容,就是ServletContainerInitializer实现类的全限定类名称,然后,借助java的SPI技术,web容器便会加载这些实现类,通常情况下,ServletContainerInitializer这个接口通常会配合@HandlesTypes注解一起使用,而这个@HandlesTypes注解的作用就是让web容器收集我们项目中所有所指定的类,然后将这些类作为ServletContainerInitializer的onStartup方法参数传入,这样,在web容器启动的时候,我们就可以拿到这些我们所需的类然后创建它们

当然,同上面web.xml中的ContextLoaderListener,Spring也提供了一个ServletContainerInitializer接口的实现类SpringServletContainerInitializer,来创建帮助我们简化ioc容器的创建,首先在spring-mvc jar包中,就定义了一个/META-INF/services/javax.servlet.ServletContainerInitializer文件,然后,在启动时,web容器便会加载这个文件,读取里面的内容,为SpringServletContainerInitializer这个类

Spring MVC官方文档学习笔记(一)之Web入门

由于在SpringServletContainerInitializer上有注解@HandlesTypes标注,而这个注解的值为WebApplicationInitializer,因此,在创建SpringServletContainerInitializer对象前,web容器会收集应用内所有WebApplicationInitializer接口的实现类,并将它们作为参数传递给onStartup方法中的webAppInitializerClasses,这样,在web容器启动时,我们就能初始化我们所指定的对象

Spring MVC官方文档学习笔记(一)之Web入门

总而言之,在应用启动时,web容器会调用ServletContainerInitializer实现类(这里为SpringServletContainerInitializer)中的onStartup方法,而这个onStartup方法中又调用了@HandlesTypes注解所指定的类或接口(此处为WebApplicationInitializer)的实现类中的onStartup方法,因此,我们可以编写一个WebApplicationInitializer的实现类,来创建ioc容器,不过,Spring已经为我们提供了一个实现了WebApplicationInitializer接口的抽象类AbstractContextLoaderInitializer,它里面已经封装好了大部分的逻辑(比如将ioc容器置于application域中等),而我们所需要做的仅仅就是创建一下ioc容器而已,如下

public class IocInit extends AbstractContextLoaderInitializer {
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        XmlWebApplicationContext ctx = new XmlWebApplicationContext();
        ctx.setConfigLocation("classpath:springmvc.xml");
        return ctx;
    }
}

此外,不要忘了注释掉web.xml中关于Spring的相关内容,否则会产生产生两个ioc容器

<web-app ....>
<!--    &lt;!&ndash; ContextLoaderListener实现了ServletContextListener,而这个ServletContextListener就是用于监听web应用的生命周期的,当web容器启动或终止web应用的时候,会触发ServletContextEvent事件,而该事件就会由ServletContextListener来处理,因此ContextLoaderListener就会在web应用启动的同时会创建ioc容器,加载配置文件,具体可详见源码 &ndash;&gt;-->
<!--    <listener>-->
<!--        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
<!--    </listener>-->

<!--    &lt;!&ndash; 注意:如果未指定配置文件的路径,那么默认会寻找/WEB-INF/applicationContext.xml配置文件,如果这个配置文件找不到,启动时就会报错-->
<!--    基于web.xml的配置所创建的ioc容器是基于xml配置的ioc容器(XmlWebApplicationContext),它会在容器启动的时候读取加载配置文件 &ndash;&gt;-->
<!--    <context-param>-->
<!--        <param-name>contextConfigLocation</param-name>-->
<!--        <param-value>classpath:springmvc.xml</param-value>-->
<!--    </context-param>-->

    <servlet>
        <servlet-name>exampleServlet</servlet-name>
        <servlet-class>cn.example.springmvc.boke.servlet.ExampleServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>exampleServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

最后,重启项目,输入http://localhost:8080/springmvc/example,看见user字符串则说明成功

4.Spring MVC

现在,我们将Servlet与Spring ioc容器整合到了一起,但如果我们需要处理新的请求的话,我们还得继承HttpServlet来编写新的Servlet,并将其配置到web.xml中,非常麻烦,因此,Spring变为我们提供了一个全新的框架 - Spring MVC来帮助我们进行开发文章来源地址https://www.toymoban.com/news/detail-439151.html

到了这里,关于Spring MVC官方文档学习笔记(一)之Web入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring AOP官方文档学习笔记(四)之Spring AOP的其他知识点

    1.选择哪种AOP (1) 使用Spring AOP比使用完整版的AspectJ更方便简单,因为不需要在开发和构建过程中引入AspectJ编译器以及织入器,如果我们只希望通知能够在Spring Bean上执行,那么选用Spring AOP就可以了,如果我们希望通知能够在不由Spring所管理的对象上执行,那么就需要使用AspectJ,如果

    2024年02月03日
    浏览(40)
  • Spring Web MVC入门

    (1)关于Java开发 🌟Java开发大多数场景是业务开发 比如说京东的业务就是电商卖货、今日头条的业务就推送新闻;快手的业务就是短视频推荐 (2) Spring Web MVC的简单理解 💗 Spring Web MVC:如何使用Spring去建网站 (我们知道既然Java是做业务开发就避免不了建网站) 💗 Spring Web MVC是

    2024年02月08日
    浏览(44)
  • 【Spring】快速入门Spring Web MVC

    Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为\\\"SpringMVC\\\"。 想要更好的理解SpringMVC,我们需要理解什么是MVC。 MVC 是 Model View Controller 的缩写,它是软件⼯程中的

    2024年02月08日
    浏览(47)
  • Spring Web MVC入门(1)

    定义:Spring Web MVC是基于Servlet构建的原始Web框架, 从一开始就包含在Spring框架中 .它的正式名称\\\"Spring Web MVC\\\"来自其源模块的名称(Spring-webmvc),但是它通常被称为\\\"Spring MVC\\\". 什么是Servlet? Servlet是一种实现动态页面的技术.准确地来讲 Servlet是一套Java Web开发的规范 ,或者是一套Java We

    2024年03月17日
    浏览(53)
  • Spring Web MVC入门(1)

    目录 一、什么是 Spring Web MVC? 二、MVC的定义 三、什么是Spring MVC? Spring Boot 和 Spring MVC的关系: 四、建立连接 1、@RequestMapping注解介绍 @RequestController的作用 2、@RequestMapping的使用 3、@RequestMapping是get还是post请求 (1)GET请求 (2)POST请求 (3)指定GET/POST方法类型 五、Postman的

    2024年04月27日
    浏览(34)
  • web server apache tomcat11-01-官方文档入门介绍

    整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。 同时也为从零手写实现 tomcat 提供一些基础和特性的思路。 minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。 web server apache tomcat11-01-官方文档入门介绍 web server apache tomcat11-02-setup 启动 we

    2024年04月16日
    浏览(67)
  • 【SpringMVC】Spring Web MVC入门(一)

    前面我们了解了什么是Spring,那么今天我将为大家分享一种在日常网站开发中使用非常广泛的框架——Spring Web MVC。 先来看看官方解释。 Spring Web MVC是Spring Framework提供的Web组件,它是一个MVC设计模式的框架,主要用于开发灵活、松散耦合的Web应用程序。它提供了模型-视图-控

    2024年02月05日
    浏览(44)
  • 【UnityShader入门精要学习笔记】第二章(3)章节答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (PS:章节答疑不是我答,是原作者对一些比较容易产生困惑的地

    2024年02月03日
    浏览(57)
  • 学习笔记-elstaciElasticSearch7.17官方文档

    特征 适用于所有 Elasticsearch API 的强类型请求和响应。 所有 API 的阻塞和异步版本。 在创建复杂的嵌套结构时,使用流畅的构建器和功能模式允许编写简洁但可读的代码。 通过使用对象映射器(例如 Jackson 或任何 JSON-B 实现)无缝集成应用程序类。 将协议处理委托给一个 h

    2024年02月14日
    浏览(47)
  • Flink|《Flink 官方文档 - 部署 - 概览》学习笔记

    学习文档:《Flink 官方文档 - 部署 - 概览》 学习笔记如下: 上图展示了 Flink 集群的各个构建(building blocks)。通常来说: 客户端获取 Flink 应用程序代码,将其转换为 JobGraph,并提交给 JobManager JobManager 将工作分配给 TaskManager,并在那里执行实际的算子操作 在部署 Flink 时,

    2024年01月19日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包