Thuộc tính rowClasses quy định cụ thể các lớp CSS để áp dụng cho mỗi hàng. Renderer sẽ áp dụng các giá trị quy định trong thuộc tính nàyRenderer xác định bởi bất cứ điều gì trả về phương pháp rendererType của thành phần. | Building JSF Applications 317 Figure List Viewer without MVC. This implementation too closely ties the presentation of the information to the application logic that delivers the information. In other words changes in one area will require changes in the other area for example if anything changes in the schema even very simple things like a column name then the user interface component will have to be updated. This coupling makes changes hard to manage since small changes in one part of the system lead to a ripple effect throughout the application. If on the other hand the application were to be implemented with MVC in mind changes would be more localized and thus easier to manage. Figure shows what the List Viewer would look like implemented with MVC in mind. This implementation hides the details of the handling of the list behind a controller object that manages getting the next and previous set of components. With this design the underlying application can change without requir- Figure List Viewer with MVC. 318 Chapter 9 JSF in the Architecture The roles in the MVC Pattern are filled by many different pieces of the JSF framework. The UIComponents and their Renderers fulfill the View role and will most commonly be programmed via the JSP integration covered in detail in Chapter 5 JSP Integration in JSF. The Controller role is filled by a combination of JSF-supplied classes and custom code provided by you that is plugged into the JSF application. The supplied classes include the NavigationHandler which manages the page flow of the application and the Application class which manages among other things Converters and Validators. There are many other abstract classes in JSF involved in the controller role that must be fleshed out by the developer. For example developers provide action methods to tell the Navigation Handler which page or which tree identifier to choose next. The developer is also responsible for configuring the NavigationHandler via the .