本篇說明如何在 Linux 上使用 Maven 建立 Servlet 專案,然後使用 VS Code 與之連線。
Linux 安裝套件
todo
sudo apt install maven
建立專案
Ctrl+Shift+p 選擇 Remote-SSH: Connect to Host,指定網址。
將專案建立在遠端 /server 目錄之下,專案名稱為 JavaWeb
cd /server mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=JavaWeb \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
以上 -DgroupId 一定要寫
pom.xml
pom.xml 設定成如下
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.ddns.mahalrtc</groupId>
<artifactId>JavaWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>JavaWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jakartaee>11.0.0-M1</jakartaee>
</properties>
<dependencies>
<!-- Servlet API -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakartaee}</version>
<scope>provided</scope>
</dependency>
<!-- JSTL API -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.2</version>
</dependency>
<!-- JSTL Implementation -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
<!-- Thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.21</version>
</dependency>
</dependencies>
<build>
<finalName>JavaWeb</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>
</plugins>
</build>
</project>
todo
發佈
使用如下指令發佈網站
mvn clean package
發佈的目標預設在專案下的 target/JavaWeb
發佈到指定的目錄
指定發佈目錄其實沒什麼必要,但如果真的要修改,請開啟專案下的 pom.xml,在 <build> 裏新增 <directory>,如下所示
<build>
<directory>/server/tomcat</directory>
<finalName>Tomcat</finalName?
</build>
<directory> : 指定編譯打包輸出路徑
<finalName> : 指定生成的檔名(如 my-app.war、my-app.jar),
執行 mvn clean package,即會發佈到 /server/tomcat/Tomcat 之下。
Tomcat docBase
開啟 /opt/tomcat/conf/server.xml,將 docBase 改成如下
<Context path="/" docBase="/server/JavaWeb/target/JavaWeb" debug="0" reloadable="true" />
記得要重新啟動 Tomcat
sudo systemctl restart tomcat
輸入 https://xxx.ddns.net/index.jsp 即可看到網頁
JSTL
maven 編譯時,預設會把 jsp 的 JSTL 關閉,所以在 jsp 檔案的最開頭需把 isELIgnored 設為 false。
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
todo
新增首頁 Servlet
在 src/main/ 裏新增 java 目錄,然後在 java 下新增 home,然後在 home按右錄/New Java File/Class
package home;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "index", urlPatterns = {"/index"})
public class views extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.getRequestDispatcher("/template/home/index.jsp").forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
}
