powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF EL: проблема
14 сообщений из 14, страница 1 из 1
JSF EL: проблема
    #33456631
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Осваиваю jsf. Вот столкнулся с такой проблемой. При обращении к свойству бина (из DataTable) в одном месте все проходит нормально, а в другом месте той же таблицы выбрасывается исключение.
Вот часть кода страницы (!!! - помечено место, на котором выбрасывается исключение):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
          <h:dataTable value="#{backing_basicBuilder.items}" var="r" width="50%"
                       binding="#{backing_basicBuilder.queryDataTable}"
                       border="1" rendered="#{backing_basicBuilder.itemCount > 0}">
            <h:column binding="#{backing_basicBuilder.idColumn}">
              <f:facet name="header">
                <h:outputText value="№"/>
              </f:facet>
              <h:outputText value="#{r.id}"/>
            </h:column>
            <h:column binding="#{backing_basicBuilder.negColumn}">
              <f:facet name="header">
                <h:outputText value="Отрицание?"/>
              </f:facet>
              <h:selectBooleanCheckbox value="#{r.neg}"/>
            </h:column>
            <h:column binding="#{backing_basicBuilder.terminColumn}">
              <f:facet name="header">
                <h:outputText value="Термин"/>
              </f:facet>
              <h:inputText value="#{r.termin}"/>
            </h:column>
            <h:column binding="#{backing_basicBuilder.actionColumn}">
              <f:facet name="header">
                <h:outputText value="Удалить?"/>
              </f:facet>
              <!-- !!! -->
              <h:commandLink id="#{r.id}"
                             actionListener="#{backing_basicBuilder.processAction}">
                <h:outputText value="Удалить"/>
              </h:commandLink>
            </h:column>
          </h:dataTable>
Причем это же свойство r.id в первой колонке совершенно нормально определяется. Это я что-то делаю неправильно или jsf такая глючная? Использую jsf в Oracle JDev 10g 1.3.
Заранее спасибо.
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33456723
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут выяснилось, что id должен начинаться с символа подчеркивания или с буквы. Я сделал вот так:
<commandLink id="#{'_' + r.id}" ... />
Но все равно это не работает. В чем же дело?
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33460814
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели так никто и не может помочь советом?
И еще есть вопросик:
если в DataTable в каждую строку динамически заношу какой-нибудт контрол (например, BooleanCheckBox) и кадому из них прикрепляю ValueChangeListener, то при изменении чекбоксов в нескольких строках таблицы обработчик будет вызываться также несколько раз?
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33461403
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgonchТут выяснилось, что id должен начинаться с символа подчеркивания или с буквы. Я сделал вот так:
<commandLink id="#{'_' + r.id}" ... />
Но все равно это не работает. В чем же дело?

А вот так: <commandLink id="_"+"#{r.id}" ... />?
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33461495
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое исключение возникает?
И что за извращение такое, id таким образом назначать? Зачем это вообще нужно?
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33463033
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы предлашаете поступать, если нужно отобразить список строк и для каждой строки дать пользователю возможность что-нибудь с ней сделать, например, удалить? Вот в этом форуме вы же щелкаете мышкой по ссылке с названием темы, и вас переводят в соответствующий топик. Аналогично хочу сделать и я. Только в обычных JSP это делалось с помощью параметров. Здесь же нужно передавать через id.

За совет спасибо. попробую.
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33463351
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот так: <commandLink id="_"+"#{r.id}" ... />?[/quot]
А вот так: <commandLink id="_"+"#{r.id}" ... />?[/quot]

То, что вы предложили, вообще синтаксисом запрещено...
Пробовал уже и так:
Код: plaintext
1.
2.
3.
              <h:selectBooleanCheckbox value="#{r.neg}"
                                       valueChangeListener="#{backing_basicBuilder.processValueChange}"
                                       id="_#{r.id}"/>
Но все равно не помогает:
500 Internal Server Error
javax.servlet.jsp.JspException: _#{r.id} at com.sun.faces.taglib.html_basic.SelectBooleanCheckboxTag.doStartTag(SelectBooleanCheckboxTag.java:459) at _basicBuilder_2e_jsp._jspService(basicBuilder.jsp:54) [/basicBuilder.jsp]
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33463996
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgonchА как вы предлашаете поступать, если нужно отобразить список строк и для каждой строки дать пользователю возможность что-нибудь с ней сделать, например, удалить? Вот в этом форуме вы же щелкаете мышкой по ссылке с названием темы, и вас переводят в соответствующий топик. Аналогично хочу сделать и я. Только в обычных JSP это делалось с помощью параметров. Здесь же нужно передавать через id.

