在命令提示符上使用Java Servlet

时间:2013-06-08 22:01:14

标签: tomcat servlets web-development-server

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

  1. 与没有其他环境的编译器“直接接触”,
  2. 在我的上网本上使用它。 Eclipse在我的上网本上非常慢。
  3. 为此,我需要传递HttpServletRequestHttpServletResponse个对象 我的doXXX方法。我安装了Tomcat。据我所知,每当我在网页(?)上调用servlet时,Tomcat都会触发请求/响应。

    我应该在哪个文件夹中放置我的servlet以及应该打开哪个URL来使用它们? 这个document表示类文件 应该在\WEB-INF\classes之下。在这种情况下,一旦启动Tomcat,我应该输入什么URL?

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

2 个答案:

答案 0 :(得分:1)

首先,为了从命令行构建java代码,我建议您使用Apache Ant™而不是直接运行javac

要使用java构建Web项目,您必须注意每个Java Web项目都必须遵守here所述的标准目录布局。 web container使用Apache Tomcat所使用的目录(例如web.xml)来查找Web应用程序的资源,以便它可以正确运行。

现在你想开始编码。您需要组织代码和单独的Java源文件,应用程序将依赖的库和静态Web资源(图像,静态HTML文件,脚本,样式等)。

假设您已经创建了一个项目目录MyWebProject,布局看起来像这样:

- MyWebProject
    + src
    + src-web
    + lib

src下,你可以把你的java类包括你的servlet。一定要使用干净的包装结构。

src-web下,您可以放置​​静态网络资源。 build.xml也可以被视为静态资源,可以放在那里。

lib下,您可以在编译和运行时放置应用程序所需的第三方库(* .jar文件)。例如,您的应用程序可能需要一个jdbc-driver来操作数据库。

现在假设您已经创建了一个servlet MyServlet.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容器上编译和部署它。您可以通过创建<context>.xml文件并为每个步骤编写适当的目标来实现这一目标(${...}表示先前定义的变量/属性的值(请参阅答案末尾的完整build.xml文件) )):

<强>编译

设置javac的类路径,以便它可以找到servlet api jar和其他库

<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>

<强>捆绑

在名为deploy

的目录下创建java Web项目所需的目录结构
<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>

此时,如果您设置war file文件,我们可以运行网络应用程序,假设mwpctx.xml

CATALINA_HOME/conf/<engine>/<host>

并使用属性docBase指向部署目录(在您的情况下,engine很可能是Catalinahost将是localhost })。这样一个文件的内容可能如下所示:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:\Projects\MyWebProject\deploy"
         reloadable="true"
         crossContext="false">
</Context>

现在,您可以使用

形式的网址调用您的servlet
http://<host>:<port>/<context>/path

其中context是没有扩展名<context>.xml的上下文文件.xml的名称,因此mwpctx。 path是您使用@WebServlet指定的路径或使用web.xml元素<url-pattern/>指定的路径,因此masmyservlet

网址将是

http://localhost:8080/mwpctx/mas

http://localhost:8080/mwpctx/myservlet

另一种方法是创建{{3}}并将其放入目录CATALINA_HOME/webapps。这也可以通过一些蚂蚁任务来实现:

制作战争文件

<target name="war" depends="bundle">
    <jar jarfile="${dist}/${war}" basedir="${deploy}"/>
</target>

调用上面的ant目标将在${dist}指定的目录下创建war文件。它基本上将目录deploy的内容打包到存档中。

<强>部署

<target name="deploy" depends="bundle,war">
    <copy file="${dist}/${war}" todir="${catalina.home}/webapps" />
</target>

现在假设war文件的名称是mwp.war,您将能够使用与上述相同的形式使用url调用您的servlet,除了这次上下文的名称由没有扩展名.war的war文件的名称,因此网址将如下所示

http://localhost:8080/mwp/mas

http://localhost:8080/mwp/myservlet

(请记住,servlet配置了两次,两条路径从哪里开始)

最后这是项目布局:

- MyWebProject
    - src
        - mwp
            MyServlet.java
    - src-web
        web.xml
    + lib

这是完整的ant 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>

答案 1 :(得分: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结尾的网络应用竞争(我的示例中为/ myWebApp)中的任何网址。

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