1

我有一个项目到期(实际上是过度的)学校,但不能让一些简单的工作。

我正在运行 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>
4

2 回答 2

0

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

于 2012-11-29T15:38:36.787 回答
0

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

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

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

于 2012-11-29T15:47:04.160 回答