刚刚接触SSH,跟着视频做了一个入门范例,效果很简单,就是通过insert.jsp页面插入一条数据到mysql数据库。Spring和Hibernate整合时插入数据没问题,但是一加入Struts,问题就来了。一运行inser.jsp时报错(如下)。
反复检查也没发现问题,求高手解答!
 
开发环境:
Myeclipse6.0
Tomcat5.5
MySQL5.0
j2ee版本:1.4/1.5
Struts1.2
Hibernate3.1
Spring2
 
--------------------------------------------访问insert.jsp页面时的错误------------------------------type Exception report
message  
description The server encountered an internal error () that prevented it from fulfilling this request.
exception  
org.apache.jasper.JasperException: Exception in JSP: /insert.jsp:1714: </head>
15:   
16: <body>
17: <html:form action="/person">
18: 用户名:<html:text property="id"></html:text>
19: 真实姓名:<html:text property="name"></html:text>
20: 密码:<html:text property="password"></html:text>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
root cause  
javax.servlet.ServletException: Cannot find ActionMappings or ActionFormBeans collection
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
org.apache.jsp.insert_jsp._jspService(insert_jsp.java:78)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
root cause  
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:747)
org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:443)
org.apache.jsp.insert_jsp._jspx_meth_html_005fform_005f0(insert_jsp.java:132)
org.apache.jsp.insert_jsp._jspx_meth_html_005fhtml_005f0(insert_jsp.java:106)
org.apache.jsp.insert_jsp._jspService(insert_jsp.java:69)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)--------------------------------------------insert.jsp--------------------------------------------------
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
  <head>
  <html:base />
    
  <title>insert.jsp</title>
  </head>  <body>
  <html:form action="person.do" method="post">
  用户名:<html:text property="id"></html:text>
  真名:<html:text property="name"></html:text>
  密码:<html:text property="password"></html:text>
  <html:submit value="插入"></html:submit>
  <input type="hidden" name="status" value="insert"/>
  </html:form>
  </body>
</html:html>
--------------------------------------------ActionForm(没有作任何验证)------------------------------------------
/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 */
package org.sm.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class PersonForm extends ActionForm {
 private String password;
 private String name;
 private String id;
 public ActionErrors validate(ActionMapping mapping,
  HttpServletRequest request) {
  // TODO Auto-generated method stub
  return null;
 }
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  // TODO Auto-generated method stub
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
}
--------------------------------------------Action------------------------------------------
package org.sm.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.sm.struts.dao.impl.PersonDAOImpl;
import org.sm.struts.form.PersonForm;
import org.sm.struts.vo.Person;
public class PersonAction extends DispatchAction {
 private PersonDAOImpl persondaoimpl;
 public PersonDAOImpl getPersondaoimpl() {
  return persondaoimpl;
 }
 public void setPersondaoimpl(PersonDAOImpl persondaoimpl) {
  this.persondaoimpl = persondaoimpl;
 }
 public ActionForward insert(ActionMapping mapping, ActionForm form,
  HttpServletRequest request, HttpServletResponse response) {
  PersonForm personForm = (PersonForm) form;
  Person p = new Person();
  p.setId(personForm.getId());
  p.setName(personForm.getName());
  p.setPassword(personForm.getPassword());
  try {
  this.persondaoimpl.insert(p);
  } catch (Exception e) {
  e.printStackTrace();
  }
  return null;
 }
}
--------------------------------------------VO--------------------------------------------------
package org.sm.struts.vo;
public class Person implements java.io.Serializable {
 private String id;
 private String name;
 private String password;
 public Person() {
 }
 public Person(String id) {
  this.id = id;
 }
 public Person(String id, String name, String password) {
  this.id = id;
  this.name = name;
  this.password = password;
 }
 public String getId() {
  return this.id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return this.name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPassword() {
  return this.password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}

解决方案 »

  1.   

    --------------------------------------------DAO--------------------------------------------------
    package org.sm.struts.dao;
    import java.util.List;
    import org.sm.struts.vo.Person;
    public interface PersonDAO {
     public void insert(Person person) throws Exception; }
    --------------------------------------------DAOImpl----------------------------------------------
    package org.sm.struts.dao.impl;
    import java.util.List;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.sm.struts.dao.PersonDAO;
    import org.sm.struts.vo.Person;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
     public void insert(Person person) throws Exception {
      Session session=this.getSession();
      session.save(person);
      session.beginTransaction().commit();
     }
     public List queryAll() throws Exception {
      List all=null;
      String hql="from Person p";
      Query q=this.getSession().createQuery(hql);
      all=q.list();
      return all;
     }
    }
    --------------------------------------------web.xml--------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!--红色部分为加入Struts后手动添加的-->  
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      /WEB-INF/classes/applicationContext.xml
      </param-value>
     </context-param>
     <servlet>
      <servlet-name>context</servlet-name>
      <servlet-class>
      org.springframework.web.context.ContextLoaderServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
     </servlet>
      <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
      </init-param>
      <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
      </init-param>
      <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    --------------------------------------------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="personForm" type="org.sm.struts.form.PersonForm" />
      </form-beans>
      <global-exceptions />
      <global-forwards />
      <action-mappings >
      <action
      attribute="personForm"
      input="/insert.jsp"
      name="personForm"
      parameter="status"
      path="/person"
      scope="request"
    <!--红色部分为加入Struts后手动修改-->    type="org.springframework.web.struts.DelegatingActionProxy" />
      </action-mappings>   
    <message-resources parameter="org.sm.struts.ApplicationResources" />
    <!--红色部分为加入Struts后手动添加的一个插件-->  
      <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
      <set-property property="contextConfigLoation" value="WEB-INF/classes/applicationContext.xml" />
      </plug-in>
    </struts-config>
    --------------------------------------------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"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName"
      value="com.mysql.jdbc.Driver">
      </property>
      <property name="url" value="jdbc:mysql://localhost:3306/mldn"></property>
      <property name="username" value="root"></property>
      <property name="password" value="mysqladmin"></property>
     </bean>
     <bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
      <property name="mappingResources">
      <list>
      <value>org/sm/struts/vo/Person.hbm.xml</value></list>
      </property>
      <property name="dataSource">
      <ref bean="dataSource" />
      </property>
      <property name="hibernateProperties">
      <props>
      <prop key="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect
      </prop>
      <prop key="hibernate.show_sql">
      true
      </prop>
      </props>
      </property>
     </bean>
     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
      <property name="sessionFactory">
      <ref bean="sessionFactory"/>
      </property>
     </bean>
     <!--红色部分为加入Struts后手动修改-->
     <bean id="persondaoimpl" class="org.sm.struts.dao.impl.PersonDAOImpl">
      <property name="hibernateTemplate">
      <ref bean="hibernateTemplate"/>
      </property>
     </bean>
      
