Wypowiedzi
-
Jakub N.:
PersonalWindow p = new PersonalWindow();
p = OkienkaPrywatne.get(0);
Po co tworzysz nowy obiekt skoro za chwilę go nadpisujesz już istniejącym?
Jeśli już to powinno być tak:
PersonalWindow p = OkienkaPrywatne.get(0);
Kilka moich uwag:
Od razu przyznam że nie zagłębiałem się bardzo w kod, jednak wydaje mi się dziwne, że serwer tworzy jakiekolwiek okienka.
To klienci (na swoich komputerach) powinni mieć okienko z zapisem rozmowy (ewentualnie mogą tworzyć kolejne okienka do rozmów prywatnych), a serwer powinien być odpowiedzialny jedynie za przekazywanie komunikatów. Tylko i wyłącznie przekazywanie komunikatów - sam nic nigdzie nie wyświetla.
Komunikacja powinno wyglądać tak:
Klient pisze komentarz i klika wyślij -> serwer odbiera komunikat i rozsyła go do wszystkich podłączonych klientów. Klienci odczytują komunikat i wyświetlają w swoim "głównym" oknie.
Rozmowy prywatne powinny się odbywać w ten sam sposób z tym że serwer rozsyła komunikat tylko do 2 stron rozmowy.
Komunikację oparłeś na socket'ach - ok, jednak polecam bibliotekę, która jest idealna do zastosowania w tym przypadku - http://code.google.com/p/kryonet/. "Pod spodem" tej biblioteki są oczywiście użyte sockety, jednak używając tej biblioteki oszczędzasz sporo czasu :)
Powodzenia -
Aby mieć możliwość przeczytania tego posta musisz być członkiem grupy Projekty start-up
-
org.postgresql.util.PSQLException: BŁĄD: kolumna "companyid" nie istnieje
Wklej listing całej klasy Company i Party -
To jest jeden ze sposobów. Klasy oczywiście bardzo uproszczone
Tworzysz klasę służącą do komunikacji z bazą danych
public class DbUtils{
public final List<User> getUsers(){
//połączenie do bazy,
//wyciągnięcie danych,
//opakowanie w listę
}
}
Następnie Tworzysz data model dla Twojej tablicy, rozszerzasz klasę i nadpisujesz odpowiednie metody
public class UsersDM extends AbstractTableModel
{
protected ArrayList<User> data;
protected Vector columnNames;
public int getRowCount() {
return data.size();
}
public int getColumnCount() {
return columnNames.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
User user = (User) data.get(rowIndex);
switch(columnIndex)
{
case 0:
return user.getName();
case 1:
return user.getLastName();
case 2:
return user.getRole();
}
}else return new Object();
}
public Class getColumnClass(int column){
return getValueAt(0, column).getClass();
//jesli masz wszystko w Stringach to dajesz po prostu return String.class
}
public String getColumnName(int columnIndex){
return (String)columnNames.elementAt(columnIndex);
}
public boolean isCellEditable(int row, int column){
return false;
}
private void initColumnNames(){
columnNames = new Vector<String>();
columnNames.addElement("Name");
columnNames.addElement("Last name");
columnNames.addElement("Role");
}
public UsersDM()
{
this.initColumnNames();
try{
DbUtils db = new DbUtils();
this.data = (ArrayList<User>) db.getUsers();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
I teraz w klasie odpowiedzialnej za "widok" tworzysz tabelkę:
JTable usersTable= new JTable();
usersTable.setModel(new UsersDM());
W tym momencie w tabelce powinny się pojawić wpisy z bazy.
Celowo w kodzie powyżej pominąłem obsługę wyjątków aby nie zaciemniać kodu.
Można również inaczej zorganizować inicjowanie tabeli i wyciąganie danych, jednak wydaje mi się że od takiego czegoś możesz wyjść i dalej już ulepszać kod według swojego uznania.Szymon Lisiecki edytował(a) ten post dnia 18.09.12 o godzinie 18:55 -
W czym masz problem? Podaj więcej szczegółów. Jakiś kawałek kodu? Równie dobrze mogłeś napisać: dostaję error potrzebuje pomocy. Opisz dokładnie swój problem.
-
Paweł, bardzo dziękuję za nakierowanie na temat
Pozdrawiam -
Witam,
Od pewnego czasu zastanawiam się nad koncepcją logowania do wielu aplikacji za pomocą jednego formularza. Aby bardziej zobrazować mój zamiar, opiszę pokrótce o co mi chodzi. Mam kilka aplikacji webowych, które działają na kilku serwerach i korzystają z kilku baz danych (wszystko w sieci lokalnej). Wygląda to mniej więcej tak:
aplikacja1 na serwer1 baza db1 na serwerDB
aplikacja2 na serwer2 baza db2 na serwerDB
aplikacja3 na serwer3 baza db3 na serwerDB
aplikacja4 na serwer4 baza db4 na serwerDB
Każda z aplikacji ma swój własny mechanizm logowania - strona z polami do wpisania loginu i hasła.
I teraz właściwy opis zagadnienia. Chciałbym stworzyć aplikację której zadaniem byłoby tylko autoryzowanie użytkowników. Miało by to działać na zasadzie takiej, że wchodzę na stronę, podaję login i hasło. Po poprawnym zalogowaniu przechodzę na drugą stronę internetową, gdzie byłyby linki do innych aplikacji (aplikacja1, aplikacja2, itd.). Po kliknięciu na link przechodzę do tej aplikacji (która znajduje się na innym serwerze), ale nie wyświetlam już okna do logowania bo ta aplikacja już "wie" że jestem zalogowany. I teraz pytanie jak "poinformować" aplikację1 że jestem zalogowany?
Dla jaśniejszego zobrazowania podam jeszcze jeden przykład. na stronie http://google.pl loguję się na swoje konto. Gdy później wejdę na youtube.com to automatycznie jestem zalogowany na swoim koncie, wchodzę na gmail.com i znów jestem już zalogowany. Generalnie podając raz login i hasło, jestem zalogowany na kilku serwisach.
Jeśli ktoś ma koncepcję jak to zrealizować lub już to robił kiedyś to bardzo proszę o opisanie na jakiej zasadzie działa takie uwierzytelnianie.
PS. mam pełen dostęp do serwerów i kodów źródłowych aplikacji więc nie ma problemu z jakimkolwiek konfigurowaniem czy modyfikacją kodu
Pozdrawiam -
Z tego co piszesz to prawdopodobne są 2 przyczyny. Pierwsza to błąd w mapowaniu, 2 to błędne dodanie wpisów do bazy za pomocą pgAdmina.
-
Kilka postów wyżej zadałem Ci kilka pytań. Dopóki na nie nie odpowiesz będzie trudno cokolwiek stwierdzić.
-
Mniej więcej tak:
List<News> newsList = sessionFactory.getCurrentSession().createQuery("from News").setCacheable(true).list();
if(newsList!=null){
System.out.println("newsList size = " + newsList.size());
for (News n : newsList){
System.out.println(n.getId());
System.out.println(n.getContent());
Author author = n.getAuthor();
author.getId();
author.getName();
} }else{
System.out.println("newsList is null!!!");
}
jeśli masz jakiegoś logera to oczywiście zamiast System.out.println() używasz metod logera np:
logger.debug("newsList size = " + newsList.size());
Natomiast w najbardziej podstawowym przypadku System.out.println też jest ok. To co wyrzucisz za pomocą tej pętelki znajdzie się w pliku logów.
Jeśli używasz tomcata to albo będzie od razu widoczne w konsoli serwera (wersja windows) albo w pliku tomcat/logs/catalina.out (wersja linux). Jeśli używasz logera to plik logów jest tam gdzie sobie skonfigurowałeś. -
Zrzuciłeś sobie do logów obiekt zwracany przez zapytanie?
Jeśli tak to czy zapytanie zwraca listę obiektów typu News?
Ile jest takich obiektów?
Czy gdy przeglądasz tabele bazy to widzisz poprawne wpisy?
Czy zanim chciałeś wyświetlić imię autora, na stronie pojawiały się inne dane?Szymon Lisiecki edytował(a) ten post dnia 06.09.12 o godzinie 15:09 -
Czy obiekt author nie jest przypadkiem null?
Zobacz co zwraca Ci zapytanie i wyświetl sobie wyniki (np. do logów).
I
...createQuery("from News, Authors")...
Zamieniłbym na
...createQuery("from News")...
Poprzez mapowanie pole author w klasie News zostanie automatycznie zaczytane -
<td valign="top" width="50px"><c:out value="${news.author.name}" /></td>
-
Dariusz Zarocki:
... ja niestety nie mam udokumentowanego kursu obsługi programu Java...
Nic nie jest napisane, że trzeba mieć udokumentowany kurs. :)
Jacek Szumigaj:
Programu Java? ojejku muszę lecieć i zobaczyć co to jest.
Proponuję wylistować katalog C:\Program Files\Java\jdk.{wersja}\bin, a gwarantuję Ci, że znajdziesz PROGRAM java.exe -
Problem rozwiązany :)
Dla potomnych:
W pliku index.jsp robiłem przekierowanie na akcję prepareLogin.
<% response.sendRedirect("prepareLogin.html"); %>
W innych plikach jsp zaczytywałem różne rzeczy m.in obrazki, css-y czy js-y.
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/style.css" />
W pliku web.xml ustawiłem error page:
<error-page>
<error-code>404</error-code>
<location>/index.jsp</location>
</error-page>
I teraz rzecz decydująca. Za każdym razem gdy nie było jakiegoś pliku .js czy .css generował się błąd 404 a tym samym następowało przekierowanie na plik index.jsp a to z kolei wywoływało akcję ... itd. Tyle razy ile nie było jakiegoś pliku tyle razy odpalała się jedna akcja :) -
Kilka linijek logów. Ustawiłem wszystkie na debug więc wyrzuca dużo info, ale te linijki myślę że są zastanawiające. w odstępie 0.013 sek jest ponownie wywoływana metoda execute w akcji
[DEBUG] 2011-07-11 12:54:11,641 : Setting static parameters {}
[DEBUG] 2011-07-11 12:54:11,641 : Setting static parameters {}
[DEBUG] 2011-07-11 12:54:11,641 : Validating /prepareLogin with method execute.
[DEBUG] 2011-07-11 12:54:11,659 : Checking ConfigurationProviders for reload.
[DEBUG] 2011-07-11 12:54:11,660 : Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@d637d], property=struts]
[DEBUG] 2011-07-11 12:54:11,660 : Checking ConfigurationProviders for reload.
[DEBUG] 2011-07-11 12:54:11,660 : Checking ConfigurationProviders for reload.
[DEBUG] 2011-07-11 12:54:11,660 : Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@d637d], property=struts]
[DEBUG] 2011-07-11 12:54:11,660 : Checking ConfigurationProviders for reload.
[DEBUG] 2011-07-11 12:54:11,661 : Creating an DefaultActionProxy for namespace and action name prepareLogin
[INFO ] 2011-07-11 12:54:11,661 : Starting execution stack for action prepareLogin
[DEBUG] 2011-07-11 12:54:11,661 : Setting params
[DEBUG] 2011-07-11 12:54:11,661 : Setting static parameters {}
[DEBUG] 2011-07-11 12:54:11,661 : Setting static parameters {}
[DEBUG] 2011-07-11 12:54:11,662 : Validating /prepareLogin with method execute.
[DEBUG] 2011-07-11 12:54:11,663 : Invoking validate() on action pl.sl.multi.actions.LoginPrepareAction@1c931fb
[DEBUG] 2011-07-11 12:54:11,663 : cannot find method [validateExecute] in action [pl.sl.multi.actions.LoginPrepareAction@1c931fb]
[DEBUG] 2011-07-11 12:54:11,663 : cannot find method [validateDoExecute] in action [pl.sl.multi.actions.LoginPrepareAction@1c931fb]
[DEBUG] 2011-07-11 12:54:11,663 : Executing action method = null
[DEBUG] 2011-07-11 12:54:11,663 : [LoginPrepareAction] getRemoteAddr = 0:0:0:0:0:0:0:1
[DEBUG] 2011-07-11 12:54:11,678 : Invoking validate() on action pl.sl.multi.actions.LoginPrepareAction@1f07360
[DEBUG] 2011-07-11 12:54:11,678 : cannot find method [validateExecute] in action [pl.sl.multi.actions.LoginPrepareAction@1f07360]
[DEBUG] 2011-07-11 12:54:11,678 : cannot find method [validateDoExecute] in action [pl.sl.multi.actions.LoginPrepareAction@1f07360]
[DEBUG] 2011-07-11 12:54:11,678 : Executing action method = null
[DEBUG] 2011-07-11 12:54:11,678 : [LoginPrepareAction] getRemoteAddr = 0:0:0:0:0:0:0:1
[DEBUG] 2011-07-11 12:54:12,664 : Forwarding to location /jsp/all/login.jsp
-
to jest struts.xml, a spring security nie używam
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="multi" namespace="" extends="struts-default">
<interceptors> <interceptor-stack name="defaultStack">
<interceptor-ref name="logger"/>
<interceptor-ref name="timer"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
<default-action-ref name="prepareLogin" /> <global-results>
<result name="prepareLogin">/jsp/all/login.jsp</result>
</global-results>
<action name="prepareLogin" class="pl.sl.multi.actions.LoginPrepareAction">
<result name="success" type="dispatcher">/jsp/all/login.jsp</result>
<result name="conf" type="dispatcher">/jsp/all/conf.jsp</result>
</action>
<action name="login" class="pl.sl.multi.actions.LoginAction">
<result name="success" type="dispatcher">/jsp/all/login.jsp</result>
<result name="conf" type="dispatcher">/jsp/all/conf.jsp</result>
</action>
</package>
<include file="struts/admin.xml"></include>
<include file="struts/adminBills.xml"></include>
<include file="struts/adminLogs.xml"></include>
<include file="struts/inlandRevenue.xml"></include>
</struts>
-
Witam,
Zauważyłem ostatnio dziwną przypadłość. Każda akcja odpala mi się 10 razy pod rząd.
Przed wyświetleniem strony do logowania wywoływana jest akcje prepareLogin, i ona wykonuje się 10 razy. Akcja logowania (login) również. Nie mam pojęcia czym to może być spowodowane.
Będę wdzięczny za jakiekolwiek wskazówki bądź "tropy"
Z góry dzięki -
Problem rozwiązany, dzięki za podpowiedź
-
Zgadza się, jednak chodziło mi o coś innego (może źle opisałęm swój problem).
Może wersja uproszczona, bez tego wszystkiego dookoła.
Mam w programie zmienną typu String a w tej zmiennej mam nazwę Klasy.
Dla przykładu:
String name = "Prg";
Jak stworzyć obiekt typu Prg?
- 1
- 2