【Jboss_Linux】 Jboss eap 7 + JDK8 + Springboot 2.7 升级 Jboss eap 8 + JDK17 + springboot 3

425 阅读6分钟

image.png

先安装Jboss eap 7 + JDK8,进行项目测试,兼容完在做升级 Jboss eap 8 + JDK17

下载JBoss及JDK包

Jboss EAP:JBoss Enterprise Application Platform Download | Red Hat Developer

Jboss 开源:JBoss Application Server Downloads - JBoss Community

参考官方文档:docs.redhat.com/en/document…

将包导入到linux服务器

cd 想要上传的路径

windows导入到linux

rz 

linux导出到windows

sz 文件名 

也可以通过你自己的工具直接拖拉拽进去

解压下载好的包

tar -zxvf a.tar                      //解包至当前目录
tar -zxvf a.tar -C /usr------        //指定解压的位置
unzip test.zip             //解压*.zip文件 
unzip -l test.zip          //查看*.zip文件的内容 
tar xvf jdkxxx.tar.gz

image.png

image.png

配置JDK(修改全局变量方式--不建议此方式)

如果你这台服务器就是供给你自己使用你可以更改全局的环境变量,如果是有别的同事使用这个全局变量,建议让你的jboss直接指定对应的JDK,而不是去更改全局的

vim /etc/profile   --修改文件
:wq 			   --保存

也可以通过工具,右键直接编辑

注意:这里JBOSS_HOME无需配置,如果想在linux中部署多个版本的jboss,他的思想跟tomcat一样,可以启动多个服务,会自动找对应的版本

JAVA_HOME=/home/xxx/jdk1.8.0_202
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH

# export JBOSS_HOME=/home/tangweilong/jboss-eap-7.3
# export CLASSPATH=.:$CLASSPATH:$JBOSS_HOME/lib
# export PATH=$PATH:$JBOSS_HOME/bin

让配置文件生效

source /etc/profile

测试如图

java -version

image.png

找到bin目录下的standlone.conf,进行编辑,将指定的jdk路径放进去,就可以跳过环境变量读指定的jdk版本

1737537407403.jpg

image.png

部署Jboss

部署的话jboss7跟jboss8基本一样,唯一很大的区别在于打包的方式以及项目的兼容

解压缩完直接修改配置文件就好

  • 修改外网访问,默认只允许本机访问
  • 修改端口,避免端口占用

image.png 启动jboss,会出现以下关键信息代表启动成功

./standalone.sh

image.png 监测端口命令,找到自己的端口是否在Jboss在跑

netstat -tulnp | frep 8033

image.png

监测进程命令,查看这个进程是否是Jboss在运行

ps -ef | grep 260247

image.png 访问示例:服务器地址:加你自己配置的端口

image.png

发布项目(Jboss7)

注意:保证maven版本3.6.2 以上

打包命令--如果在idea的Terminal中打包需要安装东西,可以在项目文件中(带pom文件的路径下-如图),cmd进行打包

image.png

mvn clean install -Dmaven.test.skip=true

打完包后,war包的路径在项目的release目录下

image.png

将打包好的war直接放置在jboss的\standalone\deployments文件中

image.png

重新进入jboss的bin路径下,重启jboss,加载项目

./standalone.sh

启动成功,可以访问检测,也可以看一下deployments是否生成了deployed文件,如果失败会生成一个failed文件

image.png

剩余问题就是特殊项目特殊解决了

发布项目(Jboss8)

注意:linux中的jdk如果是11 项目必须是jdk11 如果linux中的jdk是17 项目可以是 jdk11 jdk17,选择对应的版本去打包

注意:保证maven版本3.6.2 以上

注意:保证springboot版本在3以上

