ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

ejb+jpa

很长时间以来,我听到很多人对Arquillian说好话 。 尽管我一直在阅读有关其用法的文章,但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然,我看起来还不够努力。

我要讲的要点是:

  • 使用JPA。 我只是在这里使用EclipseLink,
  • 使用内存数据库
  • 使用CDI注射,
  • EJB的使用,例如本地无状态会话Bean,
  • 使用JSR-303 Bean验证,
  • 使用(嵌入式)玻璃鱼进行集成测试。

我花了一些时间来收集信息以启动并运行该项目。 我以为我专门写这篇文章来帮助那些有类似要求的人。 那么,我们还在等什么! 开始吧!!!

配置pom.xml

当然,我们需要配置项目以使用Arquillian,还需要使用EclipseLink作为持久性提供程序。 但是,请记住,在决定使用内存数据库之前,我们也要做出决定。 您可能希望在此pom.xml中包括您的依赖项。 但是,我决定使用Derby,它在标准Oracle Java SDK类路径中可用。

无论如何,所以pom.xml看起来像这样:

<?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><parent><artifactId>inout</artifactId><groupId>id.co.dwuysan</groupId><version>1.0-SNAPSHOT</version></parent><groupId>id.co.dwuysan</groupId><artifactId>inout-ejb</artifactId><version>1.0-SNAPSHOT</version><packaging>ejb</packaging><name>inout-ejb</name><properties><endorsed.dir>${project.build.directory}/endorsed</endorsed.dir><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server></properties><dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.0.0.Final</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>2.3.2</version><scope>provided</scope></dependency><dependency><groupId>org.eclipse.persistence</groupId><artifactId>javax.persistence</artifactId><version>2.0.3</version><scope>provided</scope></dependency><dependency><groupId>org.eclipse.persistence</groupId><artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId><version>2.3.2</version><scope>provided</scope></dependency><!-- test --><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.0.3.Final</version><type>pom</type></dependency><dependency><groupId>org.glassfish.main.extras</groupId><artifactId>glassfish-embedded-all</artifactId><version>3.1.2.2</version><scope>provided</scope></dependency><dependency><groupId>org.jboss.arquillian.container</groupId><artifactId>arquillian-glassfish-embedded-3.1</artifactId><version>1.0.0.CR3</version><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-container</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- environment requirement --><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>6.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><configuration><argLine>-XX:-UseSplitVerifier</argLine><systempropertyvariables><java.util.logging.config.file>${basedir}/src/test/resources/logging.properties</java.util.logging.config.file></systempropertyvariables><systemProperties><property><name>derby.stream.error.file</name><value>target/derby.log</value></property></systemProperties></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.7</source><target>1.7</target><compilerArguments><endorseddirs>${endorsed.dir}</endorseddirs></compilerArguments><showDeprecation>true</showDeprecation></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-ejb-plugin</artifactId><version>2.3</version><configuration><ejbVersion>3.1</ejbVersion></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.1</version><executions><execution><phase>validate</phase><goals><goal>copy</goal></goals><configuration><outputDirectory>${endorsed.dir}</outputDirectory><silent>true</silent><artifactItems><artifactItem><groupId>javax</groupId><artifactId>javaee-endorsed-api</artifactId><version>6.0</version><type>jar</type></artifactItem></artifactItems></configuration></execution></executions></plugin></plugins></build><repositories><repository><id>java.net</id><url>http://download.java.net/maven/</url></repository><repository><id>JBOSS_NEXUS</id><url>http://repository.jboss.org/nexus/content/groups/public</url></repository><repository><url>http://download.eclipse.org/rt/eclipselink/maven.repo/</url><id>eclipselink</id><layout>default</layout><name>Repository for library EclipseLink (JPA 2.0)</name></repository></repositories>
</project>

如上面的XML所示,我们所做的事情是:

  • 包括使用Arquillian,使用嵌入式Glassfish
  • 包括使用EclipseLink
  • 设置Derby道具以备后用,即记录和创建数据库的位置。

创建“案例”,即我们的JPA,EJB,CDI

当然,我们首先要创建一个案例,以便以后进行测试。 我假设您熟悉JPA,EJB,CDI。 因此,下面是使用这些技术的类的快速概览。

JPA类,Outlet.java

