0
 $ java -version java version "1.6.0_45" Java(TM) SE Runtime
 Environment (build 1.6.0_45-b06-451-10M4406) Java HotSpot(TM) 64-Bit
 Server VM (build 20.45-b01-451, mixed mode)

Tomcat版本:7.0.40

我在这里关注开始的 servlet/jsp 教程:

https://stackoverflow.com/tags/servlets/info

我收到了这个错误:

HTTP 状态 500 - 绝对 uri: http: //java.sun.com/jsp/jstl/functions无法在 web.xml 或随此应用程序部署的 jar 文件中解析

看起来它来自以这一行开头的 .jsp 文件:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<!DOCTYPE html>
<html lang="en">

我像这样编译了我的servlet:

~/java_programs/modernServlet$ javac -cp /Library/Tomcat/lib/servlet-api.jar -d classes src/com/example/controller/HelloServlet.java

然后我将该文件复制到Tomcat目录中WEB-INF类下的相同目录结构中。我应该在类路径中包含其他一些 jar 文件吗?

====

好的,我下载并复制了jstl jar到Tomcat的lib目录,现在我得到了各种编译错误:

$ javac -cp "/Library/Tomcat/lib/servlet-api.jar;/Library/Tomcat/lib/jstl-1.2.jar" -d classes src/com/example/controller/HelloServlet.java
src/com/example/controller/HelloServlet.java:7: package javax.servlet does not exist
import javax.servlet.ServletException;
                    ^
src/com/example/controller/HelloServlet.java:8: package javax.servlet.annotation does not exist
import javax.servlet.annotation.WebServlet;
                               ^
src/com/example/controller/HelloServlet.java:9: package javax.servlet.http does not exist
import javax.servlet.http.HttpServlet;
                         ^
src/com/example/controller/HelloServlet.java:10: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
                         ^
src/com/example/controller/HelloServlet.java:11: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletResponse;
                         ^
src/com/example/controller/HelloServlet.java:14: cannot find symbol
symbol: class HttpServlet
public class HelloServlet extends HttpServlet {
                                  ^
src/com/example/controller/HelloServlet.java:13: cannot find symbol
symbol: class WebServlet
@WebServlet("/hello")
 ^
src/com/example/controller/HelloServlet.java:17: cannot find symbol
symbol  : class HttpServletRequest
location: class com.example.controller.HelloServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                         ^
src/com/example/controller/HelloServlet.java:17: cannot find symbol
symbol  : class HttpServletResponse
location: class com.example.controller.HelloServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                                                     ^
src/com/example/controller/HelloServlet.java:17: cannot find symbol
symbol  : class ServletException
location: class com.example.controller.HelloServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                                                                                          ^
src/com/example/controller/HelloServlet.java:23: cannot find symbol
symbol  : class HttpServletRequest
location: class com.example.controller.HelloServlet
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                          ^
src/com/example/controller/HelloServlet.java:23: cannot find symbol
symbol  : class HttpServletResponse
location: class com.example.controller.HelloServlet
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                                                      ^
src/com/example/controller/HelloServlet.java:23: cannot find symbol
symbol  : class ServletException
location: class com.example.controller.HelloServlet
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                                                                                           ^
src/com/example/controller/HelloServlet.java:16: method does not override or implement a method from a supertype
    @Override
    ^
src/com/example/controller/HelloServlet.java:22: method does not override or implement a method from a supertype
    @Override
    ^
15 errors
4

2 回答 2

1

这不是编译错误。这是一个运行时错误。

您只需要按照JSTL 标记 wiki 页面(以及JSP 标记 wiki 页面)中/WEB-INF/lib的说明将 JSTL 放入。

您不需要在编译时类路径中指定它。这是一个运行时错误,而不是编译错误。您成功编译了 servlet,对吧?

尝试在类路径中使用 JSTL 进行编译时出现编译错误是因为您在类路径中使用了 Windows 特定;的路径分隔符,而您使用的是基于 Unix 的操作系统,该操作系统期望:作为路径分隔符。但毕竟,编译时类路径中不需要 JSTL。

于 2013-06-10T16:37:01.027 回答
0

您需要将 JSTL jar 添加到 Tomcat lib 文件夹。

你可以去这里下载它:http: //mvnrepository.com/artifact/javax.servlet/jstl/1.2

单击“下载”按钮,然后将该文件复制到 Tomcat 的 lib 文件夹中。

新错误意味着类路径中缺少 servlet-api.jar。

于 2013-06-10T15:43:24.333 回答