在Struts2中初始化字段的正确方法是什么?

时间:2016-02-17 19:16:12

标签: java jsp struts2 javabeans interceptorstack

我有一个类用于存储从数据库中检索的数据,该数据库将对象作为字段。我想在实例化类时初始化对象以避免空指针问题。我以为我在某处读到它不应该初始化字段声明中的字段,因为它可能会导致Struts出现问题(但我现在找不到语句),所以我在构造函数中初始化字段。

我的问题是:你做哪种方式有关系吗?或者你根本不应该这样做,只在实例化类之后才放入新对象?换句话说,我应该像这样定义我的类:

public class MenuView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private ProjectInfo projectInfo;
private PartyInfo partyInfo;
private RequestTableInfo requestTableInfo;
private PartyRequestInfo partyRequestInfo;

public MenuView(){
    projectInfo = new ProjectInfo();
    partyInfo = new PartyInfo();
    requestTableInfo = new RequestTableInfo();
    partyRequestInfo = new PartyRequestInfo();
}

然后是getter和setter,或者像这样。

public class MenuView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private ProjectInfo projectInfo = new ProjectInfo();
private PartyInfo partyInfo = new PartyInfo();
private RequestTableInfo requestTableInfo = new RequestTableInfo();
private PartyRequestInfo partyRequestInfo = new PartyRequestInfo();

public MenuView(){  }

然后是getter和setter,或者像这样:

public class MenuView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private ProjectInfo projectInfo;
private PartyInfo partyInfo;
private RequestTableInfo requestTableInfo;
private PartyRequestInfo partyRequestInfo;

public MenuView(){}

然后是getter和setter,然后像这样实例化它:

MenuView menu = new MenuView();
menu.setProjectInfo(new ProjectInfo);

3 个答案:

答案 0 :(得分:2)

上述任何一种方法都可以,但这是最好的。初始化类的重点是避免使用空指针,并使用首选值初始化它,如下所示。 添加getter和setter可以正常工作

public class MenuView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private ProjectInfo projectInfo;
private PartyInfo partyInfo;
private RequestTableInfo requestTableInfo;
private PartyRequestInfo partyRequestInfo;

public MenuView(int a, int b, int c, int d){
    projectInfo = new ProjectInfo(a);
    partyInfo = new PartyInfo(b);
    requestTableInfo = new RequestTableInfo(c);
    partyRequestInfo = new PartyRequestInfo(d);
}

答案 1 :(得分:1)

对于Struts2来说并不重要,只有你自己应该创建的模型驱动对象(如果你使用的是ModelDriven)。如果提交表单时框架为null,则框架将创建对象。默认情况下启用此选项。魔术是由params拦截器执行的,它在引擎盖下使用OGNL来从传递给动作的参数填充模型。

  

在调用此拦截器时,会出现一个标志   (ReflectionContextState#CREATE_NULL_OBJECTS)已启用以确保   任何空引用都会自动创建 - 如果可能的话。看到   type conversion文档和InstantiatingNullHandler   javadocs了解更多信息。

com.opensymphony.xwork2.conversion.NullHandler下记录了此功能。

bean应符合JavaBeans spec.,因此可以通过Struts2框架进行实例化(如果您想了解有关JavaBeans的更多信息,请参阅此帖What is a JavaBean exactly)。

答案 2 :(得分:1)

  

我在某处读到你不应该初始化字段声明中的字段,因为这可能会导致Struts出现问题(但我现在找不到语句)

不,不是我知道

  

所以我正在初始化构造函数中的字段。

你可以,但你没有被迫。我从不在操作上使用构造函数(我几乎从不使用构造函数,因为我使用的是Java EE 6+和CDI,而在构造函数中,@Inject ed对象尚未注入 - I use a @PostConstruct method而是,必要时),但这取决于你,这不是一个规则。

  

我的问题是你做哪种方式有关系吗?

没有

  

或者根本不应该这样做,只在实例化类之后才放入新对象?

Struts2将在JSP中为您处理空值。您必须处理的唯一NullPointerException是Java端,因此只需检查null,或者在声明中实例化对象,不再担心它。

请记住Struts2 will need a no-arg constructor to instantiate beans with JSP values