当前位置 博文首页 > zhtbs的博客:Springboot 入门培训 4 WEB+JSP MVC项目搭建

    zhtbs的博客:Springboot 入门培训 4 WEB+JSP MVC项目搭建

    作者:[db:作者] 时间:2021-09-14 19:41

    在建立spring boot web项目的时候,我们需要判断这个工程项目是普通java项目还是maven项目。因为这两种项目对spring boot web项目结构是不一样的。我遇到很多人在会把这两种项目结构搞混导致项目无法运行和访问到web服务中的资源。所有在建立spring boot Web项目的时候一定要分请自己建立的是普通项目还是maven项目。我看到很多人整不明白的时候都会把问题归结给编辑工具上说什么eclipse没有idea 好用什么的,其实你是把工程结构整混了用,eclipse建立一个普通项目非要用maven项目的结构去调试写代码最后运行不出来,就说什么eclipse不好用,你如果把项目换成maven项目就解决问题了,你非要说是什么工具不好用就不对了。

    2种项目工程结构

    • 普通项目spring boot Web
    • maven项目spring boot Web

    注意:一定要分清你的项目使用的是那种工程,他们引用路径webapp使用的目录是不一样的。

    下载地址spring boot WEB jsp普通项目例子.zip
    下载地址springboot+webJSP maven项目例子.zip
    所有例子代码百度网盘:https://pan.baidu.com/s/1rDpcZtdBA6i7vBmYTMwcUA
    提取码:1234

    1 普通java项目spring boo web工程结构

    我们使用eclipse或者idea创建一个普通java项目。在项目的src目录下创建2个文件包,一个是代码包名字自己定义,一个包是main这个名字一定要用默认的名字(main)。如果这个main包名字改变启动 spring boot 后,spring boot会找不到web服务器的资源。

    项目结构

    Project
    └─src                  
        └─cn               #代码都在这个包下
        └─ main            #WEB资源都在这个包下
        └─application.yml  #配置文件
    
    • 1级src 为项目的根目录等价于(claess 路径)
    • 2级java代码包,可以创建项目的功能代码包
    • 2级main,创建一个main文件目录,这个目录是spring boot中默认的web服务资源目录。如果webapp放在其他目录中spring boot将无法访问web服务资源。web服务资源目录地址可以自定义,后面会详细介绍,前期学习的时候就使用默认的main目录
    • 3级webapp,在main文件目录中创建webapp目录,这个目录将放入所有web服务静态资源。必须包含 WEB-INF,web.xml这两个web元素
    • 2级application.yml springboot 配置文件

    项目全体结构

    Project
    └─src                  #项目根目录
        └─cn
           └─ core....     #代码部分
        └─ main
            └─ webapp      #WEB资源
                └─ WEB-INF #web工程资源(web.xml,lib)
                      └─ web.xml
                      └─ lib
     			└─ static (JavaScript、CSS、图)
                      └─ js     #js脚本
                      └─ css    #css 样式
                └─ page   #页面(JSP,HTML)
        └─application.yml  #spring boot 配置文件
        └─ mapper          #mybatis sql文配置文件
    

    webapp 包下面一定要创建一个WEB-INF文件,这个文件就是整个web项目的核心目录,在这个目录下面创建web.xml文件和lib文件,lib文件中装入所有的spring boot工程使用到的jar包,web.xml配置所有java web项目中使用web元素。

    webapp结构

    Project
    └─src                  #项目根目录
        └─ main
            └─ webapp      #WEB资源
                └─ WEB-INF #web工程资源(web.xml,lib)
                      └─ web.xml
                      └─ lib    (装入入spring boot 和其他jar包)
    

    2 spring boo web maven工程结构

    maven项目与普通项目代码结构是不一样,需要按maven项目结构来进行开发。maven项目结构是在src创建3个文件包java包,resources包,webapp包。它与普通项目区别是没有main这个包,自接创建webapp包到src目录中来。

    • 1级src 为项目的根目录
    • 2级java 工程java代码写在这个目录下
    • 2级resources 等价于(claess 路径),项目配置文件和一下静态资源
    • 2级jwebapp web服务支援目录,必须包含 WEB-INF,web.xml这两个web元素,如果没有spring boot打包的时候不会认为这是个web项目.

    maven项目结构

    Project
    └─src           
       └─main            #头目录
          └─java         #代码
          └─ resources   #claess下配置文件目录
    			└─ mapper           #mybatis sql文配置文件
    			└─ application.yml  #spring boot 配置文件
          └─ webapp      #web服务器资源
               └─ WEB-INF
                     └─ web.xml
                     └─ lib
     			└─ static (JavaScript、CSS、图)
                      └─ js     #js脚本
                      └─ css    #css 样式
               └─ page   #页面(jsp,html)
       └─test            
          └─ java        #测试代码
       └─pom.xml
    

    3 spring boo jsp页面访问与静态资源

    在webapp文件目录下的所有文件(html,图片,css,js)等都可以通过…/路径访问到。但是不包括jsp文件内容,如果想使用jsp页面开发项目需要进行如下操作。导入tomcat包和servlet的jstl包,这些包可以样项目获得编译jsp的功能,如果不导入这些包,我们的spring boot web项目无法编译jsp页面内容。

    pom.xml

    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-jasper</artifactId>
    	<version>8.5.20</version>
    </dependency>
    
    • 配置 web +JSP 服务功能必须导入tomcat-embed-jasper和javax.servlet包

    发现很多人在调试spring boot jsp项目的时候maven项目工程的pom.xml配置总是引不对jar包,导致项目一直运行不起来,在这面补充一下我的pom文件配置内容来方便大家开发与调试代码。
    pom.xml

     <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.2.3.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <version>2.2.3.RELEASE</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.2.3.RELEASE</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test-autoconfigure</artifactId>
                <version>2.2.3.RELEASE</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <version>9.0.21</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!-- 工程主入口-->
                        <mainClass>cn.core.my.app.OnApp</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
                <resource>
                    <directory>src/main/webapp</directory>
                </resource>
            </resources>
        </build>
    

    1 application.yml设置

    spring boot web项目application.yml文件中配置jsp文件在项目的访问地址,如果不设置访问地址项目无法访问到jsp页面。

    application.yml

    server:
      port: 9089
      tomcat:
        uri-encoding: utf-8
    spring:
      mvc:
        view:
          prefix: /WEB-INF/jsp/
          suffix: .jsp
      http:
        encoding:
          force: true
          charset: utf-8
          enabled: true
    

    server

    • port 配置服务器端口
    • tomcat:uri-encoding 字符转码设置

    spring

    • mvc.view. prefix jsp文件地址设置
    • mvc.view. suffix jsp 文件名称设置
    • http.encoding 字符转码设置

    2 创建Controller容器与JSP页面

    ? 创建jsp页面访问容器,通过这个容器来访问jsp所在地址,这样就可以通过url路径访问到jsp。

    创建Controller容器

    package cn.core.my.app.Controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    @Controller
    @RequestMapping("/zht")
    public class ZhtController {
    	@RequestMapping("/index")
    	 public String index(Model map) {
    		map.addAttribute("name", "欢迎来到 web jsp页面");
    	   return "/index";
    	 }
    }
    

    创建jsp 地址src/main/webapp/WEB-INF/jsp/

    index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" 
      content="text/html;charset=utf-8" />
    <title>zhtbs</title>
    <link rel="stylesheet" href="../static/css/css.css" />
    <style type="text/css">
    </style>
    </head>
    <body>
    <h1>${name}</h1>
    </body>
    </html>
    

    创建启动容器SpringBootApplication

    • WebApplicationType.SERVLET 设置为web启动模式
    package cn.core.my.app;
    import org.springframework.boot.WebApplicationType;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    @SpringBootApplication
    public class OnApp {
    	public static void main(String[] args) {
            new SpringApplicationBuilder(OnApp.class).
                web(WebApplicationType.SERVLET).run(args);
    	}	
    }
    

    启动容器运行项目工程访问url

    浏览器中输入 http://localhost:9089/zht/index 地址,我们可以看到页面结果。
    在这里插入图片描述

    3 单体测试

    我们可以使用spring boot Test测试中的MockMvc类来进行web url访问的单元测试工作,这样我们在开发的时候就不需要启动web服务器,也能进行代码的开发调试工作。

    Spring Testorg.springframework.test.web.servlet.MockMvc提供了一个类作为与 Spring MVC 框架结合的的测试机制,它的功能很强大。如果有机会我回单独写一篇文章来单独介绍它,现在大家只需要理解它怎么使用就可以了。

    • mockMvc创建 perform
    • /zht/index 执行访问请求get ,如果是post请求需要将方法混成post
    • 等待返回结果(andExpect)
    • HTTP返回200(status().isOK())如果返回其他测试不通过
    • 打印执行结果(andDo(print))

    MyUrlPageTest.java

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes=OnApp.class)
    @AutoConfigureMockMvc
    public class MyUrlPageTest {
    	
    	@Autowired
    	private WebApplicationContext webapp;
    	private MockMvc mockMvc;
    	@Before
    	public void setup() {
            //进入spring boot 容器 到MockMvc容器中
    		mockMvc = MockMvcBuilders.webAppContextSetup(webapp).build();
    	}
    	@Test
    	public void TestPage() throws Exception{
            //通过url 路径找到页面控制的Controller容器
            ResultActions results =mockMvc.
                perform(MockMvcRequestBuilders
                        .get("/zht/index").param("test", "测试数据来了"));
            results.andReturn().getResponse()
                .setCharacterEncoding("UTF-8");
           //查看返回结果
            results.
                andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    	}
    
    }
    

    返回测试结果

    ===========测试访问到了===========
    ===========测试 test value 测试数据来了===========
    MockHttpServletRequest:
          HTTP Method = GET
          Request URI = /zht/index
           Parameters = {test=[测试数据来了]}
              Headers