سؤال

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

وأستخدمه ICEFaces 1.8 المكونات في تطبيق ويب جافا EE. هدفي هو تقديم مجموعة من الجليد: commandButtons على الصفحة استنادا إلى الاستعلام إلى قاعدة البيانات الخاصة بي. أريد هذه الأزرار لتكون قادرة على تبديل التحديدات التي سوف تستخدم في وقت لاحق لمعلمات على استفسار آخر إلى قاعدة البيانات (أساسا جبهة نهاية الاستعلام من نوع لمجموعة من المستخدمين). أود إخراج لتبدو وكأنها بذلك:

وعندما اضغط على الزر، وأود التحديث التالي لصفحتي:

عند خلقت أزرار على صفحتي بشكل ثابت، بصفتها هذه:

<ice:commandButton id="seasonSEP09" style="background-color: #FFFFFF;" partialSubmit="true" actionListener="#{bean.updateSeasons}" value="2009-2010" />
<ice:commandButton id="seasonSEP08" style="background-color: #FFFFFF;" partialSubmit="true" actionListener="#{bean.updateSeasons}" value="2008-2009" />
<ice:commandButton id="seasonSEP07" style="background-color: #FFFFFF;" partialSubmit="true" actionListener="#{bean.updateSeasons}" value="2007-2008" />
<ice:commandButton id="seasonSEP06" style="background-color: #FFFFFF;" partialSubmit="true" actionListener="#{bean.updateSeasons}" value="2006-2007" />

وهذا يعمل كبيرة، ولكل زر يعمل بشكل فردي كما أتوقع. يتم تحديث دعمي الفول، تضاف المعلمات بشكل صحيح في updateSeasons () الأسلوب، والإخراج بلدي في نهاية غلة السجلات الصحيحة.

ولكن، أعرف أن هذا ليس ما أريد. أنا لا أريد لتحديث هذه في أي وقت يتم إدخال موسم آخر في النظام. صيانة كابوس، أليس كذلك؟

وإذا ما أريد القيام به هو توليد هذه الجليد حيوي: مكونات CommandButton واستنادا إلى الجدول قاعدة البيانات الخاصة بي الكامل للكائنات الموسم. هنا هي الطبقة الموسم أستخدمه:

public class Season
{
    String StartMonth;
    String Season;

    public String getStartMonth()
    {
        return StartMonth;
    }
    public void setStartMonth(String startMonth)
    {
        StartMonth = sweep;
    }    
    public void setSeason(String season)
    {
        Season = season;
    }
    public String getSeason()
    {
        return Season;
    }
}

واضحة جدا. خاصيتين، التي أنا يضمن أن تكون فريدة من نوعها في قاعدة البيانات.

وهنا هو الفول دعم أستخدمه:

public class Bean
{
    public Bean()
    {
        defineSeasonsList();
    }

    public List<HtmlCommandButton> seasonsList;

    // seasonsList getter & setter omitted

    public List<String> selectedSeasons;

    // selectedSeasons getter & setter omitted

    private void defineSeasonsList()
    {
        seasonsList = new ArrayList<HtmlCommandButton>();
        selectedSeasons = new ArrayList<String>();

        try
        {
            hibernate.openTransaction();

            for(Season season:defineSeasonsListFromDataSource()))
            {
                HtmlCommandButton button = new HtmlCommandButton();

                button.setId("season" + season.getStartMonth());
                button.setValue(season.getSeason);
                button.setStyle("background-color: #FFFFFF;");
                button.setPartialSubmit(true);

                seasonsList.add(button);
            }                         
        } 
        catch (Exception e)
        {
            System.out.println("Error defining seasons list: " + e.getMessage());
        }
        finally
        {
            hibernate.commitTransaction();
        }               
    }

    public void updateSeasons(ActionEvent ae)
    {
        HtmlCommandButton selected = (HtmlCommandButton) ae.getComponent();

        if(selectedSeasons.contains(selected.getValue().toString()))
        {
            selectedSeasons.remove(selected.getValue().toString());   
            selected.setStyle("background: #FFFFFF;");
        }
        else
        {
            selectedSeasons.add(selected.getValue().toString());
            selected.setStyle("background: #009DD9; color: #FFFFFF;");
        }
    }
}   

حسنا، هنا يأتي بلدي معضلة (ق).

أولا، حاولت أن تجعل هذه العلامات:

<p>
    <ice:panelGroup>
        <ice:panelSeries id="seasonsList" value="#{bean.seasonsList}" var="season">
                <ice:commandButton binding="#{season}"/>                                        
        </ice:panelSeries>
    </ice:panelGroup>
</p>     

وأحصل على هذا الإخراج:

وهكذا، ويجري بالاحباط والمغامرة، وحاولت أن تجعل هذه العلامات لتحقيق هدفي:

<p>
    <ice:panelGroup>
        <ice:panelSeries id="seasonsList" value="#{bean.seasonsList}" var="season">
                <ice:commandButton id="#{season.id}" partialSubmit="true" style="background-color: #FFFFFF" value="#{season.value}" actionListener="#{bean.updateSeasons}"/>                                        
        </ice:panelSeries>
    </ice:panelGroup>
</p>   

والتي أسفرت عن تتبع مكدس الذاكرة المؤقتة التالية:

و4 أغسطس 2009 14:28:11 com.sun.faces.lifecycle.Phase doPhase شديد: JSF1054: (ID المرحلة: RENDER_RESPONSE 6، مشاهدة ID: /phase1.jspx) استثناء ألقيت أثناء تنفيذ المرحلة: javax.faces.event.PhaseEvent [source=com.sun.faces.lifecycle.LifecycleImpl@1a477b7] 4 أغسطس 2009 14:28:11 org.apache.catalina.core.StandardWrapperValve استدعاء شديد: Servlet.service () لبريمج المستمر وجوه رمى بريمج استثناء java.lang.IllegalArgumentException: # {season.id}     في javax.faces.component.UIComponentBase.validateId (UIComponentBase.java:549)     في javax.faces.component.UIComponentBase.setId (UIComponentBase.java:351)     في javax.faces.webapp.UIComponentTag.createComponent (UIComponentTag.java:219)     في javax.faces.webapp.UIComponentClassicTagBase.createChild (UIComponentClassicTagBase.java:486)     في javax.faces.webapp.UIComponentClassicTagBase.findComponent (UIComponentClassicTagBase.java:670)     في javax.faces.webapp.UIComponentClassicTagBase.doStartTag (UIComponentClassicTagBase.java:1142)     في com.icesoft.faces.component.CommandButtonTag.doStartTag (CommandButtonTag.java:741)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:204)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle(Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.executeJspLifecycle (Parser.java:229)     في com.icesoft.faces.webapp.parser.Parser.parse (Parser.java:162)     في com.icesoft.faces.application.D2DViewHandler.renderResponse (D2DViewHandler.java:464)     في com.icesoft.faces.application.D2DViewHandler.renderView (D2DViewHandler.java:153)     في com.sun.faces.lifecycle.RenderResponsePhase.execute (RenderResponsePhase.java:110)     في com.sun.faces.lifecycle.Phase.doPhase (Phase.java:100)     في com.sun.faces.lifecycle.LifecycleImpl.render (LifecycleImpl.java:139)     في com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply (JsfLifecycleExecutor.java:17)     في com.icesoft.faces.context.View $ 2 $ 1.respond (View.java:47)     في com.icesoft.faces.webapp.http.servlet.ServletRequestResponse.respondWith (ServletRequestResponse.java:197)     في com.icesoft.faces.webapp.http.servlet.ThreadBlockingAdaptingServlet $ ThreadBlockingRequestResponse.respondWith (ThreadBlockingAdaptingServlet.java:36)     في com.icesoft.faces.context.View $ 2.serve (View.java:72)     في com.icesoft.faces.context.View.servePage (View.java:133)     في com.icesoft.faces.webapp.http.core.SingleViewServer.service (SingleViewServer.java:52)     في com.icesoft.faces.webapp.http.common.ServerProxy.service (ServerProxy.java:11)     في com.icesoft.faces.webapp.http.servlet.MainSessionBoundServlet $ 4.SERVICE (MainSessionBoundServlet.java:114)     في com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service (PathDispatcherServer.java:24)     في com.icesoft.faces.webapp.http.servlet.MainSessionBoundServlet.service (MainSessionBoundServlet.java:160)     في com.icesoft.faces.webapp.http.servlet.SessionDispatcher $ 1.service (SessionDispatcher.java:42)     في com.icesoft.faces.webapp.http.servlet.ThreadBlockingAdaptingServlet.service (ThreadBlockingAdaptingServlet.java:19)     في com.icesoft.faces.webapp.http.servlet.EnvironmentAdaptingServlet.service (EnvironmentAdaptingServlet.java:63)     في com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service (SessionDispatcher.java:62)     في com.icesoft.faces.webapp.http.servlet.PathDispatcher.service (PathDispatcher.java:23)     في com.icesoft.faces.webapp.http.servlet.MainServlet.service (MainServlet.java:153)     في javax.servlet.http.HttpServlet.service (HttpServlet.java:717)     في org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290)     في org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206)     في org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:233)     في org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191)     في org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:128)     في org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)     في org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109)     في org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:286)     في org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:845)     في org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process (Http11Protocol.java:583)     في org.apache.tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.java:447)     في java.lang.Thread.run (Thread.java:619)

وأنا أحاول أن تفعل شيئا وأنا لا ينبغي أن تفعل؟

هل هناك طريقة أفضل لتحقيق هذا الهدف؟

إذا ضرورية مزيد من المعلومات سأكون سعيدا لتوفير ذلك.

ويرجع الفضل في ذلك مسبقا، أصدقائي.

<القوي> UPDATE : ل

وهكذا حاولت تغييرجمع seasonsList من قائمة إلى قائمة وتقديم بعض العلامات المختلفة، كما يلي:

<p>
    <ice:panelGroup>
        <ice:panelSeries value="#{bean.seasonsList}" var="season">
                <ice:commandButton partialSubmit="true" style="background-color: #FFFFFF" value="#{season}" actionListener="#{Phase1EventBean.updateSeasons}"/>                                        
        </ice:panelSeries>
    </ice:panelGroup>
</p>

وتغيير طريقة defineSeasonsList () ل:

public void defineNationalSeasonsList()
{
    try
    {
        seasonsList = new ArrayList<String>();
        selectedSeasonsList = new ArrayList<String>();

        hibernate.openTransaction();

        for(UedaNationalDates season:hibernate.getList(new UedaNationalDates(), QueryFactory.getUedaNationalSeasons(hibernate.getHibSession())))
        { 
            nationalSeasonsList.add(season.getSeason());
        }       
    } 
    catch (Exception e)
    {
        System.out.println("Error defining nationalMeasurementPeriods: " + e.getMessage());
    }
    finally
    {
        hibernate.commitTransaction();
    }               
}

وهذا يجعل الواقع جميع الأزرار وأود أن نرى، ويضيف عليها بشكل صحيح إلى selectedSeasonsList في دعمي الفول عند النقر عليها، ويزيل لهم منه عند النقر مرة أخرى.

ولكن، على واجهة المستخدم و يظهر كل ليكون مثبت عند النقر على زر واحد فقط. على سبيل المثال، عندما كنت اضغط على 2009-2010، وهذا هو ما أراه:

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

المحلول

<ice:commandButton binding="#{season}"/>

ويجب ربط السمة ملزمة لخاصية الفول من نوع <لأ href = "http://java.sun.com/javaee/5/docs/api/javax/faces/component/UIComponent.html" يختلط = "noreferrer نوفولو"> UIComponent . يتم استخدامه حيث تريد الإطار لتعطيك إشارة إلى عنصر في الفول دعم أو لتوفير مثيل من الفول الدعم). انظر القسم 3.1.5 من JSF 1.2 المواصفات للحصول على مزيد من التفاصيل.


<ice:commandButton id="#{season.id}"
   partialSubmit="true"
   style="background-color: #FFFFFF"
   value="#{season.value}"
   actionListener="#{Phase1EventBean.updateSeasons}"/>

والسمة id لا يمكن أن يكون الديناميكي - سوف JSF رعاية ضمان تفرده على العميل استخدام في clientId (و<لأ href =" http://illegalargumentexception.blogspot.com/2009/02/jsf العاملين و-مع عنصر ids.html "يختلط =" نوفولو noreferrer "> قراءة هذا لمزيد من التفصيل ).


وتحرير:

<اقتباس فقرة>   

ولكن، على واجهة المستخدم، يظهر كل زر ليكون مثبت عند النقر على زر واحد فقط.

وأنا على التخمين بأن ice:panelSeries لا تخزن الدولة المكونة من كل صف إلى بعض الضوابط تكرار القيام به (على سبيل المثال DataTable و). تذكر، ليس هناك مثيل على زر واحد فقط، حتى إذا تم ترميز عليه / فك الشفرة مرة واحدة في "الصف".

ولقد استعملت أبدا ICEfaces، ولكن أقترح ملزمة لحبوب مشابهة لهذه:

public class Bean {

  private final List<SelectionBean> seasonsList = Arrays.asList(
      new SelectionBean("Spring"), new SelectionBean("Summer"),
      new SelectionBean("Autumn"), new SelectionBean("Winter"));

  public List<SelectionBean> getSeasonsList() { return seasonsList; }

  public static class SelectionBean {

    private String season;
    private boolean selected;

    public SelectionBean() {}
    public SelectionBean(String season) { this.season = season; }

    public String getSeason() { return season; }
    public void setSeason(String season) { this.season = season; }

    public String toggle() {
      System.out.println("toggle " + season);
      selected = !selected;
      return null;
    }

    public String getStyle() {
      return selected ? "background-color: yellow" : "background-color: blue";
    }
  }
}

ولقد قلص المنطق وصولا الى الحد الأدنى، ولكن نأمل أن تحصل كيفية تعديل المنطق لوضع السبات الدعم مرة أخرى في أن مكون الخاص بك ثم تصبح شيئا من هذا القبيل:.

<ice:panelSeries value="#{bean.seasonsList}" var="item">
  <ice:commandButton partialSubmit="true"
     style="#{item.style}"
     value="#{item.season}"
     action="#{item.toggle}"/>                                        
</ice:panelSeries>

وهكذا، على كل عنصر في القائمة الخاصة بك، كل ملزمة يعود الى قطعة واحدة من الدولة (مثيل SelectionBean)، وكنت لا تحاول تخزين أي دولة غير المعلن على العنصر نفسه.

I محاولة استخدام action على actionListener عندما استطيع - وتبقي الاشياء للمساهمة في المشروع من POJOs

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