網頁

2020/12/15

IntelliJ IDEA Community 建立Spring Boot JSP專案

在IntelliJ IDEA Community(社群版)建立Spring Boot JSP專案。

會寫這篇文章是因為在「IntelliJ IDEA Community Application Servers not found」有人留言問了關於用IntelliJ IDEA Community開發Spring Boot搭配JSP的問題,但IntelliJ Community缺少開發Java EE的功能,且Spring Boot官方也不建議拿來開發JSP專案,因為使用embedded servlet container對JSP的支援有限制

以前剛接觸Spring Boot時曾寫了一篇「Eclipse STS 建立Spring Boot專案」,當時用Eclipse跑JSP時沒什麼問題,但沒想到在IntelliJ IDEA Community跑就沒那麼順利,所以記錄一下。


範例環境:

  • Windows 7
  • IntelliJ IDEA Community 2020.2.2
  • Java 8
  • Maven
  • Spring Boot 2.3.2

首先參考「IntelliJ IDEA Community 建立Spring Boot專案教學」建立基本的Spring Boot專案。

pom.xml加入Tomcat Embed JasperJava Servlet JSTL依賴,加入後重新整理Maven。

pom.xml

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <scope>provided</scope>
</dependency>

application.properties設定Sprng MVC view的prefixsuffix

#context path
server.servlet.context-path=/demo
#port
server.port=8080

#view
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

新增處理請求的DemoController

DemoController

@Controller
public class DemoController {

    @RequestMapping("/hello")
    public ModelAndView hello() {
        return new ModelAndView("hello"); // 根據view resolver mapping至/WEB-INF/jsp/hello.jsp
    }
}

src/main/resources/static下新增index.html預設的首頁

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
<h1>Welcome to Spring Boot JSP</h1>
</body>
</html>

在專案/src/main下建立webapp資料夾,然後在webapp中建立WEB-INF/jsp資料夾來放置jsp檔案。

/src/main/webapp/WEB-INF/jsp資料夾新增hello.jsp

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
<h1>SpringBoot hello.jsp!!</h1>
</body>
</html>

重點來了,如果第一次執行是在Spring Boot的進入點@SpringBootApplication類的main()啟動專案並使用瀏覽器進入http://localhost:8080/demo會發現找不到JSP頁面的訊息Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

在console則是顯示Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/index.jsp] intellij

解決方式是不能直接在main()啟動,必須用Spring Boot Maven Pluginspring-boot:run啟動。


另外IntelliJ IDEA Community啟動Spring Boot之後並不會自動開啟瀏覽器,要達到此效果查了一下好像只能透過程式來處理。新增一個BrowserLauncher監聽器如下,在應用程式啟動後開啟瀏覽器。

BrowserLauncher

package com.abc.demo.launcher;

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.net.URI;

@Component
public class BrowserLauncher {

    @EventListener(ApplicationReadyEvent.class)
    public void launchBrowser() {
        System.setProperty("java.awt.headless", "false");
        Desktop desktop = Desktop.getDesktop();
        try {
            desktop.browse(new URI("http://localhost:8080/demo"));
        } catch (Exception e) {
            // handle error
        }
    }
}

參考github


至今有3年沒寫過JSP了,幾乎都忘了怎麼寫,我想以後也不會寫了。


沒有留言:

張貼留言