-1

我希望在命令提示符下使用 Java servlet。这是因为我想:

  1. 在没有其他环境的情况下与编译器“直接联系”,
  2. 在我的上网本上使用它。Eclipse 在我的上网本上非常慢。

为此,我需要HttpServletRequestHttpServletResponse对象传递给我的doXXX方法。我已经安装了 Tomcat。据我所知,每当我在 web-page(?) 上调用 servlet 时,Tomcat 都会触发请求/响应。

我应该把我的 servlet 放在哪个文件夹,我应该打开哪个 URL 来使用它们?该文档说类文件应该在\WEB-INF\classes. 在这种情况下,启动 Tomcat 后应该输入什么 URL?

注意:我知道我可以编写一个类来实现HttpServletRequestHttpServletResponse实例化。我也通过这个问题知道 Spring 有实现这两个接口的类。

4

2 回答 2

1

首先,对于从命令行构建 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(在您的情况下,很可能engineCatalina并且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/>,因此是masmyservlet

网址是

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>
于 2013-06-09T01:33:32.730 回答
0

为了便于访问,servlet 必须映射到 URL 模式。在 servlet 3.0(仅限于 tomcat 7)中,只需使用注释 servlet 即可完成

@WebServlet("/somePath")

在以前版本的规范中,您必须在WEB-INF/web.xml文件中声明 servlet,并使用<servlet-mapping>元素声明其映射。因此,如果您选择的模式是/somePath,例如,URL 将是

http://localhost:8080/myWebApp/somePath

如果模式是*.foo,您可以使用任何以.foo.

这是每个 servlet 教程都涵盖的内容。选择一个(最好是 oracle 的东西),然后阅读。

于 2013-06-08T22:09:45.950 回答