Pokazywanie postów oznaczonych etykietą netbeans. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą netbeans. Pokaż wszystkie posty

wtorek, 20 grudnia 2011

PrimeFaces 3.0 name space

When You using NetBeans, it gives you PrimeFaces 2.2.1. When You try for example <p:selectOneMenu>, it appears, that namespace is not right.

Change it to: xmlns:p="http://primefaces.org/ui"
Of course: library itself shoud be loaded.

Explanation from primefaces.

czwartek, 22 września 2011

Fatalne czcionki NetBeans w Ubuntu

Nie da się na to patrzeć.
1. Zmiana poprzez "Tools->Options->Fonts" (mam anglojęzyczne NetBeans) daje jedynie zmiany tekstu w oknie edytora. Warto Dejavu Sans Mono 12.

Zmiana czcionki środowiska najłatwiejsza jest przez zmianę preferencji Ubuntu. "System->Preferencje->Ekran->Czcionki" polecam Dejavu Sans Book 10. Domyślna czcionka ubuntu daje kiepskie efekty.

2. Można jeszcze zmienić ustawienie w "netbeans.conf" i w linii: netbeans_default_options=

dodać na końcu:  --laf Nimbus -J-Dswing.aatext=true -J-Dawt.useSystemAAFontSettings=lcd

3. Ubuntu 16.04
a) instalacja gnome tweak
b) wybór czcionki w pozycji interfejs, np. Arial 11

środa, 21 września 2011

The form component needs to have a UIForm in its ancestry. Suggestion: enclose the necessary components within

When you see
The form component needs to have a UIForm in its ancestry. Suggestion: enclose the necessary components within <h:form>
in your NetBeans web application, change web.xml from:
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>



To:
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>



wtorek, 20 września 2011

Przekazywanie wartości z primefaces dataTable

Aby przekazać wartości wybranego z tabeli wiersza, do na przykład formularza edycji wartości tego wiersza, wystarczy w przypadku dataTable primefaces skorzystać z zaleconego mechanizmu, np:

<p:dataTable var="car" value="#{carBean.cars}" selectionMode="single" selection="#{carBean.selectedCar}">
   
...columns
</p:dataTable>
carBean to oczywiście managed bean z właściwością/polem selectedCar, posiadającym właściwy get i set.

Wystarczy teraz umieścić przycisk wywołujący formularz, który odwoła się do pól/pola beanu carBean. np:
<p:commandButton value="Edit" action="/car/editCar"/>
Jednakże odwołanie na stronie editCar do pól beana carBean, zwrócić może niechybnie null, mimo, że dopiero co były ustawione na właściwe wartości.

Rozwiązanie tkwi w deklaracji zakresu beana, a ściślej w użytej do tej deklaracji bibliotece. Jeśli bean jest @SessionScoped, to należy użyć
import javax.enterprise.context.SessionScoped;
Natomiast użycie:
import javax.faces.bean.SessionScoped;
sprawi, że nie zobaczymy wcześniej ustawionych wartości.

NetBeans, facelets, jsf i znikający css.

Gdy w projekcie opartym o JSF, umieścimy klientów template, w innych katalogach niźli sam template, to szybko może się okazać, że całe opisanie strony w przywołanych w template plikach css, nie pokazuje się wcale w stronach "klienckich".

Objaw: na stronach będących klientami template, brak formatowania css.

Dzieje się tak z powodu sposobu zapisu odwołania do arkuszy stylów css, jaki stosuje wizard NetBeans przy tworzeniu template. Ten sposób to:
<link href="./resources/css/default.css" rel="stylesheet" type="text/css"/>
Zapis powyższy wskazuje, iż arkusz stylów (styli) (ze stylami) znajduje się w podkatalogu "/resources/css" katalogu aktualnie wyświetlanej strony.

Gdy strona znajduje się w innym katalogu niż template, którego jest klientem, nie ma mowy aby zostały na niej zobaczone style css, włączone w templacie.

Rozwiązaniem jest zmiana wskazania arkuszy css w template, na następujące:
<h:outputStylesheet name="default.css" library="css"/>
Wówczas jeśli "default.css znajduje się w podkatalogu /resources/css stron www, style css będą widoczne w stronach klienckich.

poniedziałek, 18 lipca 2011

Introduction to Ajax for Java Web Applications - not working

Z tutorialem "Introduction to Ajax for Java Web Applications" są niezrozumiałe dla mnie problemy. Oficjalny serwer, oficjalnej firmy, materiał do nauki i ... zonk. Why do you do this to me ? Na szczęście jest tam link do chodzącego projektu, tak że można sobie "odcyfrować" w cziom dieła.