package id.co.dwuysan.inout.entity;// imports omitted@Entity
@NamedQueries({@NamedQuery(name = Outlet.FIND_BY_NAME,query = "SELECT o FROM Outlet o WHERE o.name = :name")
})
public class Outlet implements Serializable {public static final String FIND_BY_NAME = "Outlet#FIND_BY_NAME";@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;@Column(name = "code", length = 50, insertable = true, updatable = false, unique = true)@Size(message = "{dwuysan.nameSizeError}", min = 1, max = 50)@NotNullprivate String name;/* Accessors and mutators goes here */@Overridepublic int hashCode() {// omitted}@Overridepublic boolean equals(Object obj) {// omitted}
}

Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="inoutPU" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><jta-data-source>inoutDb</jta-data-source><exclude-unlisted-classes>false</exclude-unlisted-classes><properties><property name="eclipselink.ddl-generation" value="drop-and-create-tables"/></properties></persistence-unit>
</persistence>

然后,我们添加一个生产者方法以提供我们的PersistenceContext以及使用它的EJB。

EntityManagerProducer.java

package id.co.dwuysan.inout.util;import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;public class EntityManagerProducer {@Produces@PersistenceContextprivate EntityManager em;
}

OutletService.java

package id.co.dwuysan.inout.service;// imports omitted@Stateless
@LocalBean
public class OutletService {@Injectprivate EntityManager em;@Resourceprivate Validator validator;public Outlet createOutlet(final String name) {final Outlet outlet = new Outlet();outlet.setName(name);final Set<ConstraintViolation<Outlet>> violations = this.validator.validate(outlet);if (!violations.isEmpty()) { throw new ConstraintViolationException(new HashSet<ConstraintViolation<?>>(violations)); }return this.em.merge(outlet);}public Outlet getOutlet(final String name) {final Query query = this.em.createNamedQuery(Outlet.FIND_BY_NAME);query.setParameter("name", name);try {return (Outlet) query.getSingleResult();} catch (NoResultException e) {return null;}}
}

设置beans.xml和ValidationMessages.properties

不要忘记:

