java 获取当前类路径-java 获取当前路径
1.Servlet规范的具体实现(1.WEB-INF 2.classes 3.lib 4.web.xml)
1.引言
本实验的目的是,用官方提供的Servlet接口实现一个网络应用(web application)。该实现过程可以探究在Tomcat下,基于Servlet的网络应用的实现过程,更清楚地了解Servlet的本质,为后续使用Springboot框架打下良好的基础。
2.实验过程 在Tomcat的根目录下的webapps文件夹中新建一个文件夹,其目录如下所示。其中Name为项目名,可以任意选择(在本文中以crm命名);WEB-INF包含了classes、lib两个文件java 获取当前类路径,分别用于存放Java源代码文件编译后的字节码文件、第三方jar包。web.xml存放配置信息。
- Name
- WEB-INF
- classes (存放Java源代码文件编译后的字节码文件)
- lib (第三方jar包)
- web.xml (Servlet的配置文件)
- 前端内容(静态资源)
首先编写Java源代码文件,并对其进行编译,将编译后的字节码文件放在classes中。Java源代码文件如下。
import jakarta.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Hello World");
}
//仅override Servlet中的 void service()方法,其他方法省略....
}
由于是脱离IDEA进行编译,所以直接对上述Java文件进行编译是无法成功的,因为编译时找不到jakarta.servlet.*这一类库,于是需要将包含这一类库的Jar包添加到系统变量中去。即新建一个环境变量CLASSPATH,其值为包含servlet-api.jar的路径(路径的形式为…/servlet-api.jar)。如果使用IDEA中的Maven导入jakarta.servlet.*,则需要保证Project的JDK版本与Jakarta.servlet.*支持的版本一致,否则会报例如该链接中的错误: 。
对上述源代码文件进行编译后,将编译后的字节码文件放在classes文件夹中。接下来需要建立访问路径和对应的字节码文件之间的映射关系,需要用到xml文件。在WEB-INF目录下新建一个web.xml文件,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet/index</url-pattern>
</servlet-mapping>
</web-app>
请注意,尽可能不要在xml文件中插入中文字符,否则可能会出现未知错误,这些错误可以在Tomcat的日志文件中找到,例如在2023-06-02的错误信息可以在catalina.2023-06-02.log中寻找到。由此建立访问路径与字节码文件之间的映射,其访问路径如下:
主机名:端口号/项目名/url-pattern
在本文中,访问路径即如下所示:
127.0.0.1:8080/crm/HelloServlet/index
3.实验结果与分析
图1-1 可以看出最后一行输出了Hello World,这就是上述源代码文件中service()函数的功能。
从源代码文件java 获取当前类路径,即HelloServlet文件中可以看出,并没有主函数入口的出现。据此可以得到的结论如下:主函数入口的功能已经集成到Tomcat服务器中。Tomcat服务器通过反射实例化Servlet对象,并调用相应的Service函数来实现相关功能。