我有一个项目到期(实际上是过度的)学校,并不能让一些简单的工作。
我正在运行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来返回一个map keyset。
甚至不让我开始使用getter / setter的命名约定(大写转换为小写,在前面添加get / set)
也许是我,但整个设置似乎过于迟钝,难以理解且不必要地复杂化。
感谢您阅读我的咆哮。我一直在这种方式,然后我认为我应该,并且几乎要试图做简单的事情。
</rant>
答案 0 :(得分:0)
为什么要将servlet与会话管理和JSF页面混合使用?在使用JSF时,你必须不再考虑http请求/响应范例,它是一个事件驱动的框架,与桌面GUI编程有更多共同之处。当然,JSF 不是最友好的Web框架,但是你使它变得比它需要的更复杂。
答案 1 :(得分:0)
传递给getRequestDispatcher
的路径是相对于上下文根的。
通过向其添加上下文路径,您最终得到的/CMIS440Spitzer-Project2/CMIS440Spitzer-Project2/faces/ItemAdd.xhtml
不存在。
(实际上,它是相对于上下文根,如果它以斜杠开头,就像这个一样。如果它不以斜杠开头,则它相对于servlet。)