2012-07-14 116 views
0

我有一个窗体中有一个文本字段。用户在文本字段中输入电子邮件地址,并且当用户提交表单时,Action类会从Users表中找到用户的uid,并在JSP页面上显示uid作为<s:actionmessage/>的消息。我得到一个IndexOutOfBoundsExceptionjava.lang.IndexOutOfBoundsException:索引:0,大小:0

我的JSP的形式是:

<s:form action="okadddqs" method="post" cssClass="text"> 

    <s:textfield label="Your Email address " name="email"/> 
    <s:submit value="Find Uid"/> 
</s:form> 

Action类的代码是:

package com.rambo.action; 

import beans.Users; 
import com.opensymphony.xwork2.ActionSupport; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.StringTokenizer; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import org.hibernate.Session; 

/** 
* 
* @author ROMO 
*/ 
@ManagedBean 
@SessionScoped 
public class NewQuestion extends ActionSupport { 

    private String email; 

    private List<Users> ul = new ArrayList<Users>(); 

    public List<Users> getUl() { 
     return ul; 
    } 

    public void setUl(List<Users> ul) { 
     this.ul = ul; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
/* i have used many where the getUid() and getEmail() even in the error and messages to find what the value it is getting on error. */ 
    @Override 
    public String execute() throws Exception { 
     Session session = null; 
     int d; 
     try { 
      session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 
      try { 
       ul = (List<Users>) session.createQuery("from Users c where c.email = '" + getEmail() + "'"); 
       if (!ul.isEmpty()) { 
        d = ul.get(0).getUid(); 
       } else { 
        this.addActionError("Oops. Sorry. You are Not Allowed now. Please Try Again Later." + getEmail() + ","+ ul.get(0).getUid()); 
        session.close(); 
        return ERROR; 
       } 
      } catch (Exception e) { 
       this.addActionError("Oops. There was an error." + getEmail() + ","+ ul.get(0).getUid()); 
       session.close(); 
       return ERROR; 
      } 
      session.getTransaction().commit(); 
     } catch (Exception e) { 
      this.addActionError("Oops. An Error Encountered...! Email address " + getEmail() + ","+ ul.get(0).getUid()+" not registered. Try with your new email address."); 
      session.close(); 
      return ERROR; 
     } 
     this.addActionMessage("Your Uid is : " + ul.get(0).getUid()); 
     return SUCCESS; 
    } 

    @Override 
    public void validate() { 
     if ("".equals(getEmail()) || getEmail() == null) { 
      this.addActionError("Email is Compulsory to input..!" + getCname()); 
     } else if (getEmail().indexOf("@") < 0 || getEmail().indexOf(",") > 0 || getEmail().indexOf(".") < 0 || lastEmailFieldTwoCharsOrMore(getEmail()) == false) { 
      this.addActionError("Please Input a valid email address." + getCname()); 
     } 
    } 
} 

当我删除所有的try catch块我得到的例外是:

java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to java.util.List 

我已经用POJO正确地完成了表和bean的映射。有人可以指出错误吗?我在Struts中使用Hibernate。

+1

请发布有关该异常的完整堆栈跟踪。 – Lion 2012-07-14 04:39:33

+0

抱歉,但事实上,我没有在glassfish服务器日志上收到任何堆栈跟踪错误。然而唯一的例外是在浏览器上看到的。 – codeofnode 2012-07-14 04:43:00

+0

这是因为你用'try ... catch'捕获异常。暂时注释这个'try ... catch',你会得到堆栈跟踪。这只是因为只有在他/她查看堆栈跟踪之后,某人才能更好地猜测异常的确切原因。 – Lion 2012-07-14 04:47:29

回答

2

在你的代码行不正确:

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'" 
); 

createQuery就返回查询对象。如果您想要查询的结果,请使用Query.list()

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'" 
).list(); 
相关问题