springboot項目架構(1)--- 加入jsp支持

因為最近有點閑,所以又拿起了原來折磨我千百遍的springboot,作為一個做后端的人,本來不應該關心前端支持的這些事的,但是公司項目必須要用jsp,而我們對springboot推薦的thymeleaf也不是很熟悉,所以也就只能繼續使用jsp了。我原來在學習springboot的時候,一直就卡到了jsp這里,在查了無數資料沒有用后,還是自己找到了原因。這里首先說一下基本構建(我用的springboot版本是2.0.2):
1、新建項目,添加jsp支持

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
</parent>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope> <!-- 如果部署到tomcat,這里必須為provided -->
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

這里包含了支持jsp所需的依賴包
2、把jsp頁面放到webapp目錄下,這個目錄需要建在項目根目錄:


image.png

3、在配置文件中添加配置:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
4、在程序起始類繼承SpringBootServletInitializer,重寫configure方法

@SpringBootApplication
@MapperScan(basePackages = "com.pcbwx.jsp.dao") // mybatis包路徑
public class SystemStart extends SpringBootServletInitializer {

    private static Logger logger = LoggerFactory.getLogger(SystemStart.class);

    public static void main(String[] args) throws Exception {
        SpringApplication springApplication = new SpringApplication(SystemStart.class);
        springApplication.run(args);
        logger.info("系統已經啟動");
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SystemStart.class);
    }
}

一般完成這4步jsp構建就可以了,你可以通過視圖訪問頁面

@Controller
public class WelcomeController {
    // 登錄頁
    @GetMapping("/login")
    public String login() {
        return "login";
    }
}
image.png

但是springboot還是有很多坑的,因為springboot不建議用jsp,所以會有很多的依賴會與jsp相沖突,我這里只說一種情況,也是我遇到的情況。
因為我需要把所寫接口中的null轉化成"";所以我配置了這個類:

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

    // 把返回Json中的null換為""
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

也就是因為這個WebMvcConfigurationSupport類,與jsp相沖突,所以我在加入這個配置以后,原本可以訪問的頁面也報錯了。


image.png

后來我把WebMvcConfigurationSupport換成了WebMvcAutoConfiguration,就沒有再出現原來的問題:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfiguration {
    // 把返回Json中的null換為""
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

我在網上查資料的時候,也看到有的人因為在項目中加入了thymeleaf的依賴導致jsp頁面不能訪問。但是因為我沒有用thymeleaf,所以也就沒有遇到這個問題,在這里只是把這個可能導致的原因提一下。
這里附上程序源碼:https://github.com/HeyuRise/jsp

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容