出错可能是你的datasource不可用,不知道driver是不是在classpath里?
dtd是用来定义xml文件中的标记的,tld是用来定义jsp是用到的标记库的
formbean是用来传递和处理表单中的数据的,通常一个表单都会有一个formbean与之对应,
通过request请求把前台的表单数据传递到服务器端处理。我也只是简单了解过struts,没有什么实际经验,希望能帮上点忙

解决方案 »

  1.   

    应该是你的dataSource配置出了问题,但你没贴出servlet代码
    dtd是xml文档类型定义文件
    tld是struts定义的jsp标签库
    formbean同意楼上的,formbean可以认为它是jsp页面信息的一个封装类
      

  2.   

    很感谢楼上的帮助,我也在自己找答案。目前已经将如下jar文件全部加入classpath中,但问题依旧:
    .\lib\mm.mysql-2.0.14-bin.jar;
    .\lib\struts.jar;
    .\lib\commons-dbcp-1.1.jar;
    .\lib\commons-pool-1.1.jar;
    .\lib\commons-validator.jar;
    .\lib\commons-logging.jar;
    .\lib\commons-fileupload.jar;
    .\lib\commons-digester.jar;
    .\lib\commons-collections.jar;
    .\lib\commons-beanutils.jar;
    出错信息仍然为
    javax.servlet.UnavailableException: Initializing application data source org.apache.struts.action.DATA_SOURCE
            at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:822)
            at org.apache.struts.action.ActionServlet.init(ActionServlet.java:371)
            at javax.servlet.GenericServlet.init(GenericServlet.java:258)
            at weblogic.servlet.internal.ServletStubImpl.createServlet(ServletStubImpl.java:698)
            at weblogic.servlet.internal.ServletStubImpl.createInstances(ServletStubImpl.java:641)
            at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:586)
            at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:366)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:240)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200)
            at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2390)
            at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:1959)
            at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
            at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
      

  3.   

    servlet代码如下:import java.io.File;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import javax.sql.DataSource;import org.apache.struts.Globals;
    import org.apache.struts.action.ActionServlet;/**
     * @author chentingjia
     *
     */
    public class CarActionServlet extends ActionServlet {    private Connection conn; //数据库连接    /**
         * 得到数据库连接
         * @return
         * @throws Exception
         */
        private Connection getConnection() throws Exception {
            return getConnectionMysql();
        }    /**
         * 从JNDI得到数据库连接
         * @return
         * @throws NamingException
         * @throws Exception
         * @throws SQLException
         */
        private Connection getConnectionJNDI()
            throws NamingException, Exception, SQLException {
            Context initCtx = new InitialContext();
            Context ctx = (Context) initCtx.lookup("java:comp/env");
            if (ctx == null)
                throw new Exception("Car - No Context");
            DataSource ds = (DataSource) ctx.lookup("jdbc/EcarDB");
            if (ds == null)
                throw new Exception("Car - No DataSource");
            return ds.getConnection();
        }    /**
         * 得到与Mysql的数据库连接
         * @return
         * @throws InstantiationException
         * @throws IllegalAccessException
         * @throws ClassNotFoundException
         * @throws SQLException
         */
        private Connection getConnectionMysql()
            throws
            InstantiationException,
            IllegalAccessException,
            ClassNotFoundException,
                SQLException {
            Class.forName("org.gjt.mm.mysql.Driver").newInstance();
            String url =
                "jdbc:mysql://localhost:3306/ecar?useUnicode=true&characterEncoding=GB2312";
            String user = "root";
            String password = "";
            return DriverManager.getConnection(url, user, password);
        }    /**
         * 使用Struts的方法得到数据库连接
         * @return
         * @throws SQLException
         * @deprecated
         */
        private Connection getConnectionStruts() throws SQLException {
            try {
                DataSource dataSource =
                    (DataSource) this.getServletContext().getAttribute(
                        Globals.DATA_SOURCE_KEY);
                return dataSource.getConnection();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }    /**
         * 调用对应的Action
         */
        protected void process(
            HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {
            //设置客户端请求字符集为中文简体
            request.setCharacterEncoding("GB2312");
            //设置服务端响应字符集为中文简体
            response.setContentType("text/html;charset=gb2312");        //得到当前会话
            HttpSession session = request.getSession();        try {
                //设置文件上传路径
                setUploadPath(session);
                //设置论坛路径
                setBbsPath(session);
                //得到数据库连接并保存在会话中
                //conn = getConnection();
                //session.setAttribute(SysConstant.SESSION_CONNECTION, conn);
                //处理请求操作
                super.process(request, response);
            } catch (Exception e) {
                e.printStackTrace();
                response.getWriter().println(e.getMessage());
            } finally {
                //从会话中删除数据库连接
                try {
                    conn =
                        (Connection) session.getAttribute(
                            SysConstant.SESSION_CONNECTION);
                    if (conn != null) {
                        conn.close();
                        session.removeAttribute(SysConstant.SESSION_CONNECTION);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }    /**
         * 设置论坛路径
         * @param session
         */
        private void setBbsPath(HttpSession session) {
            session.setAttribute(
                SysConstant.SESSION_BBS_PATH,
                this.getInitParameter("bbsPath"));
        }    /**
         * 设置文件上传路径
         * @param session
         */
        private void setUploadPath(HttpSession session) {
            //得到文件上传路径(路径是一个真实的绝对路径)
            session.setAttribute(
                SysConstant.SESSION_UPLOAD_PATH,
                this.getServletContext().getRealPath(
                    this.getInitParameter("uploadPath") + File.separator));
        }
    }
      

  4.   

    我也不知道你什么地方设置错了。
    你可以看看我的Struts-config。xml文件里的DataSource配置:<data-source>
    <set-property value="false" property="autoCommit"/>
    <set-property value="Datasource for debug helper" property="description"/>
    <set-property value="org.gjt.mm.mysql.Driver" property="driverClass"/>
    <set-property value="4" property="maxCount"/>
    <set-property value="2" property="minCount"/>
    <set-property value="root" property="user"/>
    <set-property value="" property="password"/>
    <set-property value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=GB2312" property="url"/>
    </data-source>
    既然你是在调用
    ^@^
      

  5.   

    我也不知道你什么地方设置错了。
    你可以看看我的Struts-config。xml文件里的DataSource配置: <data-source>
    <set-property value="false" property="autoCommit"/>
    <set-property value="Datasource for debug helper" property="description"/>
    <set-property value="org.gjt.mm.mysql.Driver" property="driverClass"/>
    <set-property value="4" property="maxCount"/>
    <set-property value="2" property="minCount"/>
    <set-property value="root" property="user"/>
    <set-property value="" property="password"/>
    <set-property value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=GB2312" property="url"/>
    </data-source>
    既然你是在调用
    index。html时,出现异常,那说明你的Struts没有配置成功,你可以不用去找你其他类的麻烦。^@^
      

  6.   

    看了你的ServletAction,似乎觉得没有必要,
    你只需
    在你的Action里的execute/perform方法里执行:
    DataSource ds = this.getDataSource(request);就能得到数据源了,似乎不用你那么麻烦。
    不知道你上面那么写是因为什么?^@^
      

  7.   

    谢谢楼上的。
    该servlet并不是我写的,只是要由我来维护,由于以前没有接触过struts架构的java模式,所以被struts相关的一些文件搞得头晕不止。
    Leemaasn(我给大家拜早年啦!新春快乐!!!) ,你的意思是说在Action类里可以写execute方法和perform么?
      

  8.   

    你的错误的问题是:当初始化ActionServlet的时候就已经出现了错误,错误的原因有两种可能,一种是:实例化dbcp数据源时出现的错误,可能是没有找到那个类;另一种可能是你的配置文件中的参数名不是dbcp 数据源对象的属性(就是说配置文件有url参数,但dbcp数据源的那个class却没有setUrl方法)。配置文件中的参数是对应于datasource 的path的,即org.apache.commons.dbcp.BasicDataSource,如果org.apache.commons.dbcp.BasicDataSource没有getUrl/setUrl方法,那么就肯定会出错了。
      

  9.   

    谢谢楼上的解释,我也把错误源锁定在由type=org.apache.commons.dbcp.BasicDataSource
    上,我不知道原作者指定datasource的这个属性的目的,但既然这里出错,我刚才直接删除了type=org.apache.commons.dbcp.BasicDataSource,<data-sources>
    <data-source>
    <set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
    <set-property property="url" value="jdbc:mysql://localhost:3306/ecar?useUnicode=true&amp;characterEncoding=gb2312" />
    <set-property property="username" value="ecar" />
    <set-property property="password" value="ecar" />
    <set-property property="maxActive" value="10" />
    <set-property property="maxWait" value="5000" />
    </data-source>
     </data-sources>可是运行结果还是:
    javax.servlet.UnavailableException: Initializing application data source org.apache.struts.action.DATA_SOURCE
            at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:822)
            at org.apache.struts.action.ActionServlet.init(ActionServlet.java:371)
            at javax.servlet.GenericServlet.init(GenericServlet.java:258)
            at weblogic.servlet.internal.ServletStubImpl.createServlet(ServletStubImpl.java:698)
            at weblogic.servlet.internal.ServletStubImpl.createInstances(ServletStubImpl.java:641)
            at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:586)
            at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:366)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:240)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200)
            at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2390)
            at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:1959)
            at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:137)
            at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
    >%$--@#&*......受不了了,到底哪里出问题了,都1天多了还是不行
      

  10.   

    至于说,在没有删除datasource的type属性之前,我已经从jakata网站找到了这个jar包并放到了classpath下,也就是说org.apache.commons.dbcp.BasicDataSource是有的,并且我查看了org.apache.commons.dbcp.BasicDataSource的方法,是存在getUrl()和setUrl()方法的,但是错误依旧
      

  11.   

    你把struts的ActionServlet的整个initModuleDataSources方法拷贝到你的扩展的ActionServlet中(要下struts的源码哦),然后在其中的} catch (Exception e) {后面加上打印信息:e.printStackTrace();,看看这个打印信息的输出结果就知道是什么问题了。
      

  12.   

    再次感谢楼上的(神秘)
    问题终于找到了!!!!!!!!!!!!!!!!!!!!
    神秘,你的想法是好的,可是不大实际,我试过了,如果拷贝源代码到我这里扩展的servlet中,有许多的关联变量和类找不到,不能编译,如果再去考其它相关的就太麻烦了。
    错误原因:(在唉声叹气中无意发现)
    <data-sources>
    <data-source>
    <set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
    <set-property property="url" value="jdbc:mysql://localhost:3306/ecar?useUnicode=true&amp;characterEncoding=gb2312" />
    <set-property property="username" value="ecar" />
    <set-property property="password" value="ecar" />
    <set-property property="maxActive" value="10" />
    <set-property property="maxWait" value="5000" />
    </data-source>
     </data-sources>请注意:这里的data-source的xml格式--原作者在这里的data-source是嵌套的
    <data-sources>
    <data-source>
                       。。
                      </data-source>
    </data-sources>
    这个语法似乎有问题,而各位DX也都没有注意到这个细节,当然可能这样的语法和作者原来
    的type=org.apache.commons.dbcp.BasicDataSource有关,不过我到现在为止还不知道这个type有什么用
    现在去掉嵌套的data-source,顺利进入servlet
    谢谢大家,稍后结贴^_^
      

  13.   

    你既然在配置文件中配置了数据库,你可以在action里直接使用
    DataSource ds = getDateSource(request);//默认的数据库配置
    不用自己写java类。
    当然要注意检查你的:
    1,驱动程序,是否争取,看你的驱动程序版本
    2,放到你的lib包
      

  14.   

    我来帮你:import org.apache.struts.action.Action;public class BaseAction extends Action{ public ActionForward perform(ActionMapping mapping,
                                     ActionForm form,
                                     HttpServletRequest request,
                                     HttpServletResponse response) throws
            IOException, ServletException {
      。
          return mapping.findForward("---------------------------back-----------------------");
    }
    }
      

  15.   

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
    <struts-config>
      <form-beans>
        <form-bean name="loginActionForm" type="com.lanxin.test.web.LoginActionForm" />
      </form-beans>
      <action-mappings>
        <action name="loginActionForm" type="com.netcobol.test.web.LoginAction" input="/jsp/test1.jsp" scope="session" path="/jsp/loginAction">
          <forward name="show" path="/jsp/test1.jsp" />
          <forward name="Login" path="/jsp/test1.jsp" />
        </action>
        <action name="loginActionForm" type="com.netcobol.test.web.TestAction" input="/jsp/test3.jsp" scope="session" path="/jsp/testAction">
          <forward name="show" path="/jsp/test1.jsp" />
          <forward name="Login" path="/jsp/test2.jsp" />
        </action>
      </action-mappings>
    </struts-config>