【问题标题】:Java EE - Show page based on internal business logicJava EE - 基于内部业务逻辑的显示页面
【发布时间】:2015-03-16 22:03:32
【问题描述】:

我正在 Glassfish 服务器上使用 Java EE 实现企业应用程序。我需要我的应用程序执行一些逻辑来显示特定 URL 子集的正确输出。

问题描述:

我的网页文件夹结构如下:

Web Pages
  Protected
    - CorrectPage.xhtml
    - A.xhtml
    - B.xhtml
  - Index.xhtml

我希望用户访问 URL:

/Protected/CorrectPage.xhtml

但用户不得访问以下网址:

/Protected/A.xhtml
/Protected/B.xhtml

当输入 URL /Protected/CorrectPage.xhtml 时,我想执行一些逻辑,并根据此逻辑的结果,我想显示 A.xhtml 或 B.xhtml,而没有任何可见的 URL 更改(重定向) .

目前尝试的解决方案:

我考虑过使用映射到 /Protected/*.xhtml 的 servlet,同时让 Faces Servlet 处理我的应用程序中的任何其他 URL。

并且拥有:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    if(*Requested URL is /Protected/CorrectPage.xhtml*) {
       if(logic())
          *Show A.xhtml*
       else
          *Show B.xhtml*
    } else
       *Show 404*

我的问题是我不知道如何实现 Show A.xhtml。我基本上想向客户端打印我的 xhtml 页面。

我还考虑过使用响应 PrintWriter 来解决最后一个问题。

PrintWriter pw = response.getWriter();

但这并不能解决我的问题,因为我不知道如何打印 xhtml 文件,同时还要评估其中包含的表达式语言。

结论

非常感谢任何帮助。即使这意味着改变我提议的结构中的某些内容。自然,如果 servlet 的创建不是解决我的问题的正确解决方案,我将离开那个轨道。

我只对用户将体验到的结果感兴趣。

提前致谢

【问题讨论】:

  • 使这些资源(XHTML 文件 - A.xhtml、B.xhtml...)在 WEB-INF 下可用,并基于此将请求转发给它们,“取决于这个逻辑我想显示 A.xhtml 或 B.xhtml,没有任何可见的 URL 更改”。 (使关联的操作方法返回适当的导航案例结果,例如return "/WEB-INF/pages/A.xhtml";)。
  • “我想显示 A.xhtml 或 B.xhtml,没有任何可见的 URL 更改(重定向)”,您希望用户在不更改 url 的情况下看到不同的页面,怎么样甚至可能?
  • 我会尝试解决方案 Tiny。我没想到。
  • @Tiny 我能够按照您的建议进行操作,并且能够使用 servlet 的逻辑访问这些文件。我遇到的问题是,由于某种原因,我放入 WEB-INF 的那些文件中包含的表达式语言根本没有被评估。
  • 我在实际应用中尝试了这种方法。我可以看到一切正常。 EL、<ui:include> 等的评估都是正确的。我刚刚使用与<p:commandButton><p:commandLink> 相关联的action 方法将请求转发给相关资源,例如return "/WEB-INF/pages/A.xhtml";

标签: java jakarta-ee servlets glassfish facesservlet


【解决方案1】:

您可以使用request.getRequestDispatcher("/protected/page[A|B]").forward(request, response)

【讨论】:

  • 请注意page[A|B]应被解读为正则表达式,即pageApageB
  • 感谢您的回答,但我认为这会递归调用我的 servlet。我的 servlet 也映射到“/protected/A.xhtml”,以避免从 URL 直接访问这些页面。
  • 我认为您可以简单地在页面中包含一些代码,以防止直接调用。
  • 你能指定一些吗?我不知道你具体在说什么代码,但我认为这可以解决我的问题。
  • 我现在是平板电脑,所以包含代码很困难,但是:
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2013-05-17
相关资源
最近更新 更多