SpringWeb项目搭建
SpringMVC架构
- DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c, dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请
求,dispatcherServlet的存在降低了组件之间的耦合性。 - HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方
式,注解方式等。 - Handler:处理器(自己定义的Controller处理单元)
它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler.由Handler对具体的用户请求进行处理。 - HandIAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行 - View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后
对View进行渲染将处理结果通过页面展示给用户。 - View:视图
SpringMVC框架提供了很多的View视图类型的支持,包括: jstIView、 freemarkerView. pdfView等。 我们最常用的视图就是jsp。-般情况 下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。 - mvc:annotation-driven说明
在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三三大组件。
使用mvc:annotation-driven自动加载RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处理适配
器),可用在SpringMVC.xml配置文件中使用mvc:annotation-driven 替代注解处理器和适配器的配置。
MVC架构到此就已经很明了了,下面我们先看一下怎么生成一个普通的Web项目然后再看看怎么样创建一个Spring的web项目。
非SpringMVC的web
创建一个新项目
这里有两个webapp项目我们选择Maven的webapp项目而不是cocoon的webapp项目,否则我们创建的项目会没有webapp的目录配置。
这是刚创建好的项目结构
修改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项目
接着在main下面新建java和resources目录
打开项目结构将java和resources目录标记为源目录和资源目录
下面我们就可以在java目录下面编写类了
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服务
之后我们可以将程序上下文的/后面的内容删掉,否则我们每次访问都要在后面加上/XXX才行,如果想直接访问http://localhost:8080的话那就把它改为/
确定后点击run运行Tomcat项目。
运行Tomcat项目之后我们访问http://localhost:8080和http://localhost:8080/test
到目前为止我们已经创建好了一个web项目,但是需要注意的是现在创建的这个项目并不能算是一个Spring项目, 也没有用到SpringMVC的框架。
不使用SpringMVC框架可以像上面一样直接声明类继承自HttpServlet同时对类进行注解@WebServerlet("/XXX")并重写父类的service函数将当前处理的请求交到指定的jsp文件即可。
接下来我们卡看一下怎么把这个项目改成一个SpringMVC结构并且由我们自己定义一个Controller控制器。
配置SpringMVC结构
如果不使用继承类的话我们可以通过配置文件/webapp/WEB-INF/web.xml
和/resources/springmvc.xml
这两个文件为指定的请求寻找Controller。
默认web.xml
文件
修改/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>
注意,如果我们没有给前端控制器初始化设置/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页面的效果一样
这是因为在类的上面加了一个/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服务