这是登陆页面的form表单
    <form name="userForm" method="post" action="logon.do?action=logon">
    <table width="432" height="236" border="0" cellpadding="0" cellspacing="0" background="images/login.gif">
        <tr align="center">
          <td height="128" colspan="2" >&nbsp;</td>
        </tr>
    
        <tr>
          <td width="170" height="31" align="center" >用户名:</td>
          <td width="230" height="31" >
            <input name="username" type="text" class="input">        </td>
        </tr>
        <tr>
          <td width="170" height="29" align="center">密&nbsp;&nbsp;码:</td>
          <td width="230" height="29" ><input name="password" type="password" class="input" ></td>
        </tr>
        <tr>
          <td height="70" colspan="2" align="center" ><input type="submit" name="Submit" value="登陆" class="button">
          &nbsp;
            <input type="reset" name="Submit2" value="重置"class="button"></td>
          </tr>
    
    </table>
    </form>
这是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>
  <form-beans>
      <form-bean name="userForm" type="com.ems.actionForm.UsersForm" />
  </form-beans>  <global-forwards>
    <forward name="error" path="/error.jsp" />
  </global-forwards>
  
  <action-mappings>
<!-- UsersAction -->
    <action path="/logon" type="com.ems.action.UsersAction" name="userForm" scope="request">
      <forward name="success" path="/manage.jsp" />
      <forward name="failed" path="/failed.jsp" />
    </action>
  </action-mappings>
</struts-config>这是actionFormpackage com.ems.actionForm;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;import com.ems.model.Users;
import com.ems.util.DateUtil;
public class UsersForm extends ActionForm {
   
    private Long id;    private String username;    private String password;    private Byte sex;    private String birthday;    private String createtime;    private Byte isadmin;    private String content;
    
