首先,对于从命令行构建 java 代码,我建议您使用Apache Ant™</a> 而不是javac
直接运行。
要使用 java 构建 web 项目,您必须知道每个 java web 项目都必须遵守此处描述的标准目录布局。Web 容器(例如Apache Tomcat )使用此处描述的目录来定位 Web 应用程序的资源,以便它可以正确运行。
现在你想开始编码。您需要组织您的代码并分离 Java 源文件、应用程序所依赖的库和静态 Web 资源(图像、静态 HTML 文件、脚本、样式等)。
假设您创建了一个项目目录MyWebProject
,布局将如下所示:
- MyWebProject
+ src
+ src-web
+ lib
您可以在src
下面放置您的 java 类,包括您的 servlet。一定要使用干净的包结构。
你可以在src-web
下面放置你的静态网络资源。web.xml也可以被认为是静态资源,可以放在那里。
您可以在lib
下面放置应用程序在编译和运行时需要的第三方库(*.jar 文件)。例如,您的应用程序可能需要一个 jdbc 驱动程序来操作数据库。
现在假设您创建了一个 servletMyServlet.java
package mwp;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.annotation.WebServlet;
@WebServlet("/mas")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head/><body><p>Hello, World Wide Web!</p></body></html>");
}
}
并配置它(使用注释@WebServlet
(仅 3.0 规范)或使用web.xml
文件)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wa="http://java.sun.com/xml/ns/javaee"
version="3.0"
schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>My web project</display-name>
<servlet>
<display-name>My Servlet</display-name>
<servlet-name>my_servlet</servlet-name>
<servlet-class>mwp.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my_servlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
并且您想在 Web 容器上编译和部署它。您可以通过创建build.xml文件并为每个步骤编写适当的目标来实现这一点(${...}
表示先前定义的变量/属性的值(请参阅答案末尾的完整 build.xml 文件)):
编译
设置类路径,javac
以便它可以找到 servlet api jars 和其他库
<path id="compile.classpath">
<fileset dir="${lib}">
<include name="*.jar"/>
</fileset>
<fileset dir="${catalina.home}/lib">
<include name="*.jar"/>
</fileset>
</path>
运行 javac
<target name="compile">
<mkdir dir="${bin}"/>
<javac srcdir="${src}" destdir="${bin}">
<classpath refid="compile.classpath"/>
</javac>
</target>
捆绑
在名为的目录下创建 java web 项目所需的目录结构deploy
<target name="prepare">
<mkdir dir="${deploy}"/>
<mkdir dir="${deploy}/WEB-INF"/>
<mkdir dir="${deploy}/WEB-INF/classes"/>
<mkdir dir="${deploy}/WEB-INF/lib"/>
<mkdir dir="${dist}"/>
</target>
将二进制文件(*.class 和 *.jar 文件)和静态 Web 资源复制到适当的位置:
<target name="bundle" depends="prepare,compile">
<copy todir="${deploy}/WEB-INF">
<fileset dir="${web-src}"/>
</copy>
<copy todir="${deploy}/WEB-INF/classes">
<fileset dir="${bin}"/>
</copy>
<copy todir="${deploy}/WEB-INF/lib">
<fileset dir="${lib}"/>
</copy>
</target>
此时,如果您设置了一个<context>.xml文件,您将能够运行 Web 应用程序,比如说mwpctx.xml
,在
CATALINA_HOME/conf/<engine>/<host>
并让它使用属性指向部署目录docBase
(在您的情况下,很可能engine
是Catalina
并且host
将会是localhost
)。此类文件的内容可能如下所示:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:\Projects\MyWebProject\deploy"
reloadable="true"
crossContext="false">
</Context>
现在您可以使用表单中的 url 调用您的 servlet
http://<host>:<port>/<context>/path
<context>.xml
其中 context 是没有扩展名的上下文文件的名称.xml
,因此mwpctx
. path 是您使用指定@WebServlet
的路径或使用 web.xml 元素指定的路径<url-pattern/>
,因此是mas
或myservlet
。
网址是
http://localhost:8080/mwpctx/mas
或者
http://localhost:8080/mwpctx/myservlet
另一种选择是创建一个战争文件并将其放入目录CATALINA_HOME/webapps
中。这也可以使用一些 ant 任务来实现:
创建战争文件
<target name="war" depends="bundle">
<jar jarfile="${dist}/${war}" basedir="${deploy}"/>
</target>
调用上面的 ant 目标会在 . 指定的目录下创建一个 war 文件${dist}
。它基本上将目录的内容打包deploy
到存档中。
部署
<target name="deploy" depends="bundle,war">
<copy file="${dist}/${war}" todir="${catalina.home}/webapps" />
</target>
现在假设war文件mwp.war
的名称是.war
,因此 url 看起来像这样
http://localhost:8080/mwp/mas
或者
http://localhost:8080/mwp/myservlet
(记住,servlet 被配置了两次,两条路径从何而来)
最后是项目布局:
- MyWebProject
- src
- mwp
MyServlet.java
- src-web
web.xml
+ lib
这是完整的蚂蚁build.xml
文件
<project name="MyWebProject" basedir="." default="deploy">
<property name="src" location="src" />
<property name="web-src" location="src-web" />
<property name="bin" location="bin" />
<property name="lib" location="lib" />
<property name="deploy" location="deploy" />
<property name="dist" location="dist" />
<property name="war" value="mwp.war" />
<property name="catalina.home" location="C:/Apache/apache-tomcat-7.0"/>
<path id="compile.classpath">
<fileset dir="${lib}">
<include name="*.jar"/>
</fileset>
<fileset dir="${catalina.home}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="deploy" depends="bundle,war">
<copy file="${dist}/${war}" todir="${catalina.home}/webapps" />
</target>
<target name="bundle" depends="prepare,compile">
<copy todir="${deploy}/WEB-INF">
<fileset dir="${web-src}"/>
</copy>
<copy todir="${deploy}/WEB-INF/classes">
<fileset dir="${bin}"/>
</copy>
<copy todir="${deploy}/WEB-INF/lib">
<fileset dir="${lib}"/>
</copy>
</target>
<target name="war" depends="bundle">
<jar jarfile="${dist}/${war}" basedir="${deploy}"/>
</target>
<target name="compile">
<mkdir dir="${bin}"/>
<javac srcdir="${src}" destdir="${bin}">
<classpath refid="compile.classpath"/>
</javac>
</target>
<target name="prepare">
<mkdir dir="${deploy}"/>
<mkdir dir="${deploy}/WEB-INF"/>
<mkdir dir="${deploy}/WEB-INF/classes"/>
<mkdir dir="${deploy}/WEB-INF/lib"/>
<mkdir dir="${dist}"/>
</target>
<target name="clean">
<delete includeemptydirs="true" verbose="true">
<fileset dir="${bin}" includes="**/**"/>
<fileset dir="${deploy}" includes="**/**"/>
<fileset dir="${dist}" includes="**/**"/>
</delete>
</target>
</project>