如何(或者你应该)避免在jsf中使用长方法/类

Sel*_*ber 5 java model-view-controller jsf backing-beans

我主要使用基于JSF的项目中的遗留代码,并且在支持bean中有很多很长的类和方法.

这一直在困扰着我,但是当我寻找可以做的事情的时候,我所能提出的大部分时间都是将一个长方法划分为n个小方法.这给你一个很长的课程,有时甚至更难阅读.

那么你怎么做才能让你的支持bean简洁明了?或者你为一个页面保留一个大的支持bean?有没有最好的做法?

我假设这与jsf没有直接关系,而是与你用控制器"支持"视图的任何模型有关.所以一般建议也会有所帮助.

Bal*_*usC 7

将所有字段自己的类,也被称为实体或DTO类(如User,Product,Order,等),并引用它来代替.那些可以是JDBC/JPA实体.把所有的业务方法在其自己的类,也被称为服务或域对象(例如UserService,ProductService等),并引用它来代替.那些可以是EJB.

因此不是

public class Bean {

    private Long id;
    private String field1;
    private String field2;
    private String field3;
    // Etc... All model fields.

    @PostConstruct
    public void init() {
        // >20 lines of business/domain code to prefill the fields from DB.
    }

    public void save() {
        // >20 lines of business/domain code to save the fields in DB.
    }

    // Getters/setters for all fields and possibly also all nested fields.
}
Run Code Online (Sandbox Code Playgroud)

但更重要的是

public class Bean {

    private Long id;
    private Entity entity;

    @EJB
    private EntityService service;

    @PostConstruct
    public void init() {
        entity = service.find(id);
    }

    public void save() {
        service.save(entity);
    }

    // Getter/setter for id and getter for entity.
}
Run Code Online (Sandbox Code Playgroud)

此外,我还看到了代码,其中嵌套对象/实体由bean中的其他getter/setter委托,如此

private Entity entity;

public String getField1() {
    return entity.getField1();
}

public void setField1(String field1) {
    entity.setField1(field1);
}

// Etc...
Run Code Online (Sandbox Code Playgroud)

这完全没必要.只需一个实体的getter就足够了(setter不是强制性的!),结合使用

<h:inputText value="#{bean.entity.field1}" />
Run Code Online (Sandbox Code Playgroud)

这些实体本身也可以进一步划分.例如street,houseNumber,zipCode,city,countryUser可以由另一个实体/ DTO替换Address内的相同User.


如果运气不好,代码已由可视化编辑器(例如Netbeans + Woodstock)自动生成.如果没有完全重新设计它,重构并不多,我宁愿寻找另一个项目.