天天看点

2021-09-19 SpringMVC入门SpringMVC入门

文章目录

  • SpringMVC入门
    • 1 Spring集成web环境
      • 偶遇bug: 监听器启动失败
    • 2 SpringMVC简介
      • 2.1 SpringMVC简介
      • 2.2 SpringMVC入门步骤
      • 2.3 SpringMVC快速入门
      • 再遇bug:
    • 3 SpringMVC组件解析
      • 3.1 SpringMVC组件解析
        • SpringMVC相关组件
        • SpringMVC配置和注解

SpringMVC入门

1 Spring集成web环境

创建spring_mvc的maven项目模块

添加依赖(2021-09-19 Spring5 IoC与DI注解开发的基础上添加此依赖)

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>8.0.1</version>
</dependency>
           

添加web环境

2021-09-19 SpringMVC入门SpringMVC入门

web配置文件位置

2021-09-19 SpringMVC入门SpringMVC入门

web项目部署位置

2021-09-19 SpringMVC入门SpringMVC入门

将指定web项目打成war包

2021-09-19 SpringMVC入门SpringMVC入门

配置Tomcet

2021-09-19 SpringMVC入门SpringMVC入门

部署war包

2021-09-19 SpringMVC入门SpringMVC入门

首页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>Hello</h1>

<script></script>
</body>
</html>
           

web配置文件(配置Servlet Filter Listerner)

<?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">
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.raphuscucullatus.web.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>

</web-app>
           

servlet文件

package com.raphuscucullatus.web;

import com.raphuscucullatus.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author raphus cucullatus
 * @version 2021/9/19 2:49
 * @since JDK8
 */
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)classPathXmlApplicationContext.getBean("userService");
        userService.save();
    }

}
           

测试

启动服务器后,在浏览器访问http://localhost:8080/spring_mvc/userServlet 检测环境是否正常

偶遇bug: 监听器启动失败

原因:如下依赖的jar包不在war包中,导致tomcat无法启动监听器

org.springframework.web.context.ConfigurableWebApplicationContext

2021-09-19 SpringMVC入门SpringMVC入门

解决:删除Spring_mvc:war exploded包,并重新添加war包

2 SpringMVC简介

2.1 SpringMVC简介

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。

SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。

2.2 SpringMVC入门步骤

2021-09-19 SpringMVC入门SpringMVC入门

2.3 SpringMVC快速入门

需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。

开发步骤:

① 导入SpringMVC相关坐标 (pom.xml)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
           

② 配置SpringMVC控制器DispathcerServlet (index.xml)

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
           

③ 创建Controller类和视图页面 ④ 使用注解配置Controller类中业务方法的映射地址

controller

package com.raphuscucullatus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author raphus cucullatus
 * @version 2021/9/20 5:18
 * @since JDK8
 */
@Controller
@RequestMapping("/user")
public class UserController {
	//params = {"userName"} :表示请求参数必须有userName
    @RequestMapping(value = "/quick",method = RequestMethod.GET,params = {"userName"})
    public String save(){
        System.out.println("Controller save running...");
        //请求转发(不加前缀"../success.jsp"默认作为请求转发地址,且访问地址为相对于该类/user目录下的资源 )
//        return "forward:../success.jsp";
        //重定向
        return "redirect:../success.jsp";
    }

}

           

视图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>跳转成功</h1>

<script></script>
</body>
</html>
           

⑤ 配置SpringMVC核心文件 spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
>
    <!--  Controller的组件扫描  -->
<!--    <context:component-scan base-package="com.raphuscucullatus.controller"/>-->
    <!--
        base-package="com.raphuscucullatus" 对com.raphuscucullatus包扫描
        include-filter 过滤器(找到满足条件的)
        exclude-filter 过滤器(排除满足条件的)
        type="annotation" 通过注解过滤
        expression="org.springframework.stereotype.Controller 过滤条件 过滤含有该注解的类
    -->
    <context:component-scan base-package="com.raphuscucullatus">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component"/>
    </context:component-scan>
</beans>
           

⑥ 客户端发起请求测试

2021-09-19 SpringMVC入门SpringMVC入门

再遇bug:

public String save(){
        System.out.println("Controller save running...");
        //请求转发(不加前缀"../success.jsp"默认作为请求转发地址,且访问地址为相对于该类/user目录下的资源 )
//        return "forward:../success.jsp";
//        return "forward:../other.jsp";
        return "/html/success.jsp";
        //重定向
//        return "redirect:../success.jsp";
    }
           

在测试时更换返回的资源uri时(webapp页创建了相应的目录和.jsp文件),浏览器一直404,但是控制台有输出"Controller save running…"语句

说明项目资源没有更新到部署到服务期内(由于我的idea中配置了多个版本的Tomcat,更换版本后配置没有更改导致出现该Bug)

还没解决就需要删除war包重新导入war包了

2021-09-19 SpringMVC入门SpringMVC入门

3 SpringMVC组件解析

3.1 SpringMVC组件解析

2021-09-19 SpringMVC入门SpringMVC入门

SpringMVC相关组件

  1. 前端控制器: DispatcherServlet

    用户请求到达前端控制器,它就相当于 MVC 模式中的 C, DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求, DispatcherServlet 的存在降低了组件之间的耦合性。

  2. 处理器映射器: HandlerMapping

    HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  3. 处理器适配器: HandlerAdapter

    /通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

  4. 处理器: Handler

    它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由

    Handler 对具体的用户请求进行处理。

  5. 视图解析器: View Resolver

    View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名,即

    具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

  6. 视图: View

    SpringMVC 框架提供了很多的 View 视图类型的支持,包括: jstlView、 freemarkerView、 pdfView等。最

    常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程

    序员根据业务需求开发具体的页面

SpringMVC配置和注解

请求映射注解:

视图解析器的配资(在spring-mvc.xml中配置)

<!--
配置内部资源视图解析器
对controller返回字符串进行配置前后缀,例
不配置:return "/jsp/success.jsp";
配置后:return "success";
-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
           

url基础视图解析器

public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered
    /**
    指定重定向 URL 的特殊视图名称的前缀(通常在提交和处理表单后指向控制器)。 
    此类视图名称不会以配置的默认方式解析,而是被视为特殊快捷方式
    */
    public static final String REDIRECT_URL_PREFIX = "redirect:";

    /**
    指定转发 URL 的特殊视图名称的前缀(通常在提交和处理表单后指向控制器)。 
    此类视图名称不会以配置的默认方式解析,而是被视为特殊快捷方式
     */
    public static final String FORWARD_URL_PREFIX = "forward:";
           
public String save(){
        System.out.println("Controller save running...");
        //请求转发(不加前缀"../success.jsp"默认作为请求转发地址,且访问地址为相对于该类/user目录下的资源 )
        return "/html/success.jsp";
        //重定向
//        return "redirect:../success.jsp";
    }