我目前正在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应用程序。
答案 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:)