在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 Jasper及Java 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的prefix與suffix。
#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 Plugin的spring-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了,幾乎都忘了怎麼寫,我想以後也不會寫了。
沒有留言:
張貼留言