SpringWeb项目搭建

SpringMVC架构

image-20220410171309757

  1. DispatcherServlet:前端控制器
    用户请求到达前端控制器,它就相当于mvc模式中的c, dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请
    求,dispatcherServlet的存在降低了组件之间的耦合性。
  2. HandlerMapping:处理器映射器
    HandlerMapping负责根据用户请求找到Handler即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方
    式,注解方式等。
  3. Handler:处理器(自己定义的Controller处理单元)
    它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler.由Handler对具体的用户请求进行处理。
  4. HandIAdapter:处理器适配器
    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
  5. View Resolver:视图解析器
    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后
    对View进行渲染将处理结果通过页面展示给用户。
  6. View:视图
    SpringMVC框架提供了很多的View视图类型的支持,包括: jstIView、 freemarkerView. pdfView等。 我们最常用的视图就是jsp。-般情况 下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
  7. mvc:annotation-driven说明
    在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三三大组件。
    使用mvc:annotation-driven自动加载RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处理适配
    器),可用在SpringMVC.xml配置文件中使用mvc:annotation-driven 替代注解处理器和适配器的配置。

MVC架构到此就已经很明了了,下面我们先看一下怎么生成一个普通的Web项目然后再看看怎么样创建一个Spring的web项目。

非SpringMVC的web

创建一个新项目

image-20220410204656233

image-20220410204834875

这里有两个webapp项目我们选择Maven的webapp项目而不是cocoon的webapp项目,否则我们创建的项目会没有webapp的目录配置。

这是刚创建好的项目结构

image-20220410205347852

修改pom.xml文件添加Spring依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

修改pom.xml后重新加载Maven项目

image-20220410205435045

接着在main下面新建java和resources目录

打开项目结构将java和resources目录标记为源目录和资源目录

image-20220410205658561

image-20220410205704272

下面我们就可以在java目录下面编写类了

image-20220410211340647

import org.springframework.web.bind.annotation.RequestMapping;

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

@WebServlet("/test")
public class WebController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("test.jsp").forward(req,resp);
    }
    
}

在添加一个jsp文件/webapp/test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Here is test</h1>
</body>
</html>

现在我们配置Tomcat服务

image-20220410210504956

image-20220410211044868

image-20220410211108311

之后我们可以将程序上下文的/后面的内容删掉,否则我们每次访问都要在后面加上/XXX才行,如果想直接访问http://localhost:8080的话那就把它改为/

确定后点击run运行Tomcat项目。

运行Tomcat项目之后我们访问http://localhost:8080和http://localhost:8080/test

image-20220410210812781

image-20220410210806683

到目前为止我们已经创建好了一个web项目,但是需要注意的是现在创建的这个项目并不能算是一个Spring项目, 也没有用到SpringMVC的框架。

不使用SpringMVC框架可以像上面一样直接声明类继承自HttpServlet同时对类进行注解@WebServerlet("/XXX")并重写父类的service函数将当前处理的请求交到指定的jsp文件即可。

接下来我们卡看一下怎么把这个项目改成一个SpringMVC结构并且由我们自己定义一个Controller控制器。

配置SpringMVC结构

如果不使用继承类的话我们可以通过配置文件/webapp/WEB-INF/web.xml/resources/springmvc.xml这两个文件为指定的请求寻找Controller。

默认web.xml文件

image-20220410213820291

修改/webapp/web.xml, 从springmvc.xml文件导入配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
<!--  配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--    参数初始化,设置SpringMVC的配置文件路径-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
<!--    /表示映射jsp之外的全部请求-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

注意,如果我们没有给前端控制器初始化设置标签那么默认读取的 springMVC配置文件路径就是/WEB-INF/<servlet-name>-servlet.xml我们在这里指定为/resources/springmvc.xml

注意一下,web.xml我们可以定义很多其他的一些东西比如过滤器和其他一些东西,但是我们这里只是一个简单的搭建所以就不弄这么多东西上来了。

/resources/springmvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       xmlns:context="http://www.springframework.org/schema/context">
    <!--    扫描Controller-->
    <context:component-scan base-package="com.test"></context:component-scan>
</beans>

在java文件夹下面创建com\test\WebController.java

package com.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//注意,如果这里使用的是@RestController那么就不会跳转到/webapp下指定的test.jsp而是直接返回字符串test.jsp到响应页面
//@RestController
@Controller
public class WebController {
    @RequestMapping("/teststring")
    public String teststring(){
        return "hell0";
    }
    @RequestMapping("/testjsp")
    public String testjsp(){
        return "test.jsp";
    }
}

一些事项

@Controller标明这是一个控制器

@RequestMapping指定映射路径

@RequestMapping可以放到类上也可以放到函数上面

package com.test;

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

@Controller
@RequestMapping("test")
public class WebController {
    @RequestMapping("/teststring")
    public String teststring(){
        return "hell0";
    }
    @RequestMapping("/testjsp")
    public String testjsp(){
        return "test.jsp";
        //return "/test.jsp";
    }
}

这时候我们如果请求http://127.0.0.1:8080/testjsp会发现返回404, 但是访问/test/testjap还是404, 但是如果我们把源码中的index.jsp改为/index.jsp之后访问/test/testjsp就和我们之前访问/testjsp页面的效果一样

image-20220410223436385

这是因为在类的上面加了一个/test的路径映射之后里面的映射都是在类的映射路径下面的子路径, 也就是在函数的全部映射是在/test下面的二次映射。此外, 如果我们直接return "test.jsp"所访问的资源那就是/webapp/test下面的test.jsp而不是/webapp/test.jsp但是return "/test.jsp"就指明了是/webapp下面的test.jsp。

注: org.apache.catalina.startup.HostConfig.deployDirectory依赖缺失的话会导致无法使用SpringMVC方式搭建web服务

posted @ 2022-04-25 12:51  h0cksr  阅读(1162)  评论(0编辑  收藏  举报