在 MVC 范例中,您可以在应用程序范围内完美地拥有一个控制器(例如默认情况下已经是 Servlet),代表类只应该不包含与请求范围相关联的字段变量。您应该在方法块中声明它们。
因此不是例子
public class Controller {
private SomeObject field; // Not threadsafe as this will be shared among all requests!
public void control(Request request, Response response) {
this.field = request.getSomething();
}
}
但更是如此
public class Controller {
public void control(Request request, Response response) {
SomeObject field = request.getSomething(); // Threadsafe.
}
}
View 和关联的Action 应该在线程本地处理,即在方法块中声明。例如
public class Controller {
public void control(Request request, Response response) {
View view = new View(request, response);
Action action = ActionFactory.getAction(request);
action.execute(view);
view.navigate();
}
}
Model 将在 Action 类中处理,也在线程本地范围内。
public class SomeAction implements Action {
public void execute(View view) {
Model model = new Model();
// ...
}
}
在 JSF 上下文中,您实际上只有 Model 类,它在本质上只不过是一个 支持 bean。 Controller 和 View 部分已经由 JSF 在 FacesServlet 控制请求/响应/生命周期/动作和 UIViewRoot 的帮助下处理,后者是从 JSF 页面构建的。因此,对于请求范围的数据,您的 JSF bean 应该是请求范围的。