- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我终于完成了我的应用程序(Eclipse、GWT、Java、MySQL、Tomcat)并将其上传到服务器上(我让其他人将应用程序上传到服务器上)。但是,服务器安装似乎有问题,我的代码没有发回任何错误。
例如:当创建一个新帐户时,会显示以下消息“您的帐户已创建。请联系领导将青年成员关联到该帐户。”但是数据库没有更新。看来我没有正确捕获异常。
我的代码是:
客户端调用:
AsyncCallback<User> callback = new CreationHandler<User>();
rpc.createUser(textBoxAccount.getText(), textBoxPassword.getText(), null, null, null, callback);
服务器端:
public User createUser(String userName, String pass, String level, String pack, java.sql.Date archived) {
User user = null; // necessary unless you do something in the exception handler
ResultSet result = null;
PreparedStatement ps = null;
String pw_hash = BCrypt.hashpw(pass, BCrypt.gensalt());
try {
ps = conn.prepareStatement(
"INSERT INTO at_accounts (acc_email_address, acc_password, acc_enabled) " +
"VALUES (?, ?, ?)");
ps.setString(1, userName);
ps.setString(2, pw_hash);
ps.setString(3, "1");
ps.executeUpdate();
}
catch (SQLException e) {
//do stuff on fail
System.out.println("SQLException createUser 1.");
e.printStackTrace();
user = null;
}
finally {
if (result != null) {
try {
result.close();
}
catch (SQLException e) {
System.out.println("SQLException createUser 2.");
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
}
catch (SQLException e) {
System.out.println("SQLException createUser 3.");
e.printStackTrace();
}
}
}
return user;
}
客户端:
class CreationHandler<T> implements AsyncCallback<User> {
//Create the account.
public void onFailure(Throwable ex) {
Window.alert("RPC call failed - CreationHandler - Notify Administrator.");
}
public void onSuccess(User result) {
Window.alert("Your account has been created. Please contact a leader to associate youth members to it.");
}
}
如有任何帮助,我们将不胜感激。
问候,
格林
嗨,乔克,
请问是这个意思吗?
public User createUser(String userName, String pass, String level, String pack, java.sql.Date archived) {
User user = null; // necessary unless you do something in the exception handler
ResultSet result = null;
PreparedStatement ps = null;
String pw_hash = BCrypt.hashpw(pass, BCrypt.gensalt());
try {
ps = conn.prepareStatement(
"INSERT INTO at_accounts (acc_email_address, acc_password, acc_enabled) " +
"VALUES (?, ?, ?)");
ps.setString(1, userName);
ps.setString(2, pw_hash);
ps.setString(3, "1");
ps.executeUpdate();
}
catch (SQLException e) {
//do stuff on fail
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("SQLException createUser 1.");
e.printStackTrace();
user = null;
}
finally {
if (result != null) {
try {
result.close();
}
catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("SQLException createUser 2.");
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
}
catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("SQLException createUser 3.");
e.printStackTrace();
}
}
}
try {
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("SQLException createUser 4 - commit error.");
e.printStackTrace();
}
return user;
}
这是带有建议的错误处理的更新代码:
package org.AwardTracker.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.AwardTracker.client.BCrypt;
import org.AwardTracker.client.Account;
import org.AwardTracker.client.AccountAndCubs;
import org.AwardTracker.client.AccountCubAssociation;
import org.AwardTracker.client.AwardAward;
import org.AwardTracker.client.AwardDescription;
import org.AwardTracker.client.AwardStockDtls;
import org.AwardTracker.client.DBConnection;
import org.AwardTracker.client.SectionDetails;
import org.AwardTracker.client.Stock;
import org.AwardTracker.client.User;
import org.AwardTracker.client.ViewData;
import org.AwardTracker.client.YMATask;
import org.AwardTracker.client.YMAwards;
import org.AwardTracker.client.YMandAward;
import org.AwardTracker.client.YMAwardDetails;
import org.AwardTracker.client.YouthMember;
import org.AwardTracker.client.YouthMemberAwards;
import org.AwardTracker.client.YthMmbrSectDtls;
import org.AwardTracker.server.Base64Encode2;
public class MySQLConnection extends RemoteServiceServlet implements DBConnection {
//TODO
// •Use JNDI to bind the data source.
// •Close the connection as soon as its done in finally block.
// •Manage the connection in single class for whole application.
// •Initialise the data source at application start up single time.
// •Store the database configuration outside the JAVA code somewhere in properties file or web.xml.
// •Create an abstract class for AsyncCallback that will handle all the failures happened while performing any RPC calls.
// •Extend this abstract class for all RPC AsyncCallback but now you have to just provide implementation of onSuccess() only.
// •Don't handle any exception in service implementation just throw it to client or if handled then re-throw some meaning full exception back to client.
// •Add throws in all the methods for all the RemoteService interfaces whenever needed.
private static final long serialVersionUID = 1L;
private Connection conn = null;
private String url = "jdbc:mysql://localhost/awardtracker";
private String user = "awtrack";
private String pass = "************";
public MySQLConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
} catch (Exception e) {
//NEVER catch exceptions like this
System.out.println("Error connecting to database - not good eh");
e.printStackTrace();
}
}
//Store and retrieve data used by Views within the application
//This allows us to securely pass parameters between Views.
private ViewData viewData = null;
public ViewData setViewData(String accountId, String accountLevel,
String ymId, String awId, String adGroup) {
viewData = new ViewData();
viewData.setaccountId(accountId);
viewData.setaccountLevel(accountLevel);
viewData.setymId(ymId);
viewData.setawId(awId);
viewData.setadGroup(adGroup);
return viewData;
}
public ViewData getViewData() {
return viewData;
}
public User authenticateUser(String accID, String userName, String pass, String level, String pack, Integer enabled, java.sql.Date archived) {
User user = null; // necessary unless you do something in the exception handler
ResultSet result = null;
PreparedStatement ps = null;
String stored_hash = null;
try {
ps = conn.prepareStatement(
"SELECT * " +
"FROM at_accounts " +
"WHERE acc_email_address = ?");
ps.setString(1, userName);
result = ps.executeQuery();
while (result.next()) {
user = new User(result.getString(1), result.getString(2), result.getString(3), result.getString(4), result.getString(5), result.getInt(6), result.getDate(7));
stored_hash = result.getString(3);
}
}
catch (SQLException e) {
try {
conn.rollback();
}
catch (SQLException e2) {
System.out.println("Error rolling back transaction for authenticateUser.");
e2.printStackTrace();
}
System.out.println("SQLException in authenticateUser.");
e.printStackTrace();
}
if (stored_hash != null) {
if (BCrypt.checkpw(pass, stored_hash)) {
} else {
user = null;
}
}else{
user = null;
}
return user;
}
//Disable or enable Account
public User disableUser(String user, Integer enabled) {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(
"UPDATE at_accounts " +
"SET acc_enabled=? " +
"WHERE acc_email_address=?");
ps.setInt(1, enabled);
ps.setString(2, user);
ps.executeUpdate();
conn.commit();
}
catch (SQLException e) {
try {
conn.rollback();
}
catch (SQLException e2) {
System.out.println("Error rolling back transaction for createUser.");
e2.printStackTrace();
}
System.out.println("SQLException in createUser.");
e.printStackTrace();
}
return null;
}
public User duplicateUser(String userName, String pass, String level, String pack, java.sql.Date archived) {
User user = null; // necessary unless you do something in the exception handler
ResultSet result = null;
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(
"SELECT * " +
"FROM at_accounts " +
"WHERE acc_email_address = ?");
ps.setString(1, userName);
result = ps.executeQuery();
while (result.next()) {
user = new User(null, result.getString(2), null, null, null, null, null);
}
}
catch (SQLException e) {
try {
conn.rollback();
}
catch (SQLException e2) {
System.out.println("Error rolling back transaction for duplicateUser.");
e2.printStackTrace();
}
System.out.println("SQLException in duplicateUser.");
e.printStackTrace();
}
return user;
}
public User createUser(String userName, String pass, String level, String pack, java.sql.Date archived) {
PreparedStatement ps = null;
String pw_hash = BCrypt.hashpw(pass, BCrypt.gensalt());
try {
ps = conn.prepareStatement(
"INSERT INTO at_accounts (acc_email_address, acc_password, acc_enabled) " +
"VALUES (?, ?, ?)");
ps.setString(1, userName);
ps.setString(2, pw_hash);
ps.setString(3, "1");
ps.executeUpdate();
conn.commit();
}
catch (SQLException e) {
try {
conn.rollback();
}
catch (SQLException e2) {
System.out.println("Error rolling back transaction for createUser.");
e2.printStackTrace();
}
System.out.println("SQLException in createUser.");
e.printStackTrace();
}
return null;
}
最佳答案
要记住的要点:
finally
block 中完成后立即关闭连接。我已经分享了 ConnectionUtil 类的示例代码,其唯一目的是使用 JNDI 查找 管理单个类中的连接,它可以记录有多少连接申请中几点开放?
请看下面的帖子:
GWT - how to catch an exception correctly?
AsyncCallback
创建一个抽象类,它将处理执行任何 RPC 调用时发生的所有失败。AsyncCallback
扩展此抽象类,但现在您只需提供 onSuccess()
的实现即可。RemoteService
接口(interface)的所有方法添加 throws
。示例代码:
// single class to handle all the AsyncCallback failure
public abstract class MyAsyncCallback<T> implements AsyncCallback<T> {
@Override
public void onFailure(Throwable caught) {
// all the failure are catched here
// prompt user if needed
// on failure message goes to here
// send the failure message back to server for logging
}
}
// do it for all the RPC AsyncCallback
public class CreationHandler<T> extends MyAsyncCallback<T> {
//Create the account.
public void onSuccess(T result) {
// on success message goes to here
}
}
// use in this way
AsyncCallback<User> callback = new CreationHandler<User>();
关于java - Eclipse - GWT - Java - MySQL - 如何正确捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587875/
我想知道 GWT、GWT-RPC、EXT-GWT 和 Smart GWT 之间的区别。目前,我设法借了有关 GWT 的书籍,据我所知,它只是一个旨在促进快速高效的 Ajax(异步 JavaScript
不,这不是问如何让 Guava 在 GWT 中工作,因为我已经让它工作了。 我的问题是,当我执行继承时 我希望在命名空间 com.google.common.collect 中找到一个文件 Coll
Ext GWT 和 GWT-Ext 之间有区别吗?因为我在浏览 Ext GWT 时看到了这个页面 http://gwt-ext.com/demo/ .有什么帮助吗? 最佳答案 ExtGWT 由开发 E
调查gwt-dispatch之后和 Google Wave I/O presentation (Best practices) ( video here ),我想知道为什么官方 GWT 版本 (2.0
我在我的应用程序中使用带有 ext 的 GWT 2.0.3。该项目不再处于积极开发状态并且已被 Smart GWT 取代。我正在为此应用程序使用 HMVC 模式。现在使用现有的 GWT 2.0.3 和
当我尝试在 Windows Vista 上为 ie 8 使用 GWT 开发模式插件时,我不断看到安装插件的提示。 运行插件后我仍然总是看到这个页面。有谁知道如何解决这样的问题? 最佳答案 看这个:Ca
我正在尝试对 GWT RPC 序列化策略进行一些背景阅读,发现 GWT 在编译后将 *.gwt.rpc 文件中的可序列化类型列入白名单。 以下是我的应用程序中生成的一个此类 .gwt.rpc 文件的摘
如果 Enum 实现了 java.io.Serializable,我无法将它序列化为 GWT。它会成功编译 GWT,但在运行时,我会感到害怕: Type 'com....security..Admin
是否有可以与 GWT 一起使用的进度条小部件,还是必须自己制作?我尝试在 google-web-toolkit-incubator、gwtupload 和 upload4gwt 中使用进度条,但没有任
由于 Javadoc 没有说明使用 com.google.gwt.core.shared.GWT 的原因,它似乎包含 com.google.gwt.core.client.GWT 的功能子集,前者存在
我必须在 gwt 中创建一个图像按钮,它使用三个图像(左侧图像、中心拉伸(stretch)图像和右侧图像)。左侧图像和右侧图像具有圆角。中心图像想要拉伸(stretch)取决于按钮标题大小.创建的 I
我正在尝试在 GWT 的垂直面板中设置 align 属性,如下所示: vpanel = new VerticalPanel(); vPanel.setHorizontalAlignment(HasHo
我想在 GWT 中添加可编辑的组合框,请告诉我解决方案? 最佳答案 试试 Advanced GWT Components , 具体来说 org.gwt.advanced.client.ui.widge
我在使用 GWT Designer 配置 GXT 时遇到问题。我拥有 Eclipse、GWT 插件和 GXT 的所有新版本,但无法将 GXT 配置为与 GWT Designer 一起使用。我设置了我的
我们有一个当前使用 Capistrano 部署的应用程序。该应用程序使用 php 作为后端,使用 GWT 作为前端。 我已经设法通过 Ant 文件编译 GWT,但想用自定义 Capistrano 任务
这应该很简单,但不知何故我找不到在 GWT 中创建简单超链接的方法。基本上,我想在用户点击某些东西时加载另一个页面。 Hyperlink似乎仅指向内部 GWT 应用程序状态。我想我可以把链接放在 HT
在 GWT 界面中哪个更好,使用带有 javacode 的普通 MVP,还是 UiBinder?从性能、编辑、简单性方面。 最佳答案 这就是Google says : Besides being a
GWT 2.5.0 开发模式 我在下面对文件上传做了一个简单的测试, startupUrl: http://127.0.0.1:8888/UploadTest.html?gwt.codesvr=127
我需要创建一个SuggestBox,在按下时将显示所有选项 Enter键。 我已经写了以下实现,看来是 工作正常。 我希望有人审查我的实现情况,并让我知道 在任何特定情况下都会引起问题。 另外,要传递
在哪里可以找到有关 GWT 和 GWT-Ext 延迟加载的更多信息? 最佳答案 快速谷歌搜索显示 nice blog entry由 GWT 团队提供。 关于 GWT-Ext,我无话可说,但无论采用何种
我是一名优秀的程序员,十分优秀!