这个是用struts+hibernate+spring整合做的登录,小弟纠结了
不多说,直接上正菜
数据访问接口public interface TbUserDao {
public boolean getUser(TbUser user);
}
数据接口实现
public class TbUserDaoImpl extends HibernateDaoSupport implements TbUserDao{
public boolean getUser(TbUser user) {
Session session=super.getSession();
String hql="from TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?";
Query query=session.createQuery(hql);
query.setString(0, user.getUserName());
query.setString(1, user.getUserPassword());
int row=query.executeUpdate();
if (row>0) {
return true;
}else {
return false;
}
}}
再分别把业务逻辑接口和业务实现类展示
public interface TbUserBiz {
public boolean getUser(TbUser user);
}
public class TbUserBizImpl implements TbUserBiz{
private TbUserDao tbUserDao;
public void setTbUserDao(TbUserDao tbUserDao) {
this.tbUserDao = tbUserDao;
} public boolean getUser(TbUser user) {
// TODO Auto-generated method stub
return tbUserDao.getUser(user);
}
}
好了,最后上主菜action
public class TbUserAction extends DispatchAction{
String returnUrlWord="default";
private TbUserBiz tbUserBiz;
public void setTbUserBiz(TbUserBiz tbUserBiz) {
this.tbUserBiz = tbUserBiz;
}
public ActionForward Login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaActionForm dform=(DynaActionForm) form;
TbUser tbUser=(TbUser) dform.get("tbUser");
boolean row=tbUserBiz.getUser(tbUser);
if (row) {
returnUrlWord="index";
}
return mapping.findForward(returnUrlWord);
}
}基本情况就这样了,配置文件没有问题
现在出现的问题是报异常,始终抱的都是HQL语句异常,情况如下所示:
严重: Servlet.service() for servlet action threw exception
org.hibernate.hql.QueryExecutionRequestException: Not supported for select queries [from com.just.doing.entity.TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?]
at org.hibernate.hql.ast.QueryTranslatorImpl.errorIfSelect(QueryTranslatorImpl.java:278)
at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:395)
at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259)
at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141)
at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94)
at com.just.doing.dao.impl.TbUserDaoImpl.getUser(TbUserDaoImpl.java:18)
at com.just.doing.biz.impl.TbUserBizImpl.getUser(TbUserBizImpl.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy2.getUser(Unknown Source)
at com.just.doing.action.TbUserAction.Login(TbUserAction.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)OK,小弟真心讨教,我这是怎么回事啊??以前没学SSH的时候做个登录都没这么复杂,怎么现在就变的如此纠结了啊??是学傻了??
请路过的大侠指教!!!!!如果有好的登录范例,请贴出,让我等小辈观摩学习之用。。或者发送到   小弟不胜感激!!!

解决方案 »

  1.   

    为方便大侠细致了解,小弟思量再三之后还是决定将配置文件贴出,忘大侠来校正
    struts-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"><struts-config>
      <data-sources />
      <form-beans >
       <form-bean name="cityAction" type="org.apache.struts.action.DynaActionForm">
       <form-property name="tbUser" type="com.just.doing.entity.TbUser" />
       </form-bean>
      </form-beans>
      <global-exceptions />
      <global-forwards />
      <action-mappings>
       <action path="/tbUser" name="cityAction" parameter="operate" type="org.springframework.web.struts.DelegatingActionProxy">
       <forward name="index" path="success.jsp" />
       <forward name="default" path="default.jsp" />
       </action>
      </action-mappings>
      <message-resources parameter="com.just.doing.struts.ApplicationResources" />
    </struts-config>好像在做查询的时候不用交给spring管理吧?
    applicationContext.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation"
    value="classpath:hibernate.cfg.xml">
    </property>
    </bean>
    <!-- 建立事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- 建立事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="del*" propagation="REQUIRED"/>
    <tx:method name="*" propagation="SUPPORTS"/>
    </tx:attributes>
    </tx:advice>
    <!-- 为事务通知创建切面 -->
    <aop:config>
    <aop:pointcut expression="execution(* com.just.doing.biz.impl.*Impl.*(..))" id="Method"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="Method"/>
    </aop:config>



    <!-- 定义dao对象 -->
    <bean id="tbUserDao" class="com.just.doing.dao.impl.TbUserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 定义biz对象 -->
    <bean id="tbUserBiz" class="com.just.doing.biz.impl.TbUserBizImpl">
    <property name="tbUserDao" ref="tbUserDao" />
    </bean>

    <!-- 定义action对象 -->
    <bean name="/tbUser" class="com.just.doing.action.TbUserAction">
    <property name="tbUserBiz" ref="tbUserBiz" />
    </bean>
    </beans>再次感谢
      

  2.   

    int row=query.executeUpdate();
    这是更新操作,换个查询方法吧
      

  3.   

    这里好像是那个?号的问题,错误信息是说不支持你写的SQL语句.尝试下吧?用变量拼接HQL语句试试
      

  4.   

    HQL 是面向对象的语言 它里面的字段 不是数据库里面的字段 而是你的类名 你看看是不是你的字段写错了啊 写成数据库的啊 个人建议 希望有帮助 
      

  5.   

    3楼正解,
    你的那段查询判断代码应该改成:public boolean getUser(TbUser user) {
            Session session=super.getSession();
            String hql="from TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?";
            Query query=session.createQuery(hql);
            query.setString(0, user.getUserName());
            query.setString(1, user.getUserPassword());
            list list=query.list();
            if (list.size>0) {
                return true;
            }else {
                return false;
            }
        }
      

  6.   

    嗯,还是HQL 查询语句有问题!楼主还可以用Hibernate 自己封装的方法呀。
      

  7.   

    query.setString(1, user.getUserName());
    query.setString(2, user.getUserPassword());
    改成红色的,不知道可行否。
      

  8.   

    把from com.just.doing.entity.TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?
    改成from TbUser as tu where tu.userName=? and tu.userPassword=?
      

  9.   

    你太痛苦了嘛。     我觉得你有点盲目地干事情。================================
    public class TbUserDaoImpl extends HibernateDaoSupport implements TbUserDao{
        public boolean getUser(TbUser user) {
            Session session=super.getSession();
    这里没有必要去拿session.  你应经继承了hibernateDaoSupport.  直接拿spring提供的模板就OK乐。CRUD 操作很简单的。
      

  10.   

    from TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?
    改成
    from TbUser tbUser where tbUser.userName=:userName and tbUser.userPassword=:userPassword;
    试试。
      

  11.   

    多谢三楼和六楼,按照这个方法问题已经解决,但心中有一疑问
    List list=query.list();
    此代码什么意思呢??
      

  12.   

    [code=Java]public boolean getUser(TbUser user) {
            Session session=super.getSession();
            String hql="from TbUser tbUser where tbUser.userName=? and tbUser.userPassword=?";
            Query query=session.createQuery(hql);
            query.setString(0, user.getUserName());
            query.setString(1, user.getUserPassword());
            list list=query.list();
            if (list.size>0) {
                return true;
            }else {
                return false;
            }
        }[code]
      

  13.   

    SSH= =
    数据库查询用getHibernateTemplate()好了
      

  14.   

    HQL语句错误,不是些sql语句,直接使用getHibernateTemplate().find(HQL,new Object[] {param,param});
      

  15.   

    兄弟,你那错误说的是调用的方法不支持查询
    查询用getHibernateTemplate()这个方法,
    还有查询出来的结果不是int型的?executeUpdate()这方法不是用来查询的
      

  16.   

    HQL查询范例
    //条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数   
            String hql = "from Users where name=? and passwd=?";   
            Query query = session.createQuery(hql);   
            //第1种方式   
    //      query.setString(0, "name1");   
    //      query.setString(1, "password1");   
            //第2种方式   
            query.setParameter(0, "name1",Hibernate.STRING);   
            query.setParameter(1, "password1",Hibernate.STRING);   
            List<Users> list = query.list();   
            for(Users users : list){   
                System.out.println(users.getId());   
            }   
      

  17.   

    使用spring的模板.
    List list =getHibernateTemplate().find(hql);
    if(list!=null){
         return; 
    }else{
         false;
    }
      

  18.   

    哇哈哈
    受教颇多啊。。那请问不用上面的方法
    像楼上说的那样只用hibernate封装的方法如load/get怎么做登录呢??
      

  19.   

    多谢三楼和六楼,按照这个方法问题已经解决,但心中有一疑问
    List list=query.list();
    此代码什么意思呢??
    类型转换而已,如果你不加在前面就要加上(List),
    还有,你的spring-config.xml文件好像没有映射
    <property name="mappingResources">
    <list><value>com/Northwind/pojo/Products.hbm.xml</value></list>
    </property>