JSF限制

时间:2010-10-21 07:02:46

标签: java spring spring-mvc jsf-2

我目前正在Java EE 6堆栈中探索JSF 2.

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

看来,为了执行动作事件,您必须使用<h:commandLink>标记。如果我是张贴表单数据,那就好了。但是在这种情况下,我想做的只是简单地使用网址查看一本书,例如:viewBook?id=2。如果我使用弹簧,那将很容易:

@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的功能?

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

在我看来,整个JSF / Facelet等技术过于复杂,过度设计和反直觉。我对EJBs btw持有相同的观点。

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

2 个答案:

答案 0 :(得分:2)

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

在JSF术语中看到这种“无意义”的构造 - 我敢打赌你实际上是h:dataTable中的一本书,并试图获得当前所选的书。如果确实如此,那么您根本不需要传递参数。请改用DataModel<Book>来显示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很有用。

答案 1 :(得分:1)

我认为你需要更多地研究一下jsf ......;) 你想要达到的目的是根据网址中传递的参数显示用户。

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

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

在这里你可以在你的托管bean中有一个名为“setup”的方法,你可以在这个方法中根据在url中传递的param来完成从数据源中提取数据的所有方法,这里匹配团队

xxxx.faces?team=jsf

你将在你的bean中获得这个值,你可以按照提到的那样启动....

关于Java EE 6和JSF 2,他们已经成熟了很长时间,等到你在Java EE 6之前的版本和JSF中做了什么,你很幸运能够开始使用JSF 2,这是一个超过1.2的巨大改进和一次你习惯了它,它摇滚。

学习曲线有点但不在哪里......:)

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