سؤال

لمشروع الجامعة أقوم بتطوير webapplication مع JSF. تمرينتي هي القيام بالواجهة الأمامية. من المفترض أن يقوم زميله بالدراسة بالخلفية. تم تصميم كلا الجزأين لتصبح تطبيقات. كلاهما يتواصل من خلال RMI. أريد فتح الاتصال مرة واحدة في النشر.

أنا في مرحلة تسوية الاتصال الآن. حاولت القيام بذلك باستخدام applicationscoped managedbean:

//Constructor of ApplicationScoped ManagedBean  
public Communication() {
    this.connect();
}

هل بهذه الطريقة ممكنة؟ جربته ولكن يبدو أن المدير المدير لا يسمى ..

هل يمكنك المشورة لأفضل ممارسة؟


Brian: للأسف لا أستخدم EJB على الإطلاق -.-

وعاء @balusc: لقد قمت بإنشاء communiceBean:

@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {

    public static FrontendCommInterface server;

    public Communication() {
        this.connect();
    }

ثم قمت بإنشاء loginbean:

@ManagedBean
@ViewScoped
public class Login {

@ManagedProperty(value="#{communication}")
private Communication communicationBean;

public FrontendCommInterface server;

private String username;
private String password;

public Login() {
    server = communicationBean.getConnection();
}

public String login(){
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    String sessionId = session.getId();

    try {
        server.login(getUsername(), getPassword(), sessionId);
        return "start.xhtml";

    } catch (RemoteException e) {
        e.printStackTrace();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Anmeldung nicht erfolgreich: ", getUsername()+", "+getPassword()+", "+sessionId));
        return "login.xhtml";
    }
}

لكن لسوء الحظ يلقي الاستثناءات:

com.sun.faces.mgbean.ManagedBeanCreationException: Klasse org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login can not be instanciated.

java.lang.NullPointerException
    org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.<init>(Login.java:28)

بعد تصحيح الأخطاء اكتشفت أن ManagedProperty الخاص بي لاغية! لم يتم إنشاؤه! كيف يتم فعل ذلك؟ اعتقدت أن الرجوع عبر ManagedProperty سيخلقها -.-

هل كانت مفيدة؟

المحلول

يتم إنشاء الفول المدارة تلقائيًا فقط كلما تمت الإشارة إليه من قبل EL #{managedBeanName}, ، والتي يمكن أن تحدث إما عن طريق الوصول إلى ما هو في الرأي ، أو عن طريق الحقن كممتلكات مُدارة لفاصوليا أخرى ، أو يتم حلها يدويًا عن طريق مثل EG Application#evaluateExpressionGet().

في حالتك بالذات ، تريد فعليًا تمييز بعض الأشياء أثناء بدء تشغيل WebApp. تفضل استخدامها ServletContextListener لهذا.

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}

يمكنك حتى إنشاء فول مُدارة من طراز تطبيق موجود قبل ذلك كلما لزم الأمر (إذا كانت نيتك قادرة على الوصول إليها من الفاصوليا الأخرى @ManagedProperty).

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("bean", new Bean());
    }

JSF يخزن التطبيق الفاصوليا ServletContext ولن يقوم JSF بإنشاء واحدة أخرى عند وجودها بالفعل ، وبالتالي فإن JSF تلقائيًا ، لذلك سيتم استخدام مثال الرمز أعلاه بواسطة JSF أيضًا.

نصائح أخرى

إذا كان بإمكانك استخدام EJB 3.1 Lite {1} في تطبيق الويب الخاص بك ، فيمكنك استخدام حبة جلسة Singleton ، مشروحة باستخدام STARTUP ، وطريقة postConstruct. لدي واحد يشبه:

@Singleton
@Startup
public class CachePrimer {

    @PostConstruct
    public void loadOpenRequests() {
         ...
    }
}

{1}: يتم تضمين EJB 3.1 Lite في ملف تعريف الويب الخاص بـ Javee 6 ، ويتم توفيره بواسطة خوادم ملف تعريف الويب مثل السمكة الزجاجية, JBOSS 6, ، و مادة صمغية. عند استخدام خادم ملف تعريف الويب هذا ، يمكنك ببساطة تضمين EJBS في ملف .war الخاص بك ، لا يلزم وجود عمل إضافي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top