我希望在命令提示符下使用Java servlet。这是因为我想:
为此,我需要传递HttpServletRequest
和HttpServletResponse
个对象
我的doXXX
方法。我安装了Tomcat。据我所知,每当我在网页(?)上调用servlet时,Tomcat都会触发请求/响应。
我应该在哪个文件夹中放置我的servlet以及应该打开哪个URL来使用它们?
这个document表示类文件
应该在\WEB-INF\classes
之下。在这种情况下,一旦启动Tomcat,我应该输入什么URL?
注意:我知道我可以编写一个类来实现HttpServletRequest
和HttpServletResponse
来实例化。我也知道这个question Spring有实现这两个接口的类。
答案 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
<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
很可能是Catalina
而host
将是localhost
})。这样一个文件的内容可能如下所示:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:\Projects\MyWebProject\deploy"
reloadable="true"
crossContext="false">
</Context>
现在,您可以使用
形式的网址调用您的servlethttp://<host>:<port>/<context>/path
其中context是没有扩展名<context>.xml
的上下文文件.xml
的名称,因此mwpctx
。 path是您使用@WebServlet
指定的路径或使用web.xml元素<url-pattern/>
指定的路径,因此mas
或myservlet
。
网址将是
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的东西),并阅读它。