За совет спасибо. попробую.

Понел что нужно наконец.
Почему именно через id? Существует много способов сделать это подругому. Кроме того, назначать таким способом id нельзя, хотя я не уверен на все сто %.

Вот один из способов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
<h:column binding="#{backing_basicBuilder.actionColumn}">
              ....
              <!-- !!! -->
              <h:commandLink id="removeRow"
                             actionListener="#{backing_basicBuilder.processAction}">

                <h:outputText value="Удалить"/>

                  <f:param name = "rowId" value = "#{r.id}" />
              </h:commandLink>

</h:column>
...

затем, в обработчике событий, можно без труда получить значение параметра rowId.

Есть еще более правильный и красивый способ. Он показан в примере, ктороый идет с J2EE туториалам. Там книжный магазин, есть например таблица, представляющая карзину покупателя, в каждой строке есть и кнопки и ссылки... Вобщем советую глянуть.
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33464688
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. О таком способе я не знал...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
<h:column binding="#{backing_basicBuilder.actionColumn}">
              ....
              <!-- !!! -->
              <h:commandLink id="removeRow"
                             actionListener="#{backing_basicBuilder.processAction}">

                <h:outputText value="Удалить"/>

                  <f:param name = "rowId" value = "#{r.id}" />
              </h:commandLink>

</h:column>
...

А как в обратчике получить знаение этого параметра?

Есть еще более правильный и красивый способ. Он показан в примере, ктороый идет с J2EE туториалам. Там книжный магазин, есть например таблица, представляющая карзину покупателя, в каждой строке есть и кнопки и ссылки... Вобщем советую глянуть.[/quot]

Туториал я читал, но что-то подобного там не видел. Посмотрю внимательнее.
Спасибо.
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33465250
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, этот туториал я прочел внимательно и видел скриншот странички с корзиной покупателя, но полного текста этой странички найти не удалось. М. б., дадите ссылку?
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33465261
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внимательно прочитал туториал, видел jsp с тем примером, который меня интересовал, но сам backing-bean скачать не удалось. а Java Studio Creator у меня нет. Соответственно нет и примеров к нему. Может, кто-нибудь выложит пример кода бина, обрабатывающего команды корзины покупателя из Duke's bookstore application?
Заранее спасибо.
Всех с наступающим НГ!
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33465756
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgonchВнимательно прочитал туториал, видел jsp с тем примером, который меня интересовал, но сам backing-bean скачать не удалось. а Java Studio Creator у меня нет. Соответственно нет и примеров к нему. Может, кто-нибудь выложит пример кода бина, обрабатывающего команды корзины покупателя из Duke's bookstore application?
Заранее спасибо.
Всех с наступающим НГ!

Учимся работать с туториалом:
1. скачиваем туториал.
2. скачиваем SUNWappaerver. Это если понадобится запускать примеры из туториала.
3. ВНИМАТЕЛЬНО еще раз читаем туториал.

Подсказка по 3-у пункту. Читать нужно клавы про JSF. Там написано: как запустить SUNWAppserver, описаны примеры, где они находятся и как их запускать, описано все подробно.
Выглядит все примерно так: запускаем PointBase это БД для примера, она входит в состав аппсервера, запускаем сам аппсервер, затем идем в каталог с примером, тот который тебе нужен находится здесь - tutorial_home/examples/web/bookstore6, там соответственно и исходники, так же там скрипт антовский, его нужно запустить с определенными параметрами, какими, описано в туториале, ант сам все соберет и задеплоит, затем открываем браузер и смотрим пример, далее смотри код и разбираемся.
Креатор нафиг не нужен.

Тебя тоже с наступающим Новым Годом!
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33465790
artgonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так мне не нужен ни пойт-бэйс, ни апп-сервер. я вообще пользуюсь JDev. Мне бы только посмотреть исходник того бина !
...
Рейтинг: 0 / 0
JSF EL: проблема
    #33465848
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgonchТак мне не нужен ни пойт-бэйс, ни апп-сервер. я вообще пользуюсь JDev. Мне бы только посмотреть исходник того бина !

