【问题标题】:JSF how to store, with Controller, in session without persist in DBJSF如何在没有持久化数据库的情况下使用Controller在会话中存储
【发布时间】:2014-06-03 14:58:46
【问题描述】:

我正在尝试创建一个页面,用户可以在其中插入一个或多个提供者,检查所有插入的提供者,然后确认。只有当用户确认时,所有插入的提供者才会存储在我的数据库中。 我怎样才能做到这一点?看来,如果我使用我的 ManagedBean 控制器,以及我将存储提供程序的列表,我会收到一个奇怪的错误

HTTP Status 500 -
root cause
java.lang.NullPointerException
it.myProject.model.Provider.equals(Provider.java:71)
org.apache.myfaces.shared.util.SelectItemsIterator.next(SelectItemsIterator.java:275)
org.apache.myfaces.shared.util.SelectItemsIterator.next(SelectItemsIterator.java:49)
org.apache.myfaces.shared.renderkit.RendererUtils.internalGetSelectItemList(RendererUtils.java:800)
org.apache.myfaces.shared.renderkit.RendererUtils.getSelectItemList(RendererUtils.java:764)
org.apache.myfaces.shared.renderkit.html.HtmlSelectableRendererBase.internalRenderSelect(HtmlSelectableRendererBase.java:74)
org.apache.myfaces.shared.renderkit.html.HtmlMenuRendererBase.renderMenu(HtmlMenuRendererBase.java:91)
org.apache.myfaces.shared.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:76)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:665)
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:545)
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
org.apache.myfaces.shared.view.JspViewDeclarationLanguageBase.actuallyRenderView(JspViewDeclarationLanguageBase.java:364)
org.apache.myfaces.shared.view.JspViewDeclarationLanguageBase.renderView(JspViewDeclarationLanguageBase.java:201)
org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)

这是我的 ProviderController 的代码

@ManagedBean
public class ProviderController{
private Long id;
private String vat;
private String address;
private List<Product> products;
private Provider provider;
private List<Provider> providers;

public ProviderController() {
this.products= new LinkedList<>();
this.providers= new LinkedList<>();
}
//adds the Provider in the c:forEach of the view newProvider.jsp
public String addProvider() {
    this.provider= new Provider(vat, address, products);
    this.providers.add(this.provider);
    return "newProvider";
}

-我省略了外观,因为在这种情况下我没有任何东西要存储,我只想在列表中添加提供者,然后用另一种方法在我的数据库中添加列表的所有提供者

-Provider是使用注解@Entity的Model,所以我怀疑不使用EntityManager就不能使用Provider

如果我是对的,我该怎么做才能将我的提供者简单地存储在会话中?我必须创建另一个类 Provider?我必须创建另一个 ProviderController?

非常感谢您的回答。

【问题讨论】:

  • 尝试使用对话范围。当控制器开始调用 Conversation.begin() 以启动范围。然后每个请求都会创建一个新的 Provider。完成后,您使用 Conversation.end() 结束对话范围并将提供者存储在数据库中。搜索互联网以阅读对话范围。

标签: java jsf session controller


【解决方案1】:

除了假设的持久层之外,您可以将信息存储在会话中。但是,您必须区分属于会话的信息和属于当前视图的信息。

对于您的情况,我认为您希望将存储的提供程序作为会话变量,而您在添加新提供程序时在表单中发送的信息应该在视图范围内。这样,您就可以以适当的方式划分应用程序的逻辑。 Here 您已经获得了有关 JSF 2 中引入的视图范围的更多信息。

由于您已经在 J​​SF 2 中,您可以在 JSP 和 Facelets 之间选择用于您的视图技术。如果这是一个新项目,我鼓励您使用 facelets,因为它是 JSF 2 的标准:

ProviderController.java

/*
* Manages providers in the session
*/
@ManagedBean
@SessionScoped
public class ProviderController{

    private List<Provider> providers;
    private List<Product> products;

    public ProviderController() {
        this.products= new LinkedList<>();
        this.providers= new LinkedList<>();
    }

    public List<Provider> getProviders(){
        return providers;
    }

}

providers.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:head />

<h:body>

<!-- Display all the providers from the session -->
    <ul>
        <ui:repeat value="#{providerController.providers}" var="provider">
            <li>#{provider.vat}-#{provider.address}</li>
        </ui:repeat>
    </ul>

</h:body>

</html>

ProviderAdd.java

/*
* Manages the view to add a new provider
*/
@ManagedBean
@ViewScoped
public class ProviderAdd{

    private Long id;
    private String vat;
    private String address;

    //Injects the session scoped bean
    @ManagedProperty(value="#{providerController}")
    private ProviderController providerController;

    //Getter and setters


    //Adds a new provider to the session and returns to the provider list
    public String addProvider() {
        this.provider= new Provider(this.vat, this.address, this.products);
        providerController.getProviders.add(this.provider);
        return "providers";
    }

}

addProvider.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:head />

<h:body>

    <h2>VAT:</h2><h:inputText value="#{providerAdd.vat}" />
    <h2>Address:</h2><h:inputText value="#{providerAdd.address}" />
    <h:commandButton action="#{providerAdd.addProvider}" value="Add provider" />

</h:body>

</html>

【讨论】:

  • 非常感谢!我会在接下来的几天里试试你的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2013-04-07
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多