将下面的pom文件的内容兼容到自己项目的主pom文件中,然后更新maven,直到能找到全部依赖

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.jboss.as.quickstarts</groupId>
    <artifactId>jboss8</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.server>8.0.0.GA-redhat-00009</version.server>
        <version.bom.ee>${version.server}</version.bom.ee>
        <version.plugin.wildfly>4.1.1.Final</version.plugin.wildfly>
        <version.plugin.war>3.3.2</version.plugin.war>
        <finalName>${project.artifactId}</finalName>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.wildfly.plugins</groupId>
                    <artifactId>wildfly-maven-plugin</artifactId>
                    <version>${version.plugin.wildfly}</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>${version.plugin.war}</version>
                    <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                        <!-- 如果你有一个已有的 web.xml 文件,可以使用以下配置 -->
<!--                         <webxml>src/main/webapp/WEB-INF/web.xml</webxml> -->
                    </configuration>
                </plugin>
            </plugins>

        </pluginManagement>
    </build>

    <repositories>
        <repository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
        <repository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-eap-ee-with-tools</artifactId>
                <version>${version.bom.ee}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>javax.servlet</groupId>-->
<!--            <artifactId>javax.servlet-api</artifactId>-->
<!--            <version>4.0.1</version>-->
<!--            <scope>provided</scope>-->
<!--        </dependency>-->
    </dependencies>

</project>

找到pom文件的路径下,cmd打包

注意:jboss8的打包命令跟jboss7不一样

mvn package wildfly:deploy

打完包后,war包的路径在项目的release目录下

image.png

将打包好的war直接放置在jboss的\standalone\deployments文件中

image.png

重新进入jboss的bin路径下,重启jboss,加载项目

./standalone.sh

启动成功,可以访问检测,也可以看一下deployments是否生成了deployed文件,如果失败会生成一个failed文件

image.png

项目兼容(在已有的项目上做升级)

  1. sdk升级
<cfca.private.SADK.version>3.7.1.0</cfca.private.SADK.version>
替换为
<cfca.private.SADK.version>3.7.1.0patch7</cfca.private.SADK.version>

2 maven-compiler-plugin升级

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.1</version>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
	</configuration>
</plugin>

替换为

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>${maven-compiler-plugin.version}</version>
	<configuration>
		<source>${maven-compiler-plugin-configuration.version}</source>
		<target>${maven-compiler-plugin-configuration.version}</target>
	</configuration>
</plugin>

<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-compiler-plugin-configuration.version>17</maven-compiler-plugin-configuration.version>

3 升级springboot版本为 3 以上

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>3.1.12</version>
	<relativePath/>
</parent>

4 修改全局的Resource修改为Autowired

例如:
@Resource("bankcommConfigImpl")

替换为:
@Autowired
@Qualifier("bankcommConfigImpl")

5 在bean的pom中引入jakarta依赖

除了jakarta.jws-api其他springboot3都会自带版本

<dependency>
	<groupId>jakarta.jws</groupId>
	<artifactId>jakarta.jws-api</artifactId>
	<version>${jakarta.jws-api}</version>
</dependency>
<dependency>
	<groupId>jakarta.xml.bind</groupId>
	<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
	<groupId>jakarta.validation</groupId>
	<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
	<groupId>jakarta.xml.soap</groupId>
	<artifactId>jakarta.xml.soap-api</artifactId>
</dependency>
<dependency>
	<groupId>jakarta.xml.ws</groupId>
	<artifactId>jakarta.xml.ws-api</artifactId>
</dependency>
<dependency>
	<groupId>jakarta.annotation</groupId>
	<artifactId>jakarta.annotation-api</artifactId>
</dependency>

6 修改包中引入的javax的包为jakarta包

可以利用idea的自动扫描工具进行扫描是否有遗漏项的替换

例如:
import javax.annotation.xxx;
替换为:
import jakarta.annotation.xxx;

7 hibernate依赖升级

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>${hibernate-validator-jdk7.version}</version>
	<scope>provided</scope>
</dependency>

<hibernate-validator-jdk7.version>6.0.18.Final</hibernate-validator-jdk7.version>

替换为