не могу понять, почему бы самому не скачать и не посмотреть???
ну да ладно...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
<f:view>
    <f:loadBundle var="bundle" basename="messages.BookstoreMessages"/>

    <h:messages   globalOnly="true"/>
    <br>

    <h:form               id="form">

        <h:outputFormat
            value="#{bundle.CartItemCount}">
            <f:param       value="#{cart.numberOfItems}"/>
        </h:outputFormat>

        <br><br>

        <h:commandLink      id="clear"
            action="#{showcart.clear}"
            immediate="true"
            rendered="#{cart.numberOfItems > 0}">
            <h:outputText
            value="#{bundle.ClearCart}"/>
        </h:commandLink>

         

        <h:commandLink      id="buy"
            action="#{showcart.buy}"
            immediate="true"
            rendered="#{cart.numberOfItems > 0}">
            <h:outputText
            value="#{bundle.Buy}"/>
        </h:commandLink>

         

        <h:commandLink      id="continue"
            action="catalog"
            immediate="true">
            <h:outputText
            value="#{bundle.ContinueShopping}"/>
        </h:commandLink>
        
        <br><br>

        <!-- ============================== Table ============================= -->
        
        <h:dataTable        id="items"
            columnClasses="list-column-center, list-column-left,
            list-column-right, list-column-center"
            footerClass="list-footer"
            headerClass="list-header"
            rowClasses="list-row-even, list-row-odd"
            styleClass="list-background"
            summary="#{bundle.ShoppingCart}"
            value="#{cart.items}"
            var="item">

            <h:column>
                <f:facet      name="header">
                    <h:outputText
                    value="#{bundle.ItemQuantity}"/>
                </f:facet>
                
                <h:inputText    id="quantity"
                    size="4"
                    value="#{item.quantity}">
                    <f:validateLongRange minimum="1"/>
                </h:inputText>
                
                <h:message      for ="quantity"/>
            </h:column>

            <h:column>
                <f:facet      name="header">
                    <h:outputText
                    value="#{bundle.ItemTitle}"/>
                </f:facet>
                <h:commandLink
                    action="#{showcart.details}">
                    <h:outputText
                    value="#{item.item.title}"/>
                </h:commandLink>
            </h:column>

            <h:column>
                <f:facet      name="header">
                    <h:outputText
                    value="#{bundle.ItemPrice}"/>
                </f:facet>
                <h:outputText
                    value="#{item.item.price}">
                    <f:convertNumber
                    type="currency"/>
                </h:outputText>
            </h:column>

            <h:column>
                <h:commandButton
                id="remove"
                action="#{showcart.remove}"
                value="#{bundle.RemoveItem}"/>
            </h:column>

            <f:facet        name="footer">
                <h:panelGroup>
                    <h:outputText
                    value="#{bundle.Subtotal}"/>
                    <h:outputText
                        value="#{cart.total}">
                        <f:convertNumber
                        type="currency"/>
                    </h:outputText>
                </h:panelGroup>
            </f:facet>

        </h:dataTable>

        <%-- immediate="false" to force validation before updating --%>
        <h:commandLink      id="update"
            action="#{showcart.update}"
            immediate="false">
            <h:outputText  value="#{bundle.UpdateQuantities}"/>
        </h:commandLink>

    </h:form>

</f:view>



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 package  backing;

 import  database.BookDetails;

 import  java.io.FileOutputStream;


