【问题标题】:JSF LimitationsJSF 限制
【发布时间】:2010-10-21 07:02:46
【问题描述】:

我目前只是在 Java EE 6 堆栈中探索 JSF 2。

我发现 JSF 有很多限制,而且 ManagedBeans 的使用方式非常违反直觉/奇怪:

看来,为了执行一个动作事件,你必须使用<h:commandLink> 标签。例如,如果我是发布表单数据,那就太好了。但是在这种情况下,我想做的只是简单地使用 url 查看一本书,例如:viewBook?id=2。如果我使用的是 spring,那会很容易:

@Controller
public class BookController {

  @RequestMapping("/viewBook")
  public String viewBook(@RequestParam("id") Long id, Model model) {
       // all the method params(id, model) are provided by spring
       BookDTO book = bookService.load(id);
       model.addAttribute("book", book);
       return "BookView";
  }

}

但是使用 JSF,我必须:

<h:form>
  <h:commandLink value="#{bookController.viewBook}">
    <f:param name="id" value="#{book.id}"/>
  </h:commandLink>
</h:form>

和支持 bean:

@ManagedBean
public class BookController {

  private BookDTO book;

  public String viewBook() {

    Long id = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValueMap().get("id"));

    book = bookService.load(id);

    return "BookView";

  }
  // ...
}

问题是:有没有 JSF2 框架提供 Spring MVC 的功能?

另一个问题是: JSF 提供了哪些使用 Spring 无法轻松实现的功能?

在我看来,整个 JSF/Facelet 等技术过于复杂、过度设计和违反直觉。顺便说一句,我对 EJB 持有相同的观点。

这些视图是在探索 Java EE 6 之后通过编写一个小型 Java EE Web 应用程序形成的。

【问题讨论】:

    标签: java spring spring-mvc jsf-2


    【解决方案1】:

    Spring MVC 是一个基于请求的 MVC 框架。 JSF 是一个基于组件的 MVC 框架。这就是区别。如果您想要基于请求的 MVC,请使用一个,如果您想要基于组件的 MVC,请使用另一个。

    看到这个“荒谬的”结构——用 JSF 术语来说——我敢打赌,你实际上在 h:dataTable 中有一个书架,并且正在尝试获取当前选定的书。如果确实如此,那么您根本不需要传递参数。改用DataModel&lt;Book&gt; 来显示h:dataTable 中的书籍,去掉f:param 并按如下方式更新您的bean:

    @ManagedBean
    @ViewScoped
    public class BookController {
        private DataModel<BookDTO> bookModel;
        private BookDTO book;
    
        public String viewBook() {
            book = bookModel.getRowData();   
            return "BookView";
        }
    
        // ...
    }
    

    对于 JSF 2.0 中的 CRUD 示例,您可能会发现 this article 很有用。

    【讨论】:

    • 实际上,我只有
      • (输出封面/链接)
      ,输出 元素的想法对我没有吸引力。你是说我应该有 BookShelf bean 和 BookDetails bean,而不是 BookController?我很困惑您所说的 JSF 术语中的“无意义”构造是什么意思?
    • m...有趣,刚刚看了链接的文章,我想我开始看到基于组件的“范式”...除了数据表还有什么?我在哪里可以找到它的源代码?我想看看它是如何实现这样的逻辑的......
    • Tomahawk 组件库提供t:dataList,它呈现&lt;ul&gt;&lt;li&gt;。 Mojarra 中h:dataTable 的渲染器可以在com.sun.faces.renderkit.html_basic.TableRenderer 中找到。在c:forEach 中,您最好的选择是使用f:setPropertyActionListener 而不是DataModel。 JSTL 不与 JSF 同步运行。我建议使用 JSF 组件。另请参阅我在this question 上的回答。
    【解决方案2】:

    我认为您需要更多地研究 jsf ... ;) 您想要实现的是根据 url 中传递的参数向用户显示一些东西。

    这可以通过在你的视图中使用 JSF 的 preRenderView 事件来实现。

     <f:metadata>
        <f:viewParam name="team" value="#{teamEditView.team}"/>
     </f:metadata>
     <f:event type="preRenderView" listener="#{teamEditView.setup}"/> 
    

    在这里,您可以在托管 bean 中有一个名为“setup”的方法,该方法将被调用,并且您从数据源中提取数据的所有操作都可以根据 url 中传递的参数在此方法中完成,此处与团队匹配

    xxxx.faces?team=jsf
    

    你会在你的 bean 中得到这个值,你可以像上面提到的那样启动....

    关于 Java EE 6 和 JSF 2,它们已经成熟了很长一段路要等到你在 Java EE 6 之前的版本和 JSF 中做一些事情,你很幸运已经开始使用 JSF 2,它比 1.2 和一次有了巨大的改进你习惯了,它就会摇摆不定。

    学习曲线有点,但哪里不是……:)

    如果你是春天的爱好者,试试 CDI :)

    【讨论】:

    • 对不起,我不明白 f:event/f:viewParam 在这种情况下如何帮助我。我有一个 BookShelf.xhtml 视图,它在数据库中呈现书籍列表。对于每本书,我希望允许用户单击它并转到 BookDetails 页面。所以除非我使用
    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2012-07-01
    • 2012-09-13
    相关资源
    最近更新 更多