【问题标题】:404 error on valid URL from Servlet来自 Servlet 的有效 URL 出现 404 错误
【发布时间】:2012-11-29 15:31:41
【问题描述】:

我有一个项目到期(实际上是过度)上学,但无法完成一些简单的工作。

我正在运行 Netbeans 7.2.1、Glassfish 3.1.2.2 和最新的 Java JDK。

我有四个 JSF 页面,index.xhtml ItemAdd.xhtml、ItemCatalog.xhtml 和 ItemDetail.xhtml 以及一个 servlet SessionServlet。我已经验证我可以直接访问每个页面,即

http://localhost:8080/CMIS440Spitzer-Project2/faces/ItemDetail.xhtml 

有效。但是,当我从其中一个 JSF 页面转到我的 servlet 并转发请求时,我收到 glassfish 404 错误。

这是我非常简单的用于转发的 servlet 代码:

if (request.getParameter("target").contains("Add Item")) {
        String URL = request.getContextPath() + "/faces/ItemAdd.xhtml";
        System.out.print(URL);
        RequestDispatcher dispatcher = request.getRequestDispatcher(URL);
        dispatcher.forward(request, response);
    }

一个控制台,我得到以下内容,我可以将其粘贴到我的浏览器中并且它可以工作:

INFO: /CMIS440Spitzer-Project2/faces/ItemAdd.xhtml

由于我收到控制台消息,我知道请求正在到达 servlet,并且它正在访问正确的代码块,并且因为我收到 Glassfish 404 错误,我知道它正在正确端口上转发到我的机器。

RequestDispatcher 有什么问题?为什么这不起作用?

谢谢。

<rant>

这比这个问题包含更多,但我使用过 PHP、perl、C++、C、Java 和其他一些。我以前从来没有感觉到一种语言(在这种情况下是 Java 的 JSF 实现)正在积极地试图让我的生活尽可能地困难。例如,这个环境中很多需要的东西都是地图的形式: 需要一个所有请求参数的列表,你得到一个映射,需要一个所有会话参数的列表,你得到一个映射,等等。但是在 JSF 中你不能轻易地循环映射!为什么,因为它很慢。我发现一个链接基本上是来自 Java 开发人员的 Mea Culpa,他提到这将是 O(N) 速度,所以它会很慢。换句话说,Java JSF 开发人员预先优化了我的代码并要求我将映射转换为列表。

有一次,我在反射和访问私有方法/属性时遇到了一些奇怪的错误——现在我在代码中的什么地方做任何类似的事情。我使用标准的 getter/setter 来返回地图键集。

甚至不要让我开始了解 getter/setter 的命名约定(大写转换为小写,在前面添加一个 get/set)

也许是我,但整个设置似乎过于迟钝、难以理解且不必要地复杂。

感谢您阅读我的咆哮。我在这条路上的时间比我认为应该做的要长,而且在尝试做简单的事情时几乎要流泪。

</rant>

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    为什么要为会话管理和 JSF 页面混合使用 servlet?使用 JSF 时,您必须停止考虑 http 请求/响应范式,它是一个事件驱动的框架,与桌面 GUI 编程有更多的共同点。诚然,JSF不是最友好的网络框架,但你让它变得比它需要的复杂。

    【讨论】:

    • 因为我不知道更好,这就是讲师基本示例的工作方式:-)
    • @user1863569 很抱歉,您以错误的方式使用了这项技术,导致了很多不必要的挫败感。你最好先在谷歌上搜索一个教程并运行一个 hello world 示例,这样你就可以了解自己的方向
    • 我的问题是很多例子都在使用 script let's 或 jsf 1.x。也许我错过了 mvc 2 范例的要点,但我认为这就是控制器所做的:采取表单的结果,对模型数据进行一些处理,然后将其转发到新视图
    • @user1863569 没错,但是 JSF 有自己的控制器:FacesServlet。许多旧的 Web 层模式已经构建在框架中。每个 JSF 页面都负责验证、转换,所有数据最终都在一个支持 bean Java 对象中,而无需考虑请求参数、servlet、http get/post 等。
    • @user1863569 顺便说一句,请不要忘记点击左侧的复选标记来接受对您最有帮助的答案。
    【解决方案2】:

    您传递给getRequestDispatcher 的路径是相对于上下文根的。

    通过向其添加上下文路径,您将得到 /CMIS440Spitzer-Project2/CMIS440Spitzer-Project2/faces/ItemAdd.xhtml,它不存在。

    (实际上,如果它以斜线开头,它是相对于上下文根的,就像这个一样。如果它不以斜线开头,它是相对于 servlet。)

    【讨论】:

    • 非常令人沮丧的是,我在示例中找到了多个相同模式的示例。此外,为什么 Glassfish 404 错误没有告诉您什么路径不可用?如果我看到了,我自己就可以弄清楚。
    • @user1863569,您应该能够创建一个自定义错误页面,该页面可以为您提供此信息和其他有用的调试信息。至于为什么Glassfish默认不告诉你……我想这可能被认为是一种安全风险(webapp内部结构的信息泄露)。
    • 因为编程很难。这些工具不会为您完成工作,它只是您。您在这里的职责之一是确切地了解该技术的工作原理。当您这样做时,您无需再怀疑,您只需要知道,当您不知道时,您就知道去哪里寻找答案。
    • @user1863569,如果这是“正确”答案,请单击左侧的复选标记。如果没有,请告诉我缺少的内容,以便我进行更正。谢谢。
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2013-05-29
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多