     <bean name="/person" class="org.sm.struts.action.PersonAction">
      <property name="persondaoimpl">
      <ref bean="persondaoimpl"/>
      </property>
     </bean>
    </beans>
    --------------------------------------------Person.hbm.xml--------------------------------------------------
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!--  
      Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
      <class name="org.sm.struts.vo.Person" table="person">
      <id name="id" type="java.lang.String">
      <column name="id" length="20" />
      <generator class="assigned"></generator>
      </id>
      <property name="name" type="java.lang.String">
      <column name="name" length="20" />
      </property>
      <property name="password" type="java.lang.String">
      <column name="password" length="20" />
      </property>
      </class>
    </hibernate-mapping>
    --------------------------------------------------------------------------------------------------------------
    这些代码贴出来我认为足够了,请高手帮忙看看吧。
    而且我还在想一个问题,既然Struts与Spring整合起来这么麻烦,可不可以让Struts独立于Spring和Hibernate,即只关注于Spring和Hibernate的整合,而让Struts独立于Spring。是否可以这样呢?
      

  2.   

    好像没有监听器启动spring吧,LZ试试在web.xml<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      /WEB-INF/classes/applicationContext.xml
      </param-value>
     </context-param>
    后加上<listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
      

  3.   

    Cannot find ActionMappings or ActionFormBeans collection、
    说明你请求的action没有找到。
    <html:form action="/person">
    但是在struts-config.xml中没有发现对象的action。
      

  4.   

    org.apache.jasper.JasperException: Exception in JSP: /insert.jsp:17
    14: </head>
    15:   
    16: <body>
    17: <html:form action="/person">
    18: 用户名:<html:text property="id"></html:text>
    19: 真实姓名:<html:text property="name"></html:text>
    20: 密码:<html:text property="password"></html:text>很明显,你的请求服务器找不到对应的处理器来处理嘛!
    改<html:form action="/person.do">
    改<action
      attribute="personForm"
      input="/insert.jsp"
      name="personForm"
      parameter="status"
      path="/person.do"  scope="request">  
    改  <bean name="/person.do" class="org.sm.struts.action.PersonAction">
      <property name="persondaoimpl">
      <ref bean="persondaoimpl"/>
      </property>
     </bean>
      

  5.   

    试了下:
    2楼的方法,加上监听器后找不到jsp页面。
    4楼的方法,修改后问题依旧。如果我在Spring和Hibernate整合后加上Struts,不让Struts整合Spring,同样的jsp页面、ActionForm和Action,就是无法显示。但是如果另建一个项目,把同样的jsp页面、ActionForm和Action加进来,就可以正常显示和操作。有点崩溃今天下午用另外一种SSH整合方法又做了一遍,开始报同样的错误,但是服务器重启了几次又好了,我无语……为什么??!!
      

  6.   

    又看了一个Myeclipse6.0整合ssh的教程,结合之前的视频重新做了若干遍,用了N个小时,终于出来了。貌似Spring在整合Hibernate的时候要下载一个common-pool的jar包导入到项目的lib目录中。但是以前看的视频就没有导包的步骤。虽然这一步似乎和Struts没什么关系所以我认为,自己在学习的时候,开发环境最好和视频或者教程一致,否则因为版本的关系会出现很多不必要的麻烦!谢谢大家!!