/**
 * <p>Backing Bean for the <code>/bookshowcart.jsp</code> page.</p>
 */
 public   class  ShowCartBean  extends  AbstractBean {
    // ----------------------------------------------------- Application Actions
    
    /**
     * <p>Show the details page for the current book.</p>
     */
     public  String details() {
        context()
        .getExternalContext()
        .getSessionMap()
        .put("selected", item().getItem());
        
         return  ("details");
    }
    
    /**
     * <p>Remove the item from the shopping cart.</p>
     */
     public  String remove() {
        BookDetails book = (BookDetails) item().getItem();
        cart().remove(book.getBookId());
        message( null , "ConfirmRemove",  new  Object[] { book.getTitle() });
        
         return  ( null );
    }
    
    /**
     * <p>Update the quantities in the shopping cart, based on the
     * values entered in the "Quantity" column.</p>
     */
     public  String update() {
        message( null , "QuantitiesUpdated");
         try {
            FileOutputStream fos= new  FileOutputStream("/home/andrei/temp/test.fuck");
            fos.close();
        } catch (Exception e){
            
        }
        
        //    FacesContext context = context();
        //    ValueBinding vb =
        //        context.getApplication().createValueBinding("#{catalog.totalBooks.value}");
        //     vb.setValue(context, new Integer(cart().getNumberOfItems()));
         return  ( null );
    }
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
 package  backing;

 import  cart.ShoppingCart;
 import  cart.ShoppingCartItem;
 import  database.BookDetails;
 import  java.text.MessageFormat;
 import  java.util.Locale;
 import  java.util.ResourceBundle;
 import  javax.faces.application.FacesMessage;
 import  javax.faces.context.FacesContext;
 import  javax.faces.el.ValueBinding;
 import  database.BookDBAO;


/**
 * <p>Abstract base class for backing beans to share utility methods.</p>
 */
 public   abstract   class  AbstractBean {
    // ----------------------------------------------------- Application Actions
    
    /**
     * <p>Buy the items currently in the shopping cart.</p>
     */
     public  String buy() {
        // "Cannot happen" sanity check
         if  (cart()
        .getNumberOfItems() <  1 ) {
            message( null , "CartEmpty");
            
             return  ( null );
        }  else  {
             return  ("purchase");
        }
    }
    
    /**
     * <p>Clear all items from the shopping cart.</p>
     */
     public  String clear() {
        cart()
        .clear();
        message( null , "CartCleared");
        
         return  ( null );
    }
    
    // ------------------------------------------------------- Protected Methods
    
    /**
     * <p>Return the currently selected <code>BookDetails</code> instance
     * from the user request.</p>
     */
     protected  BookDetails book() {
        BookDetails book =
                (BookDetails) context()
                .getExternalContext()
                .getRequestMap()
                .get("book");
        
         return  (book);
    }
    
    /**
     * <p>Return the <code>ShoppingCart</code> instance from the
     * user session.</p>
     */
     protected  ShoppingCart cart() {
        FacesContext context = context();
        ValueBinding vb =
                context.getApplication()
                .createValueBinding("#{cart}");
        
         return  ((ShoppingCart) vb.getValue(context));
    }
    
    /**
     * <p>Return the <code>FacesContext</code> instance for the
     * current request.
     */
     protected  FacesContext context() {
         return  (FacesContext.getCurrentInstance());
    }
    
    /**
     * <p>Return the <code>BookDBAO</code> object for our database.</p>
     */
     protected  BookDBAO dbao() {
        BookDBAO dbao =
                (BookDBAO) context()
                .getExternalContext()
                .getApplicationMap()
                .get("bookDBAO");
        
         return  (dbao);
    }
    
    /**
     * <p>Return the <code>ShoppingCartItem</code> instance from the
     * user request.</p>
     */
     protected  ShoppingCartItem item() {
        ShoppingCartItem item =
                (ShoppingCartItem) context()
                .getExternalContext()
                .getRequestMap()
                .get("item");
        
         return  (item);
    }
    
    /**
     * <p>Add a localized message to the <code>FacesContext</code> for the
     * current request.</p>
     *
     * @param clientId Client identifier of the component this message
     *  relates to, or <code>null</code> for global messages
     * @param key Message key of the message to include
     */
     protected   void  message(String clientId, String key) {
        // Look up the requested message text
        String text =  null ;
        
         try  {
            ResourceBundle bundle =
                    ResourceBundle.getBundle("messages.BookstoreMessages",
                    context().getViewRoot().getLocale());
            text = bundle.getString(key);
        }  catch  (Exception e) {
            text = "???" + key + "???";
        }
        
        // Construct and add a FacesMessage containing it
        context()
        .addMessage(clientId,  new  FacesMessage(text));
    }
    
    /**
     * <p>Add a localized message to the <code>FacesContext</code> for the
     * current request.</p>
     *
     * @param clientId Client identifier of the component this message
     *  relates to, or <code>null</code> for global messages
     * @param key Message key of the message to include
     * @param params Substitution parameters for using the localized text
     *  as a message format
     */
     protected   void  message(String clientId, String key, Object[] params) {
        // Look up the requested message text
        String text =  null ;
        
         try  {
            ResourceBundle bundle =
                    ResourceBundle.getBundle("messages.BookstoreMessages",
                    context().getViewRoot().getLocale());
            text = bundle.getString(key);
        }  catch  (Exception e) {
            text = "???" + key + "???";
        }
        
        // Perform the requested substitutions
         if  ((params !=  null ) && (params.length >  0 )) {
            text = MessageFormat.format(text, params);
        }
        
        // Construct and add a FacesMessage containing it
        context().addMessage(clientId,  new  FacesMessage(text));
    }
    
    /**
     * <p>Return the explicitly selected <code>BookDetails</code> instance
     * from the user request.</p>
     */
     protected  BookDetails selected() {
        BookDetails selected =
                (BookDetails) context()
                .getExternalContext()
                .getSessionMap()
                .get("selected");
        
         return  (selected);
    }
}

...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF EL: проблема
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]