     public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Byte getSex() {
return sex;
} public void setSex(Byte sex) {
this.sex = sex;
} public Byte getIsadmin() {
return isadmin;
} public void setIsadmin(Byte isadmin) {
this.isadmin = isadmin;
} public String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} public String getCreatetime() {
return createtime;
} public void setCreatetime(String createtime) {
this.createtime = createtime;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public void reset(ActionMapping arg0, HttpServletRequest arg1) {
        this.id=null;
        this.username=null;
        this.password=null;
        this.isadmin=null;
        this.createtime=null;
        this.content=null;
        this.sex=null;
        this.birthday=null;
        
    }    public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) {
        return null;
    }
    
    public String toString() {
        StringBuffer toStr = new StringBuffer();
        toStr.append("[UsersForm] = [\n");
        toStr.append("    id = " + this.id + ";\n");
        toStr.append("    username = " + this.username + ";\n");
        toStr.append("    password = " + this.password + ";\n");
        toStr.append("    sex = " + this.sex + ";\n");
        toStr.append("    birthday = " + this.birthday+ ";\n");
        toStr.append("    createtime = " + this.createtime+ ";\n");
        toStr.append("    isadmin = " + this.isadmin+ ";\n");
        toStr.append("    content = " + this.content + ";\n");
        toStr.append("    ];\n");
        return toStr.toString();
    }    
    public Users populate(){
        Users u=new Users();
        u.setId(getId());
        u.setIsadmin(getIsadmin());
        u.setContent(getContent());
        u.setUsername(getUsername());
        u.setPassword(getPassword());
        u.setSex(getSex());
        u.setBirthday(DateUtil.parseToDate(getBirthday(),DateUtil.yyyyMMdd));
        u.setCreatetime(DateUtil.parseToDate(getCreatetime(),DateUtil.yyyyMMddHHmmss));
        return u;
    }
}这是actionpackage com.ems.action;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.HibernateException;import com.ems.actionForm.UsersForm;
import com.ems.model.Users;
import com.ems.service.UsersDao;
public class UsersAction extends Action {    private UsersDao usersDao;
     public UsersDao getUsersDao() {
return usersDao;
}
public void setUsersDao(UsersDao usersDao) {
this.usersDao = usersDao;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        String action =request.getParameter("action");
        System.out.println("\nUsersAction*********************action="+action);
        if(action==null||"".equals(action)){
            return mapping.findForward("error");
        }else if("listuser".equals(action)){
            return listUser(mapping,form,request,response);
        }else if("adduser".equals(action)){
            return addUsers(mapping,form,request,response);
        }else if("logon".equals(action)){
            return logon(mapping,form,request,response);
        }else if("updateuser".equals(action)){
            return updateUser(mapping,form,request,response);
        }else if("deleteuser".equals(action)){
            return deleteUser(mapping,form,request,response);
        }else if("selectuser".equals(action)){
            return selectUser(mapping,form,request,response);
        }
        return mapping.findForward("error");
    }
    private ActionForward logon(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws HibernateException {
     UsersForm usersform=(UsersForm)form;
        Users users=new Users();
        users.setUsername(usersform.getUsername());
        users.setPassword(usersform.getPassword());
        boolean flag=usersDao.logonUsers(users);
        if(flag){
            request.getSession().setAttribute("users",users);
            return mapping.findForward("success");
        }else{
            return mapping.findForward("failed");
       }
    }
}这是DAO文件package com.ems.service;import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.ems.model.Users;public class UsersDao extends HibernateDaoSupport{
    public boolean logonUsers(Users users){
     List list = this.getHibernateTemplate().find("from Users au where au.username = ? and au.password = ?"
     ,new String[]{users.getUsername(),users.getPassword()});
     if(list != null && list.size() >= 1){
     return true;
     }else{
     return false;
     }
  
}
这是spring文件,由于字数限制我只发有用的部分

<!-- Spring支持Hibernate框架的配置,得到SessionFactory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLInnoDBDialect</prop>
<!-- 是否根据需要每次自动创建数据库 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<prop key="hibernate.show_sql">true</prop>
<!-- 将SQL脚本进行格式化后再输出 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ems/model/Users.hbm.xml</value>
</list>
</property>
</bean>

<bean id="transactionManager" class=
"org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 配置事务切面Bean,指定事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 用于配置详细的事务语义 -->
<tx:attributes>
<!-- 所有以'get'开头的方法是read-only的 -->
<tx:method name="get*" read-only="true"/>
<!-- 其他方法使用默认的事务设置 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="leePointcut"
expression="execution(* com.ems.action.*Action.*(..))"/>
<!-- 指定在leePointcut切入点应用txAdvice事务切面 -->
<aop:advisor advice-ref="txAdvice" 
pointcut-ref="leePointcut"/>
</aop:config> <bean id="usersDao" class="com.ems.service.UsersDao">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
</beans>

解决方案 »

  1.   

    不好意思哈,刚去吃饭了,这是异常信息
    严重: Servlet.service() for servlet action threw exception
    java.lang.NullPointerException
    at com.ems.action.UsersAction.logon(UsersAction.java:91)
    at com.ems.action.UsersAction.execute(UsersAction.java:49)
    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.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:127)
    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:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)
      

  2.   

     private ActionForward logon(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws HibernateException {
         UsersForm usersform=(UsersForm)form;
            Users users=new Users();
            users.setUsername(usersform.getUsername());
            users.setPassword(usersform.getPassword());
        boolean flag=usersDao.logonUsers(users);这是异常at com.ems.action.UsersAction.logon(UsersAction.java:91)]
            if(flag){
                request.getSession().setAttribute("users",users);
                return mapping.findForward("success");
            }else{
                return mapping.findForward("failed");
           }
        } public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) throws Exception {
            
            String action =request.getParameter("action");
            System.out.println("\nUsersAction*********************action="+action);
            if(action==null||"".equals(action)){
                return mapping.findForward("error");
            }else if("listuser".equals(action)){
                return listUser(mapping,form,request,response);
            }else if("adduser".equals(action)){
                return addUsers(mapping,form,request,response);
            }else if("logon".equals(action)){
                return logon(mapping,form,request,response);这是异常com.ems.action.UsersAction.execute(UsersAction.java:49)
            }else if("updateuser".equals(action)){
                return updateUser(mapping,form,request,response);
            }else if("deleteuser".equals(action)){
                return deleteUser(mapping,form,request,response);
            }else if("selectuser".equals(action)){
                return selectUser(mapping,form,request,response);
            }
            return mapping.findForward("error");
        }
      

  3.   

    我用System.out.println测试这两个地方都没问题,我怀疑是不是DAO里面的getHibernateTemplate()出问题了,求高手解决下!
      

  4.   

    通过 UserDao userDao = new UserDao()可以吗?
      

  5.   

    不行,,,你用 spring 的话就不能用 new ,否则是不会注入的~~~
      

  6.   

    那我该怎么实例化呢?我通过System.out测试确定usersDao=null
      

  7.   

    不好意思,不能用new否则还要手动实例化sessionFactory在spring里面配置吧
      

  8.   

    你的 action 在哪里配的?
      

  9.   

    由于你需要把 DAo 注入 action,所以你的 action 也必须在 spring 配置,而不是直接用 strtus 配置。
      

  10.   

    applicationContext.xml里面一定要配置action吗
      

  11.   

    是的,不过具体的配置我忘了,现在我很少用 spring strtus。
      

  12.   

    我这样配置了,但还是不行,userDao还是为空
    <bean id="logon" class="com.ems.action.UsersAction" scope="prototype">
    <property name="usersDao">
    <ref bean="usersDao"/>
    </property>
    </bean>
      

  13.   

    能教教我该如何在spring里面配置吗?谢谢了
      

  14.   

    你在 struts-config.xml 配置中 action 因该指向 logon 而不是直接写上类名
      

  15.   

    我是struts-config.xml中用的是path="/logon",你能教我如何指向logon吗?,刚学不太懂!
      

  16.   

    用了struts了,为何jsp还要用普通的html标签而不用struts自带标签?
      

  17.   


        <!-- UsersAction -->
        <action path="/logon" type="XXXXXXX" name="userForm" scope="request">
          <forward name="success" path="/manage.jsp" />
          <forward name="failed" path="/failed.jsp" />
        </action><bean name="XXXXXXX" class="com.ems.action.UsersAction" scope="prototype">
    <property name="usersDao">
    <ref bean="usersDao"/>
    </property>
    </bean>
    type="XXXXXXX" 的值与 name="XXXXXXX" 的值对应,试试行不行。
      

  18.   

    这就纳闷了,这怎么对应啊
    我的type="com.ems.action.logon" 而 bean name="logon" 难道要我把type改成“logon"?
      

  19.   

    不好意思上面写错了,我的type="com.ems.action.UsersAction"
      

  20.   

    不行
    HTTP Status 500 - No action instance for path /logon could be created
      

  21.   

    好像要给 strtus 配上 spring 的插件,使 strtus 会使用 spring 创建对象,百度一下吧
      

  22.   

    最近刚学了spring和struts整合,根本问题是userDao没有注入,struts中的那个userDao用spring注入,不知道你的spring配置文件中配了没有,相对来说用spring的annotation注入更简单,配置也很容易,只提思路:加spring annotation的jar包,在spring配置文件中加支持注解,auto—driven之类的,具体百度,或者直接查spring文档,在UserDao类上加这句话@Component("userDao"),在action的setUserDao方法上加这个@Resourse(“userDao”)  此时已经注入了,希望对你有帮助,祝你好运!
      

  23.   

    33楼说得很详细,就是这个问题,你在UserAction类里写了userDao的set和get方法,但是userDao没有初始化,并且没有把userDao注入给UserAction
      

  24.   

    package com.ems.service;import java.util.List;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    import com.ems.model.Users;public class UsersDao extends HibernateDaoSupport{
        public boolean logonUsers(Users users){
            List list = this.getHibernateTemplate().find("from Users au where au.username = ? and au.password = ?"
                    ,new String[]{users.getUsername(),users.getPassword()});
            if(list != null && list.size() >= 1){
                return true;
            }else{
                return false;
            }
      
    }