Generalnie nie działa ponieważ:
a) brak jest obsługi parametru lookup w nadpisywanej metodzie doGet w servlecie AutoCompleteServlet.
b) brak jest strony na której miałby być wyświetlony wybrany kompozytor - composer.jsp
Dodatkowo w trakcie tworzenia servleta łatwo pominąć właściwy jego kontekst (trzeba zmienić na /autocomplete) a jeszcze nadto warto zaznaczyć opcję tworzenia "Add information to the deployment descriptor web.xml".

ad a)
    if (action.equals("lookup")) {

            // put the target composer in the request scope to display
            if ((targetId != null) && composers.containsKey(targetId.trim())) {
                request.setAttribute("composer", composers.get(targetId));
                context.getRequestDispatcher("/composer.jsp").forward(request, response);
            }
        }
ad b)

<html>
  <head>
    <title>Composer Information</title>

    <link rel="stylesheet" type="text/css" href="stylesheet.css">
  </head>
  <body>

    <table>
      <tr>
        <th colspan="2">Composer Information</th>
      </tr>
      <tr>
        <td>First Name: </td>
        <td>${requestScope.composer.firstName}</td>
      </tr>
      <tr>
        <td>Last Name: </td>
        <td>${requestScope.composer.lastName}</td>
      </tr>
      <tr>
        <td>ID: </td>
        <td>${requestScope.composer.id}</td>
      </tr>
      <tr>
        <td>Category: </td>
        <td>${requestScope.composer.category}</td>
      </tr>     
    </table>

    <p>Go back to <a href="index.jsp" class="link">application home</a>.</p>
  </body>
</html>

Poza tym kod nie jest najlepszy. Są dwa podejścia - dać w miarę bogaty kod aby uczący mógł "się zapoznać " z możliwościami. Dać kod maksymalnie ubogi, pokazujący jedynie to czego się się uczy, pozwalając później na rozwój. Wydaje się, że przykład ze stron netbeans hołduje tej pierwszej zasadzie, która dobra nie jest bo wydłuża czas asymilacji treści, zupełnie bez potrzeby.

Na początek można sobie skasować zarówno nazwę jak i "akcję" głównego formularza strony index.jsp. I co? I działa ? Hihi - no działa. Więc są to parametry nie wpływające na pracę programu.

Parę słów do treści tutoriala.
index.jsp
Istotne są:
  • Dwa elementy "interaktywne". 
    • Pole wprowadzania danych  "complete-field". Pole powiązane jest z funkcją doCompletion() pokazującą tabliczkę z danymi uwzględniającymi wpisany początek.
    • Tablica "complete-table". Tablicę tą wypełnia funkcja callback()
  • Wywołanie funkcji init() wewnątrz znacznika <body. Funkcja init() wiąże zmienne pliku javascript z polami w dokumencie html.
javascript.js
Podstawowa funkcja wyświetlająca wynik podlisty kompozytorów to powiązana z "complete-field" doCompletion(). Funkcja ta:
a) tworzy "request"
b) tworzy parametry dla niego (są to parametry "action" oraz "id") zapisywane w url podawanym jako parametr otwarcia "requesta". "action" jest tu parametrem stałym, zaś "id" to tekst który użytkownik zdążył wpisać do pola wprowadzania tekstu
c) otwiera "request" podając jako metodę "GET", oraz wcześniej ustalony "url" w którym przekazuje parametry "id" oraz "action".


AutoCompleteServlet
Gdy doComplete wywołuje swój request, jest wywołanie skierowane do pewnego adresu z pewnymi parametrami.  Ów adres to "autocomplete", ten sam który wpisany został jako kontekst servletu. Dzięki temu servlet jest wywoływany. Ponieważ przy jego otwarciu wskazano metodę "GET" to wykonywana jest metoda "doGet" servletu. Pobiera ona parametry. 

Jeśli akcja jest "complete" to następuje stworzenie stringa w formacie XML z danymi do wyświetlenia jako podpowiedzi kompozytorów.  Metoda doGet ma dwa parametry. Jeden to wejście (request), drugi to wyjście (response). W wyniku pracy dla akcji complete następuje ostatecznie zapis na wyjście "response.getWriter().write". 


Zapis ten jest odbierany przez funkcję callback() z javascript. gdyż tak był zdefiniowany request otwierany przez doCompletion. callback bierze req.responseXML (odpowiedź z servletu = string sformatowany do XML) i wpisuje go do tabliczki comlete-table. Elementy tej tablicy (imiona i nazwiska kompozytorów) są powiązane z linkami w ten sposób, że ich kliknięcie ponownie kieruje do metody doGet servletu tym razem parametr action jest ustawiony na lookup.


Metoda doGet servletu realizuje drugi z alternatywnych warunków,  pierwszy to action.equals.("complete"). W ramach drugiego z warunków servlet tworzy atrybut requestu z danymi kompozytora i przekazuje request stronie composer.jsp


Strona composer.jsp ma możliwość odczytu danych z "requesta" poprzez np. {requestScope.composer.firstName} i te dane publikuje jako wybranego kompozytora.