<hibernate-validator-jdk7.version>8.0.2.Final</hibernate-validator-jdk7.version>

8 spring-data-redis依赖升级

建议引用springboot3版本自带的版本号

<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-redis</artifactId>
</dependency>

9 jedis依赖升级

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<scope>compile</scope>
</dependency>

10 ErrorAttributeOptions 异常处理

Map<String, Object> attr = this.errorAttributes.getErrorAttributes(requestAttributes, false);

替换为
ErrorAttributeOptions errorAttributeOptions =  ErrorAttributeOptions.of(ErrorAttributeOptions.Include.EXCEPTION);

Map<String, Object> attr = this.errorAttributes.getErrorAttributes(requestAttributes, errorAttributeOptions);

11 maven-antrun-plugin依赖升级

 <plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-antrun-plugin</artifactId>
	<version>3.0.0</version>
</plugin>

12 将项目pom中的tasks替换为target

<tasks>
	xxxxxx
</tasks>

替换为

<target>
	xxxxxx
</target>

13 tools依赖清除

Tools相关依赖进行注释掉,例如:

<!--                      <dependencies>-->
<!--                          <dependency>-->
<!--                              <groupId>com.sun</groupId>-->
<!--                              <artifactId>tools</artifactId>-->
<!--                              <version>1.5.0</version>-->
<!--                              <scope>system</scope>-->
<!--                              <systemPath>${java.home}/../lib/tools.jar</systemPath>-->
<!--                          </dependency>-->
<!--                      </dependencies>-->

14 lombok 的依赖 1.18.20 版本或以上

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>${lombok.version}</version>
</dependency>

<lombok.version>1.18.20</lombok.version>

15 groovy 依赖版本兼容

注意codehaus跟apache不同包下的groovy版本是不一样的

<dependency>
	<groupId>org.codehaus.groovy</groupId>
	<artifactId>groovy</artifactId>
	<classifier>indy</classifier>
	<version>2.4.21</version>
</dependency>

16 ehcache依赖版本升级,解决xml文件解析错误问题

<dependency>
	<groupId>org.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>${ehcache.version}</version>
</dependency>


<ehcache.version>3.6.1</ehcache.version>

升级为

<ehcache.version>3.10.8</ehcache.version>

17 ehcache要指定jakarta

<dependency>
	<groupId>org.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>${ehcache.version}</version>
	<classifier>jakarta</classifier>
</dependency>

替换为

<dependency>
	<groupId>org.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>${ehcache.version}</version>
	<classifier>jakarta</classifier>
</dependency>

18 spring版本升级为 6以上

建议直接使用springboot3自带的,如果项目中有自己指定的版本要进行修改

<springframework.version>6.0.21</springframework.version>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>??</artifactId>
	<version>${springframework.version}</version>
</dependency>

Springframework的依赖有很多,建议保持版本一致以避免不必要的麻烦

19 JwtInterceptor改造

public class JwtInterceptor extends HandlerInterceptorAdapter

替换为

public class JwtInterceptor implements AsyncHandlerInterceptor

20 Myabits依赖升级

<mybatis.version>3.5.6</mybatis.version>

替换为

<mybatis.version>3.5.17</mybatis.version>

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>${mybatis.version}</version>
</dependency>

21 commons-pool2依赖升级

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
	<version>${commons-pool2.version}</version>
</dependency>

22 全局指定mybatis版本

可能会出现,打完包的mybatis版本跟项目中的不一致

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>3.0.4</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.17</version>
		</dependency>
	</dependencies>
</dependencyManagement>

23 解決LogFilter重复注册问题

如下两个注解会进行注册两遍,如果重复使用,会报这个拦截器已经注册过

@Configuration
@WebFilter(filterName = "LogFilter", urlPatterns = "/*")

替换为

@Configuration
//@WebFilter(filterName = "LogFilter", urlPatterns = "/*")

24 解決log4j启动失败问题

