请大家帮忙看看这个用struts和hibernate做的登录程序的问题。谢谢
这几天刚学struts和hibernate,做了一个登录的程序,但是程序确一直出错,请大家帮忙看看。在myeclipse中做的hibernate的东西是经过配置自动生成的。程序我使用断点跟踪了,发现了程序执行出错误的地方,但是不知道怎么修改。请大家看看。错误出现在以下这个文件中,当执行到Iterator it = query.iterate();
这句代码时,就不执行后面的代码,而是直接跳出try执行
catch (Exception e) {
System.out.println(e.getMessage());
}
这句代码。前面的
String userName=loginForm.getName();
String userPwd=loginForm.getPassword();
都能正确的取得数据
请问这是什么原因呢?要怎么修改呢?谢谢
//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_4.1.1/xslt/JavaClass.xsl
package com.mystruts.struts.action;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibarenate.SessionFactory;
import com.hibarenate.Users;
import com.mystruts.struts.form.LoginForm;
/**
* MyEclipse Struts
* Creation date: 06-06-2007
*
* XDoclet definition:
* @struts.action path= "/login " name= "loginForm " input= "/login.jsp " scope= "request " validate= "true "
* @struts.action-forward name= "success " path= "/success.jsp "
* @struts.action-forward name= "failure " path= "/login.jsp "
*/
public class LoginAction extends Action {
// --------------------- Instance Variables
// --------------------- Methods
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
//获取提交的用户名称和密码
String userName=loginForm.getName();
String userPwd=loginForm.getPassword();
String mUserPwd=null;
Users ul=null;
//创建连接
Session session=SessionFactory.currentSession();
//创建事务
Transaction tx=session.beginTransaction();
//创建对话
Query query=session.createQuery( "select u from Users as u where name= ' " +
userName + " ' ");
try{
Iterator it = query.iterate();
ul = (Users) it.next();
mUserPwd=ul.getPassword();
}catch (Exception e) {
System.out.println(e.getMessage());
}
//事务提交
tx.commit();
//关闭连接
SessionFactory.closeSession();
if(userPwd.equals(mUserPwd))
return (mapping.findForward( "success "));
else
return (mapping.findForward( "failure "));
}
}
[解决办法]
//创建对话
Query query=session.createQuery( "select u from Users as u where name= ' " +
userName + " ' ");
try{
Iterator it = query.iterate();//////////随便看一下,这里应该有问题,事务还没提交,还不是选代出他的值,
/////移到session.commit()下面
//Iterator it = query.list().iterator()
ul = (Users) it.next();
mUserPwd=ul.getPassword();
}catch (Exception e) {
System.out.println(e.getMessage());
}
//事务提交
tx.commit();
[解决办法]
ul = (Users) it.next();这句话写得不是很好,你这根本就没有遍历迭代器,怎么会有对
象?
while(it.hasNext()){
ul = (Users) it.next();
}
你试试,应该可以的。
还有一点小建议,你为什么不建一个id字段,象你这样查不是很好。
我也正在学hibernate,看得起的话一起交流。410406239。
[解决办法]
看下我的代码吧和你的有些出入但原理是一样的,注释比较少,望谅(从一个项目中直接拿过来的稍微做了下修改)
LOGINACTION类
public class LoginAction extends Action {
private NetCTOSSBizImpl ncbi=new NetCTOSSBizImpl();
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
LoginForm loginform=(LoginForm)form;
User user=ncbi.login(loginform.getLoginName(),loginform.getPassword());
if(user!=null){
request.setAttribute( "user ", user);
return mapping.findForward( "success ");
}
return mapping.findForward( "fail ");
}
}
NetCTOSSDAOImpl类
public class NetCTOSSDAOImpl implements NetCTOSSDAO {
private static SessionFactory sf;
static {
sf = new Configuration().configure().buildSessionFactory();
}
public User login(String loginName, String password) {
// TODO Auto-generated method stub
User u=selectByName(loginName);
/**
* 从数据库中判断并读取用户信息
*/
if(u!=null&&(u.getPassword().equals(password))){
return u;
}else{
return null;
}
}
private User selectByName(String loginName) {
Session s=sf.openSession();
List l=null;
User u=null;
try {
Transaction t=s.beginTransaction();
Query q=s.createQuery( "from User u where u.loginName=:loginName ");
q.setString( "loginName ", loginName);
l=q.list();
Iterator it=l.iterator();
while(it.hasNext()){
u=(User)it.next();
if(u.getLoginName().equals(loginName)){
return u;
}
}
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
}finally{
s.close();
}
return null;
}