我希望在这篇文章中,我可以得到人们对JSF页面和支持bean之间接口的最佳实践的看法.
我永远无法解决的一件事是我的支持豆的结构.此外,我从未找到关于这个主题的好文章.
什么属性属于哪个支持bean?何时适合向给定bean添加更多属性,而不是创建新bean并将属性添加到其中?对于简单的应用程序,考虑到将一个bean注入另一个bean所涉及的复杂性,为整个页面只有一个支持bean是否有意义?支持bean是否应该包含任何实际的业务逻辑,还是应该严格包含数据?
随意回答这些问题以及可能出现的任何其他问题.
至于减少JSF页面和支持bean之间的耦合,我从不允许JSF页面访问任何支持bean属性的属性.例如,我从不允许以下内容:
<h:outputText value="#{myBean.anObject.anObjectProperty}" />
Run Code Online (Sandbox Code Playgroud)
我总是需要这样的东西:
<h:outputText value="#{myBean.theObjectProperty}" />
Run Code Online (Sandbox Code Playgroud)
支持bean值为:
public String getTheObjectProperty()
{
return anObject.getAnObjectProperty();
}
Run Code Online (Sandbox Code Playgroud)
当我循环遍历集合时,我使用包装类来避免向下钻取到数据表中的对象.
一般来说,这种方法对我来说是"正确的".它避免了视图和数据之间的任何耦合.如果我错了,请纠正我.
在JSF MVC框架中谁是Model,View和Controller?
我最近阅读了来自Neil Griffin的这篇文章,在不同种类的JSF Managed-Beans之间做出区分,这让我想到了我自己的应用程序中不同bean之间的区别.要快速总结一下要点:
Model Managed-Bean:这种类型的托管bean参与MVC设计模式的"模型"关注.当你看到"模型"这个词时 - 想想数据.JSF模型bean应该是遵循JavaBean设计模式的POJO,其中getter/setter封装属性.
支持托管Bean:这种类型的托管bean参与MVC设计模式的"视图"关注.backing-bean的目的是支持UI逻辑,并且与Facef组合中的JSF视图或JSF表单具有1 :: 1的关系.虽然它通常具有带有关联getter/setter的JavaBean样式属性,但它们是View的属性 - 而不是底层应用程序数据模型的属性.JSF支持bean也可能有JSF actionListener和valueChangeListener方法.
Controller Managed-Bean:这种类型的托管bean参与MVC设计模式的"Controller"关注.控制器bean的目的是执行某种业务逻辑并将导航结果返回给JSF导航处理程序.JSF控制器bean通常具有JSF操作方法(而不是actionListener方法).
支持Managed-Bean:这种类型的bean"支持"MVC设计模式的"View"关注中的一个或多个视图.典型的用例是向JSF h:selectOneMenu下拉列表提供ArrayList,这些列表出现在多个JSF视图中.如果下拉列表中的数据特定于用户,则bean将保留在会话范围内.
Utility Managed-Bean:这种类型的bean为一个或多个JSF视图提供某种类型的"实用程序"功能.一个很好的例子可能是FileUpload bean,它可以在多个Web应用程序中重用.
这对我来说很有意义,在过去的几个小时里,我一直在重构我的代码,并针对用户登录提出以下内容:
这AuthenticationController是Controller Managed-Bean的一个例子.它是请求范围的,具有两个用于设置用户名和密码的getter和setter,以及两种导航方法,authenticate并logout在成功登录时将用户导航到其私有区域,或者在注销时返回主页面.
这UserBean是一个支持管理Bean的示例.它是会话范围的,并且具有User类的实例(当您未经过身份验证时将使用getter和setter,它将为null),仅此而已.
该AuthenticationController有这个用户作为托管属性(@ManagedProperty(value = "#{userController.user} private User user;).验证成功后,AuthenticationController将使用用于登录的相应用户名将托管属性设置为实际用户实例.
任何新的bean都可以将用户作为托管属性获取并提取他们需要的数据,例如组成员资格,如果User该类具有包含组名的列表.
这种方式是关于分离问题的正确方法吗?
我正在考虑在我的新项目中使用MVC模式,我可以清楚地看到能够将数据层(模型)更接近表示层(视图)的主要优势,这将允许稍微增加在申请速度.但除了性能观点之外,MVC还是在视图 - 逻辑 - 数据分层类型模式上还有其他优势吗?
编辑: 对于那些感兴趣的人我刚刚上传了我创建的示例PHP代码来测试MVC的使用.我故意省略所有安全检查以使代码更容易阅读.请不要过多批评它,因为我知道它可以更加精致和先进,但不过 - 它有效!我将欢迎提出问题和建议:链接如下:http://www.sourcecodester.com/sites/default/files/download/techexpert/test_mvc.zip
model-view-controller design-patterns 3-tier n-tier-architecture n-layer
让我们举一个基本的例子.在servlet应用程序中,我将拥有这些类:
Register(User).会打电话给DAO.WEB-INF\JSPs\registration.jsp哪个会处理视图.所有这些对我来说都很有意义,并且明确区分了这些问题.
我已经尝试过围绕JSF/Facelets的思维方式.我已经在SO和其他地方经历了许多优秀的资源,但是没有任何地方可以解决这个简单的问题 - 即dao/service/controller/view模式如何转换为JSF.
继续我的例子 - 我已经在eclipse中设置了一个JSF项目,已经将我的数据库模式转换为"entities"现在我想知道 - 我应该创建什么样的类来处理用户注册?我知道我必须为视图创建xhtml页面,但控制器在哪里?
请不要指教我- 我知道很多,其中@BalusC一个 - 我的问题不是让这个工作,而是要了解模式.我已经看到"session"包中包含"托管bean","抽象外观"模式等等,但没有任何东西可以像旧的servlet模式一样清晰.
所以 - 在DB创建的"实体"中,有一个看起来像模型的User.java类.该视图将是一个xhtml.控制器?
注意:这并不是要求这么多重复这些技术之间的差异 - 我要求将非常清晰直观的控制器/ dao /服务模式清晰地转换为JSF框架 - 或明确声明不存在这样的技术翻译.
也可以看看:
我开始学习 JSF,但首先我想了解它作为 MVC 框架的总体情况。
有几个得到很多赞同的答案解释了 JSF 中的 MVC 层,但它们通常是相互矛盾的。
BalusC的回答: JSF MVC框架中的MVC是什么组件?
在大的架构图中,您自己的 JSF 代码是V:
M - 业务领域/服务层(例如 EJB/JPA/DAO)
V - 您的 JSF 代码
C - FacesServlet在开发者图中,架构V依次可分如下:
M - 实体
V - Facelets/JSP 页面
C - 托管 bean
Jigar Joshi 在同一线程中的回答:
模型将是你的
ManagedBean视图将是
jsp,XHTML(好吧,你可以在这里容纳各种视图)控制器将是
FacesServlet
这里,对这个问题的另一种看法:
在 JSF 中,您不实现控制器。因此,支持 bean 或任何其他类型的托管 bean 都不是控制器。
还有一个,这次不是来自 Stackoverflow:
在 JSF 中,主控制器始终是 FacesServlet。子控制器被合并到各种控制元素标签实现中。您几乎从未在 JSF 中编写控制器代码,因为它都是预先提供的。因此,您只需提供视图模板 (xhtml) 和模型(支持 …
我正在尝试使用在IceFaces页面上找到的模式.(我没有使用IceFaces,使用PrimeFaces)
在这种情况下,我有两个豆:
UserController 和Usermodel
在我的UserModel上,我有一个UserVO实例(由另一个程序员创建).在我的UserController上我有这个:
@ManagedBean
@RequestScoped
public class UserController implements Serializable
{
private static final long serialVersionUID = 1L;
private UserBO bo;
private UserModel model;
public UserController()
{
bo = new UserBO();
model = new UserModel();
}
public void Login() throws IOException
{
model.setUserVo(bo.executeLogin(model.getUserVo()));
ExternalContext externalContent = FacesContext.getCurrentInstance().getExternalContext();
if (!model.getUserVo().isError())
{
model.setLoggedIn(true);
externalContent.getSessionMap().put("userSession", model);
externalContent.redirect(externalContent.getRequestContextPath() + "/views/request/search.html");
} else
{
model.setLoggedIn(false);
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, model.getUserVo().getMessage(), model.getUserVo().getLogin());
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
}
} …Run Code Online (Sandbox Code Playgroud) <c:set var="product" value="#{productDAO.findByCode('code')}" />
#{product.name}
#{product.name}
Run Code Online (Sandbox Code Playgroud)
我想从DB中检索一个对象并将其存储到变量中一次.但是,我发现每次访问产品时都会调用DB.在上面的示例中,有两个对DB的调用.
我现在在我的一个应用程序中使用ZK Framework.ZK Framework支持MVC以及MVVM设计模式.现在我想用一个新项目来使用JSF.JSF是支持设计模式还是仅支持MVC?