在war包的META-INF路径下,增加配置文件jboss-deployment-structure.xml,排除jboss自带的一些依赖避免冲突,例如org.jboss.logmanager.log4j2

image.png

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.jboss.logmanager.log4j2" />
      <module name="org.jboss.logmanager"/>
      <module name="org.apache.logging.log4j.api"/>
      <module name="java.logging"/>
    </exclusions> 
  </deployment>
</jboss-deployment-structure>

并且需要排除相关依赖,找到jboss中该以来的路径,打开对应的module.xml

image.png 将如下的modules加入到jboss-deployment-structure.xml中即可

image.png

具体可看官方文档如何使用jboss-deployment-structure.xml

image.png

25 Slf4jLoggerFactory无法转换为LoggerContext

slf4j的jar与Jboss自带的jar产生了冲突、使用 jboss-deployment-structure.xml 文件进行对冲突依赖排除

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
        <!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
        <exclusions>
            <module name="org.slf4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

26 wildfly服务,调用接口返回时报jackson相关错误

由于jboss的module中自带Jackson而且版本较低,无法和Springboot2.x之后的兼容,Jackson相关jar包与wildfly自带的jar产生了冲突

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <exclusions>
            <!-- 所有相关Jackson的包都要去除,不然可能会有其他错误 -->
			<module name="com.fasterxml.jackson.core.jackson-core" />
            <module name="com.fasterxml.jackson.core.jackson-annotations" />
            <module name="com.fasterxml.jackson.core.jackson-databind" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" />
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

新建项目(如果只是为了测试锻炼的话--Jboss8)

可参考官网:为 JBoss EAP 部署开发应用程序入门

懒得看官网的:新建一个maven项目或者springboot项目,导入下面的pom文件,以及java文件然后打包测试就好了

或者gitee拉取我搭的 maven版本:gitee.com/its-a-littl… springboot3 + jdk17版本:gitee.com/its-a-littl…

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.jboss.as.quickstarts</groupId>
    <artifactId>jboss8</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.server>8.0.0.GA-redhat-00009</version.server>
        <version.bom.ee>${version.server}</version.bom.ee>
        <version.plugin.wildfly>4.1.1.Final</version.plugin.wildfly>
        <version.plugin.war>3.3.2</version.plugin.war>
        <finalName>${project.artifactId}</finalName>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.wildfly.plugins</groupId>
                    <artifactId>wildfly-maven-plugin</artifactId>
                    <version>${version.plugin.wildfly}</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>${version.plugin.war}</version>
                    <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                        <!-- 如果你有一个已有的 web.xml 文件,可以使用以下配置 -->
<!--                         <webxml>src/main/webapp/WEB-INF/web.xml</webxml> -->
                    </configuration>
                </plugin>
            </plugins>

        </pluginManagement>
    </build>

    <repositories>
        <repository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
        <repository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>jboss-public-maven-repository</id>
            <name>JBoss Public Maven Repository</name>
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>redhat-ga-maven-repository</id>
            <name>Red Hat GA Maven Repository</name>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-eap-ee-with-tools</artifactId>
                <version>${version.bom.ee}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>javax.servlet</groupId>-->
<!--            <artifactId>javax.servlet-api</artifactId>-->
<!--            <version>4.0.1</version>-->
<!--            <scope>provided</scope>-->
<!--        </dependency>-->
    </dependencies>

</project>

新建一个HelloWorldServlet去进行测试

package org.jboss.as.quickstarts.helloworld;

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("/HelloWorld")
public class HelloWorldServlet extends HttpServlet {

    static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>";

    static String PAGE_FOOTER = "</body></html>";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.println(PAGE_HEADER);
        writer.println("<h1> Hello World! </h1>");
        writer.println(PAGE_FOOTER);
        writer.close();
    }
}

改一下jsp快速测试

<html>
<head>
    <meta http-equiv="Refresh" content="0; URL=HelloWorld">
</head>
</html>