Servlet/JSP MVC模式如何转换为JSF/Facelets(特别是服务和控制器部分)?

Mr_*_*s_D 6 model-view-controller jsf jsp servlets java-ee

让我们举一个基本的例子.在servlet应用程序中,我将拥有这些类:

  • app.domain.User:域或模型POJO,将包含字段和getter/setter
  • app.service.UserService:将包含对User实例进行操作的方法,例如Register(User).会打电话给DAO.
  • app.dao.UserDao:实际上会被服务调用,比如在数据库中插入一个用户.
  • app.servlets.RegisterController:一个servlet拦截对www.app/registration的请求并调用app.service.UserService中的方法.然后它会重定向到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框架 - 或明确声明不存在这样的技术翻译.

也可以看看:

ata*_*man 3

JSF 2 中有两个级别的 MVC:

  • Model = @ManagedBean,View = Facelets/xhtml,Controller =FacesServlet如果你只看jsf
  • @ManagedBean如果你从整体上看你的应用程序,模型 = 实体 + 服务,控制器 = ,视图 = xhtml。

JSF 应用程序中的典型包布局是相同的:

  • com.foo.domain.featurex.service<- 型号
  • com.foo.domain.featurex.model<- 型号
  • com.foo.presentation.featurex<- 控制器
  • xhtml 文件 <- 视图

这里没有那么大的区别,只是您的控制器现在是FacesServlet(JSF 的核心),并且您的@ManagedBean/@Named控制器将驻留在类似的类com.foo.presentation.featurex.Controller/Handler或类似的东西中。

简单注册示例:

// we talk about the big picture here, not about how jsf is built 
// but how your app is built


// model
package com.foo.domain.registration.entity;

@Entity
public class User { 
    // fields
}

package com.foo.domain.registration.service;

// also model
@Stateless
public class RegistrationService {

    @PersistenceContext 
    EntityManager em;

    public void register(User u) { 
        em.persist(u);
    } 
}

package com.foo.presentation

// controller
@Named
@ViewScoped
public class RegistrationController { 

    @Inject
    RegistrationService rs;

    User current = new User();

    public void register() { 
        rs.register(u);
    }

    // get set for current user
}

// view
// quite a lot boilerplate omitted
// form omitted which displays all the necessary field of your current user
// via value="#{registrationContoller.current.name}"
<h:commandButton value="submit" type="submit" action="#{registrationController.register}" />
Run Code Online (Sandbox Code Playgroud)