#mysql #eclipse #gwt #tomcat
#mysql #eclipse #gwt #tomcat
Вопрос:
Мой код был обновлен.
In recall, I'm making a GWT MySQL web application. I tried to modified a code from internet. Wen I run my project as a Web application (Debug As mode), I'm having the following compilation errors:
[ERROR] [deuxiemeapplicationgwt] - Unable to load module entry point class com.essai.client.DeuxiemeApplicationGwt (see associated exception for details)
[ERROR] [deuxiemeapplicationgwt] - Failed to load module 'deuxiemeapplicationgwt' from user agent 'Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23' at 127.0.0.1:60265
onModuleLoad() threw an exception
Exception while loading module com.essai.client.DeuxiemeApplicationGwt. See Development Mode for details.
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396) at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200) at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:525) at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at com.google.gwt.user.client.ui.ComplexPanel.add(ComplexPanel.java:88) at com.google.gwt.user.client.ui.AbsolutePanel.add(AbsolutePanel.java:97) at com.google.gwt.user.client.ui.Panel.add(Panel.java:71) at com.essai.client.DeuxiemeApplicationGwt.onModuleLoad(DeuxiemeApplicationGwt.java:28) ... 9 more
Код файлов также был обновлен и находится здесь:
==================================================
package com.essai.client;
import com.google.gwt.user.client.rpc.RemoteService;
import com.essai.client.User;
import java.io.Serializable;
public interface ConnexionBD extends RemoteService
{
public User authenticateUser(String user, String motDePasse);
}
==================================================
package com.essai.client;
import com.essai.client.User;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface ConnexionBDAsync {
public void authenticateUser(String User, String motDePasse,
AsyncCallback<User> callback);
}
==================================================
//EntryPoint file
package com.essai.client;
import com.essai.client.User;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.*;
public class DeuxiemeApplicationGwt implements EntryPoint, ClickListener, IsWidget {
private ConnexionBDAsync rpc;
private TextBox usernameBox;
private TextBox passwordBox;
private Button OK;
public DeuxiemeApplicationGwt() {
rpc = (ConnexionBDAsync) GWT.create(ConnexionBD.class);
ServiceDefTarget target = (ServiceDefTarget) rpc;
// The path 'MySQLConnection' is determined in ./public/LoginScreen.gwt.xml
// This path directs Tomcat to listen for this context on the server side,
// thus intercepting the rpc requests.
String moduleRelativeURL = GWT.getModuleBaseURL() "MySQLConnection";
target.setServiceEntryPoint(moduleRelativeURL);
initGUI();
}
public void onModuleLoad() {
RootPanel.get().add(this);
}
private void initGUI() {
Grid g = new Grid(3, 2);
usernameBox = new TextBox();
passwordBox = new TextBox();
OK = new Button("OK");
g.setWidget(0, 0, new Label("Username: "));
g.setWidget(0, 1, usernameBox);
g.setWidget(1, 0, new Label("Password: "));
g.setWidget(1, 1, passwordBox);
g.setWidget(2, 1, OK);
}
public void onClick(Widget sender) {
if (sender.equals(OK)) {
AsyncCallback<User> callback = new AuthenticationHandler<User>();
rpc.authenticateUser(usernameBox.getText(),passwordBox.getText(),
callback);
}
}
private class AuthenticationHandler<T> implements AsyncCallback<User> {
public void onFailure(Throwable ex) {
RootPanel.get().add(new HTML("RPC call failed. :-("));
}
public void onSuccess(User result) {
//do stuff on success with GUI, like load the next GUI element
}
}
@Override
public Widget asWidget() {
// TODO Auto-generated method stub
return null;
}
}
==================================================
//ConnexionMySQL.java
package com.essai.server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.essai.client.User;
import com.essai.client.ConnexionBD;
public class ConnexionMySQL extends RemoteServiceServlet implements ConnexionBD
{
private Connection conn = null;
private String status;
private String url = "jdbc:mysql://localhost/gestionpatients";
private String utilisateurBD = "root";
private String motDePasseBD = "";
public ConnexionMySQL()
{
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, utilisateurBD, motDePasseBD);
}
catch (Exception e)
{
}
}
public User authenticateUser(String user, String motDePasse)
{
User utilisateur = null;
try
{
PreparedStatement ps = conn.prepareStatement(
"select readonly * from docteurs where Noms = "" user "" AND " "ID = "" pass """
);
ResultSet result = ps.executeQuery();
while (result.next())
{
utilisateur = new User(result.getString(1), result.getString(2));
}
result.close();
ps.close();
}
catch (SQLException sqle)
{
//Comportement en cas d'erreur
}
return utilisateur;
}
}
==================================================
//User.java: user configuration
package com.essai.client;
import com.google.gwt.user.client.rpc.IsSerializable;
//import java.io.Serializable;
public class User implements IsSerializable
{
private String nomUtilisateur;
private String motDePasse;
@SuppressWarnings("unused")
private User() {}
public User(String user, String motDePasse)
{
this.nomUtilisateur = user;
this.motDePasse = motDePasse;
}
}
==================================================
//XML file
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='deuxiemeapplicationgwt'>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User'/>
<!-- Inherit the default GWT style sheet. You can change -->
<!-- the theme of your GWT application by uncommenting -->
<!-- any one of the following lines. -->
<inherits name='com.google.gwt.user.theme.clean.Clean'/>
<!-- <inherits name='com.google.gwt.user.theme.standard.Standard'/> -->
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits -->
<!-- Specify the app entry point class. -->
<entry-point class="com.essai.client.DeuxiemeApplicationGwt"/>
<inherits name="com.google.gwt.user.theme.standard.Standard"/>
<inherits name="com.google.gwt.user.theme.chrome.Chrome"/>
<inherits name="com.google.gwt.user.theme.dark.Dark"/>
<!-- Specify the paths for translatable code -->
<source path='client'/>
<source path='shared'/>
</module>
==================================================
Структуру проекта можно увидеть здесь: http://tonguim.free.fr/divers/imgGWTtomcat.jpg
Спасибо за любую помощь.
Комментарии:
1. Почему в вашем XML-файле нет
inherit
строк дляorg.apache.catalina.User
? У вас есть некоторые для других пакетов, которые вы используете.2. Привет, Сарнольд. Я добавил строку для org.apache.catalina. Пользователь, но это ничего не изменило.
Ответ №1:
Проблема в том, что вы пишете RootPanel.get().add(this)
в onModuleLoad()
, а asWidget()
возвращает null
. Это было бы то же самое, что писать RootPanel.get().add(null)
. Это причина возникновения исключения NullPointerException onModuleLoad
. Или, если быть более точным, строка child.removeFromParent();
в ComplexPanel.add(Widget, Element)
вызывает исключение.
Короче говоря, давайте asWidget()
вернем что-то другое, чем null
. Например, сделайте вашу сетку, которую вы создаете в initGui()
, членом класса и верните ее. В своем текущем виде initGui
в любом случае не создает графический интерфейс.
РЕДАКТИРОВАТЬ без обид, но, глядя на ваш код, вы, похоже, не совсем понимаете GWT. Помимо добавления null
в RootPanel
, ваше Grid
нигде не прикреплено. Кроме того, вы реализуете ClickListener
, но вы никогда не подключаете этот прослушиватель для фактического прослушивания события. Если это полный код (а не просто вырезанный для удобства чтения), вам следует сначала прочитать некоторые документы gwt.