GWT - Hibernate:如何将 MySQL 的结果显示到 GWT 客户端
Posted
技术标签:
【中文标题】GWT - Hibernate:如何将 MySQL 的结果显示到 GWT 客户端【英文标题】:GWT - Hibernate: How to display results from MySQL into GWT client 【发布时间】:2011-12-08 15:46:13 【问题描述】:我是 GWT 和 Hibernate 的初学者。我制作了一个简单的 GWT RPC 应用程序,它使用 Hibernate 将用户添加到 mysql。我在服务接口中声明了一个方法,即 addUser,它将一个用户(即 firstName 和 LastName)添加到 MySQL 调用 Hibernate 方法。它工作正常。现在添加了第二种方法来从数据库和显示中检索用户。
这里是服务接口
服务接口
package rpctest.client;
import java.util.ArrayList;
import hibDomain.User;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("testService")
public interface RpctestService extends RemoteService
public String addUser(String firstName,String lastName) throws
llegalArgumentException;
public ArrayList<User> getUser();
-------------------------------------
package rpctest.client;
import java.util.ArrayList;
import hibDomain.User;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface RpctestServiceAsync
void addUser(String firstName, String lastName,
AsyncCallback<String> callback);
void getUser(AsyncCallback<ArrayList<User>> asyncCallback);
这里是入口点类
package rpctest.client;
import java.util.ArrayList;
import hibDomain.User;
import rpctest.shared.FieldVerifier;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.html;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Rpctest implements EntryPoint
final TextBox firstName = new TextBox();
final TextBox lastName = new TextBox();
final Button ans = new Button("Add User");
//final Label label1 = new Label("First Name");
//final Label label2 = new Label("Last Name");
private FlexTable userFlexTable = new FlexTable();
//final Label errorLabel = new Label();
private VerticalPanel mainpanel = new VerticalPanel();
private HorizontalPanel addpanel1 = new HorizontalPanel();
private HorizontalPanel addpanel2 = new HorizontalPanel();
private final RpctestServiceAsync calNumbers = GWT
.create(RpctestService.class);
/**
* This is the entry point method.
*/
public void onModuleLoad()
userFlexTable.setText(0, 0, "User ID");
userFlexTable.setText(0, 1, "First Name");
userFlexTable.setText(0, 2, "Second Name");
userFlexTable.setText(0, 3, "Remove");
//add input boxes to panel
addpanel1.add(firstName);
addpanel1.add(lastName);
firstName.setFocus(true);
//add input
mainpanel.add(userFlexTable);
mainpanel.add(addpanel1);
addpanel1.add(ans);
ans.addClickHandler(new ClickHandler()
@Override
public void onClick(ClickEvent event)
addStock();
);
lastName.addKeyPressHandler(new KeyPressHandler()
public void onKeyPress(KeyPressEvent event)
if (event.getCharCode() == KeyCodes.KEY_ENTER)
addStock();
);
RootPanel.get().add(mainpanel);
private void addStock()
String name1 = firstName.getValue();
// Stock code must be between 1 and 10 chars that are numbers, letters, or dots.
/*if (!name1.matches("^[0-9A-Z\\.]1,10$"))
Window.alert("'" + name1 + "' is not a valid name.");
firstName.selectAll();
return;
*/
firstName.setValue("");
String name2 = lastName.getValue();
/*if (!name2.matches("^[0-9A-Z\\.]1,10$"))
Window.alert("'" + name1 + "' is not a valid name.");
lastName.selectAll();
return;
*/
lastName.setValue("");
firstName.setFocus(true);
calNumbers.addUser(name1,name2,
new AsyncCallback<String>()
public void onFailure(Throwable caught)
// Show the RPC error message to the user
Window.alert("check your inputs");
@Override
public void onSuccess(String result)
// TODO Auto-generated method stub
// Add the user to the table.
int row = userFlexTable.getRowCount();
userFlexTable.setText(row, 1, result);
);
calNumbers.getUser(new AsyncCallback< ArrayList<User>>()
public void onFailure(Throwable caught)
// Show the RPC error message to the user
Window.alert("Problem in database connection");
@Override
public void onSuccess( ArrayList<User> result)
// TODO Auto-generated method stub
);
这里是服务实现
package rpctest.server;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
//import com.hib.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import hibDomain.User;
import rpctest.client.RpctestService;
public class RpctestServiceImpl extends RemoteServiceServlet implements RpctestService
public String addUser(String name1, String name2)
throws IllegalArgumentException
Transaction trns = null;
Session session =
HibernateUtil.getSessionFactory().openSession();
try
trns = session.beginTransaction();
User user = new User();
user.setFirstName(name1);
user.setLastName(name2);
session.save(user);
session.getTransaction().commit();
catch (RuntimeException e)
if(trns != null)
trns.rollback();
e.printStackTrace();
finally
session.flush();
session.close();
return name1+name2; // to test flextable entris only
@Override
public ArrayList<User> getUser()
List<User> getUser = null;
Transaction trns = null;
Session session =
HibernateUtil.getSessionFactory().openSession();
try
trns = session.beginTransaction();
getUser = session.createQuery("from User").list();
/* for (Iterator<User> iter = users.iterator(); iter.hasNext();)
User user = iter.next();
User[] arrOfObjects = new User[]user;
*/
trns.commit();
catch (RuntimeException e)
if(trns != null)
trns.rollback();
e.printStackTrace();
finally
session.flush();
session.close();
return (ArrayList<User>) getUser;
服务实现类中的getUser方法显示错误,突出显示方法返回类型即ArrayList 但eclipse没有给出任何建议。
【问题讨论】:
【参考方案1】:好的。现在,在客户端页面上,创建对您创建的服务的异步调用。此链接将帮助您: http://examples.roughian.com/index.htm#Tutorials~RPC_To_Java
编辑:
我很抱歉。
我假设您已经序列化了“用户”类。如果没有,你必须序列化它:
类用户实现 java.io.serializable;
如果要将结果集转换为数组,请检查列表是否为空,如果结果列表不为空,请将其转换为数组并分配给 user[],如:
试试
....
.... .list();
if(!users.isEmpty()
getUser = users.toArray();
然后您可以将 getUser 返回到客户端。
【讨论】:
Ashok,请先看看这个方法。我希望你明白我想在这里做什么,但这是不完整的实现。首先,我需要将用户类型列表分配给用户类型数组,然后我可以返回它。我在这方面遇到了困难。请第一次看到。我希望我可以处理客户端页面上的事情来异步调用这个方法。 您好企业,请检查编辑后的答案。这是你要找的吗? 非常感谢阿肖克。我做的几乎和你提到的一样。但是还是有一些问题。我编辑了服务实现部分,你能看看吗? 您好Enterprize,我怀疑数组是否可序列化?你可以试试 ArrayList 吗?即返回 ArrayList以上是关于GWT - Hibernate:如何将 MySQL 的结果显示到 GWT 客户端的主要内容,如果未能解决你的问题,请参考以下文章
错误 [TRACE] [rpctest] - 查找入口点类:使用 GWT 使用 Hibernate 将数据插入 MySql
GWT + Spring + Hibernate中的示例应用程序[关闭]