      • 在src / main / resources / META-INF下添加beans.xml ,并
      • 在src / main / resources下添加ValidationMessages.properties ,并
      • dwuysan.nameSizeError= error message you like here配置您的消息dwuysan.nameSizeError= error message you like here

配置用于测试目的

在这一点上,如果您部署,它应该可以工作。 但是,这不是我们的目标。 我们希望使用嵌入式Glassfish使它在Arquillian下工作。

首先,让我们使用Derby数据库准备嵌入式玻璃鱼的配置。 该文件是glassfish-resources.xml 。 就我而言,我只是将该文件放在一个新目录下,主要用于分离,即src/test/resources-glassfish-embedded/glassfish-resources.xml

glassfish-resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC"-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN""http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources><jdbc-resource pool-name="ArquillianEmbeddedDerbyPool"jndi-name="jdbc/arquillian"/><jdbc-connection-pool name="ArquillianEmbeddedDerbyPool"res-type="javax.sql.DataSource"datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource"is-isolation-level-guaranteed="false"><property name="databaseName" value="target/databases/derby"/><property name="createDatabase" value="create"/></jdbc-connection-pool>
</resources>

这是不言自明的。 只需记住将要配置的数据库配置为在target/databases/derby上创建,以便在执行mvn clean时将对其进行清理。

下一步是配置Arquillian以“识别”glassfish-resources.xml 。 为此,请在src/test/resources目录下添加arquillian.xml

glassfish-resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"><engine><property name="deploymentExportPath">target/arquillian</property></engine> <container default="true" qualifier="glassfish"><configuration><property name="resourcesXml">src/test/resources-glassfish-embedded/glassfish-resources.xml</property></configuration></container>
</arquillian>

下一步是准备我们的persistence.xml 。 我们已经有一个,但要记住,我们需要提供一个它是在内存中,并利用我们的嵌入式Glassfish的提供的JDBC连接(见glassfish-resources.xml上方,提供了jdbc-resource-pool下JNDI名称为jdbc/arquillian ,在我的情况下,我将此名称为test-persistence.xml命名为src/test/resources

test-persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="inoutPU" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider><jta-data-source>jdbc/arquillian</jta-data-source><exclude-unlisted-classes>false</exclude-unlisted-classes><shared-cache-mode>ALL</shared-cache-mode><properties><property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /><property name="javax.persistence.jdbc.url" value="jdbc:derby:target/databases/derby;create=true" /><property name="eclipselink.ddl-generation" value="drop-and-create-tables" /><property name="eclipselink.target-database" value="Derby"/><property name="eclipselink.ddl-generation" value="drop-and-create-tables"/><property name="eclipselink.debug" value="OFF"/><property name="eclipselink.weaving" value="static"/><!--<property name="eclipselink.logging.level" value="FINEST"/>--><property name="eclipselink.logging.level.sql" value="FINE"/><property name="eclipselink.logging.parameters" value="true"/><!--<property name="eclipselink.logging.level.cache" value="FINEST"/>--><property name="eclipselink.logging.logger" value="DefaultLogger"/></properties></persistence-unit>
</persistence>

一切准备就绪后,我们现在就可以与Arquillian一起编写单元测试了。 在这种情况下,最好测试我们的服务EJB,因为这是我们将使用JPA,CDI和Validation的地方。

OutletServiceTest.java

package id.co.dwuysan.inout.service;// imports omitted@RunWith(Arquillian.class)
public class OutletServiceTest {    @Injectprivate OutletService outletService;@Deploymentpublic static JavaArchive createTestArchive() {return ShrinkWrap.create(JavaArchive.class).addClass(Outlet.class).addClass(OutletService.class).addClass(EntityManagerProducer.class).addAsManifestResource("test-persistence.xml",ArchivePaths.create("persistence.xml")).addAsManifestResource("META-INF/beans.xml",ArchivePaths.create("beans.xml")).addAsResource("ValidationMessages.properties");}@Testpublic void testCreateOutlet() throws Exception {final String outletName = "Outlet 001";final Outlet outlet = this.outletService.createOutlet(outletName);Assert.assertNotNull(outlet);// check retrievalfinal Outlet retrievedOutlet = this.outletService.getOutlet(outletName);Assert.assertEquals(outlet.getName(), retrievedOutlet.getName());}@Test(expected = ConstraintViolationException.class)public void testCreateOutletWithEmptyName() throws Exception {try {final Outlet outlet = this.outletService.createOutlet("");} catch (EJBException e) {             final ConstraintViolationException cve = (ConstraintViolationException) e.getCause();Assert.assertEquals("Total error message should only be one",1, cve.getConstraintViolations().size());            Assert.assertEquals("Message must be correct","Name must be provided",cve.getConstraintViolations().iterator().next().getMessage());throw cve;}}
}

在上面的示例中,第一个测试是测试成功的案例。 给定名称,检索将导致提供与参数相同名称的Outlet实体返回。 但是,在表面之下,如果我们回顾OutletService.java的主体,我们实际上正在测试:

      • 持久性(JPA),进入基础Derby
      • EJB注入此测试/ li>
      • 通过Producer方法(CDI)注入的PersistenceContext
      • 测试没有违反验证
      • 测试我们的NamedQuery

第二项测试旨在测试消息是否正确内插。 参考前面提到的内容,对于我的错误消息,我将以下条目放入ValidationMessages.properties

dwuysan.nameSizeError=Name must be provided

因此,我们需要测试来自“ Outlet验证”中的Bean验证的消息是否正确内插。

请注意第二项测试。 注意,首先,我们正在捕获EJBException 。 那是因为在EJB中抛出的任何运行时异常都将被包装到EJBException ,因此需要通过#getCause()提取它。

所以,你去了。 您现在可以添加更多服务并开始Arquillian测试。 快乐编码

未来调查

当然,许多Java EE应用程序都需要认证和授权,这通常是通过JAAS完成的。 例如,使用上面的简单示例,假设要修改服务以检索当前用户可以访问的出口,那么我们当然需要获取当前用户的身份。 通常,这是通过EJBContext.getCallerPrincipal() . I wonder how we can do this using Arquillian and embedded Glassfish. EJBContext.getCallerPrincipal() . I wonder how we can do this using Arquillian and embedded Glassfish.

参考:在dwuysan博客博客上,我们的JCG合作伙伴 Deny Wuysan 使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试了Java EE 6 。

翻译自: https://www.javacodegeeks.com/2013/09/testing-java-ee-6-with-arquillian-incl-jpa-ejb-bean-validation-and-cdi.html

ejb+jpa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。

spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!

spring booSpring-boot提供了一种创建基于Spring的应用程序的快速方法。 对于下一个项目&#xff0c;有一些非常令人信服的理由考虑使用Spring-boot&#xff1a; 原因1&#xff1a;使用spring-boot启动程序项目进行更简单的依赖性管理。 考虑使用CR2是使用h2数据库来实现的&am…

自适应滤波实例之系统辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由5阶FIR低通滤波器模拟) h=[0.2,0.5,0.7,-0.5,0.2]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)(此时即为期望信号d(n))和训练序列x’(n)求未知的h(n) LMS实验结果 设自适应滤波器…

jdbc数据库连接池C3P0和Druid德鲁伊,Java与MySQL数据库交互

文章目录一、 连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池四、C3P0数据库连接池五、Druid&#xff08;德鲁伊&#xff09;数据库连接池六、C3P0和Druid驱动jar包一、 连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步…

使用Spring Boot构建REST Web服务

本教程提供了有关如何使用Spring Boot构建Restfull Web服务的分步指南。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为Spri…

Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作

文章目录一、Apache-DBUtils简介二、主要API的使用1、DbUtils类2、QueryRunner类3、ResultSetHandler接口及实现类三、Apache-DBUtils驱动下载一、Apache-DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c…

自适应滤波实例之系统逆辨识(以及系统零极点对逆辨识效果的影响分析)

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

卡尔曼滤波实例之系统逆辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

static和瞬态_具有瞬态属性的视图对象的钝化和激活

static和瞬态在应用程序模块的钝化/激活周期内&#xff0c;框架也将钝化并激活视图对象。 通常&#xff0c;框架保存有关VO状态&#xff0c;当前行&#xff0c;绑定变量值等的信息。 但是没有数据。 激活视图对象后&#xff0c;将重新执行VO的查询&#xff0c;并重新获取数据。…

你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?

文章目录一、正经的开始 &#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;二、HTML简介1、HTML“化简为繁”2、超文本“醉翁之意”3、标记“画地为牢”4、永远的HelloWorld5、HTML文件“解衣”6、HTML“潜规则”三、使用HTML展示文章1、标题“…

自适应滤波实例之噪声抵消

实验模型 s(n)是立体声音乐信号,fs=8kHz,平均功率为0.0047; v(n)是零均值高斯白噪声,方差为1; h(n)是由5阶FIR低通滤器模拟,带宽为[0, 0.35fs]; 目标:d(n)中包含音乐信号s’(n)和白噪声v’(n),v’(n)为v(n)经过系统h(n)后的输出,则x(n)=v(n)与v’(n)具有相关性,利…

初学JavaWeb,前端css要不要了解一下啊?一文学会JavaWeb中css的简单应用

文章目录一、设置CSS样式二、CSS代码语法三、CSS选择器四、css文档手册分享关于JavaWeb中的HTML&#xff1a;《你是不是已经超纲了&#xff1f;一文解决JavaWeb中要求的HTML&#xff0c;是什么样的&#xff1f;》 一、设置CSS样式 有三种设置方式。 1、在HTML标签内设置&#…

了解Java中的可克隆接口

什么是对象克隆&#xff1f; 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间&#xff0c;可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时&#xff0c;所做的更改不会反映在克隆对象中的原因。 我们可…

堆栈图解CSAPP Bomb Lab实验解析

CSAPP Bomb Lab 实验解析 Bomblab是csapp的第二个配套实验&#xff0c;该实验提供了一个bomb二进制文件和一个bomb.c源文件&#xff0c;我们的目标是运行bomb并按照提示一步步输入字符串&#xff0c;直到完成整个拆炸弹的流程。但是源文件中只提供了部分代码&#xff0c;所以我…

初学JavaWeb需要的前端js,JavaScript是什么样的?

文章目录一、JavaScript简介二、HelloWorld三、JavaScript基本语法四、DOM五、JavaScript事件驱动六、网页制作完全手册分享关于HTML和css详见&#xff1a;《JavaWeb中的HTML和css》 一、JavaScript简介 1、起源 1995年&#xff0c;JavaScript由Netscape公司的Brendan Eich在网…

OD汇编指令集(不断更新)

一、快捷键 F7 执行一行代码&#xff0c;遇到 CALL 等子程序时会进入其中&#xff0c;进入后首先会停留在子程序的第一条指令上。 F8 执行一行代码&#xff0c;遇到 CALL 等子程序不进入其代码。 F2 在显著行设置断点&#xff0c;再次按 F2 删除断点。 F9 F9运行调试程序&…

踩坑+排雷新版IDEA2021.1创建配置Javaweb项目并部署在Tomcat容器,完整详细

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;tomcat 获取…