【问题标题】:GWT - Hibernate: How to display results from MySQL into GWT clientGWT - Hibernate:如何将 MySQL 的结果显示到 GWT 客户端
【发布时间】: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没有给出任何建议。

【问题讨论】:

    标签: mysql hibernate gwt rpc


    【解决方案1】:

    好的。现在,在客户端页面上,创建对您创建的服务的异步调用。此链接将帮助您: http://examples.roughian.com/index.htm#Tutorials~RPC_To_Java

    编辑:

    我很抱歉。

    1. 我假设您已经序列化了“用户”类。如果没有,你必须序列化它:

      类用户实现 java.io.serializable;

    2. 如果要将结果集转换为数组,请检查列表是否为空,如果结果列表不为空,请将其转换为数组并分配给 user[],如:

      试试{

      ....

      .... .list();

      if(!users.isEmpty(){

      getUser = users.toArray();

      }

      }

      然后您可以将 getUser 返回到客户端。

    【讨论】:

    • Ashok,请先看看这个方法。我希望你明白我想在这里做什么,但这是不完整的实现。首先,我需要将用户类型列表分配给用户类型数组,然后我可以返回它。我在这方面遇到了困难。请第一次看到。我希望我可以处理客户端页面上的事情来异步调用这个方法。
    • 您好企业,请检查编辑后的答案。这是你要找的吗?
    • 非常感谢阿肖克。我做的几乎和你提到的一样。但是还是有一些问题。我编辑了服务实现部分,你能看看吗?
    • 您好Enterprize,我怀疑数组是否可序列化?你可以试试 ArrayList 吗?即返回 ArrayList 而不是 user[]。这将 100% 有效,因为我一直在使用 ArrayList 实现。试试看,然后告诉我。
    • 嗨 Ashok,我将所有 GWT 代码都放在了 OP 中。您可以看到它,我也将方法的返回类型更改为 ArrayList 但它显示相同的错误。即现在突出显示 getUser 方法的返回类型,即 ArrayList。如果您看到实现类,可能是您找到错误的原因。因为我不确定那里的实施,因为我之前只使用了一种服务方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2011-08-31
    • 1970-01-01
    • 2013-03-05
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多