说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

一个struts的问题。高手近来看看。不会的捧个人场up有分。

编辑:说三道四文库 发布时间:2018-06-24 04:13
HTML文档下载 WORD文档下载 PDF文档下载
这个问题是wrox出版的jsp web 编程指南的最后的那个关于旅游网站的例子。
我大体说一下现象,希望大家帮我分析一下。
系统环境:win2k,tomcat5.0.16,mysql,struts1.0。
当我访问http://localhost:8080/begjsp-ch13/home.do的时候,网页没有任何显示。白板一块,什么都没显示,而且tomcat窗口没有任何出错信息。
-------------------------------------------------------------
struts-config.xml中关于这部分的设置是:
-------------------------------------------------------------
      <action path="/home"
        type="com.wrox.tourism.actions.HomeAction"
        unknown="true">
          <forward name="success" path="/home.jsp" />
      </action>
------------------------------------------------------------
HomeAction.java的文件内容如下:
------------------------------------------------------------
package com.wrox.tourism.actions;

/**
 * Created by IntelliJ IDEA.
 * User: Administrator
 * Date: 2004-1-9
 * Time: 9:17:45
 * To change this template use Options | File Templates.
 */
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionServlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.io.IOException;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.Collection;

import com.wrox.tourism.db.util.ConnectionPool;
import com.wrox.tourism.db.AttractionDAO;

public class HomeAction extends Action{

    private ConnectionPool pool;

    public HomeAction(){
        pool = ConnectionPool.getInstance();
        System.out.println("Hello world");
    }

    public ActionForward preform(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
       throws Exception,ServletException, SQLException{

        Connection con = null;

        try{
            con = pool.getConnection();
            AttractionDAO attractionDAO = new AttractionDAO(con);
            Collection col = attractionDAO.findAll();
            request.setAttribute(BeanNames.ATTRACTION_LIST,col);
            return mapping.findForward("success");
        }catch(SQLException e){
            e.printStackTrace();
            throw new RuntimeException("Unable to get connection.");
        }finally{
            try{
                if(con != null)
                    con.close();
            }catch (SQLException e){
                throw new RuntimeException(e.getMessage());
            }
        }

    }
}
-------------------------------------------------------------------
当然这部分程序要调用好多其他的类。我在这里就无法一一贴出了。请大家注意,我为了测试最终是否找到了这个类。我在这部分程序中加入了        System.out.println("Hello world");
结果在tomcat窗口依然没有显示Hello world而且没有任何出错信息。
当时我以为是home.jsp文件的问题。可是我直接访问http://localhost:8080/begjsp-ch13/home.jsp可惜显示出正常页面。当然变量显示部分没有任何信息。
我觉得问题出在HomeAction这里,于是我屏蔽了部分信息。
        try{
            con = pool.getConnection();
          //  AttractionDAO attractionDAO = new AttractionDAO(con);
          //  Collection col = attractionDAO.findAll();
          //  request.setAttribute(BeanNames.ATTRACTION_LIST,col);
            return mapping.findForward("success");
        }catch(SQLException e){
            e.printStackTrace();
            throw new RuntimeException("Unable to get connection.");
        }finally{
            try{..........................
只保留了return mapping.findForward("success");部分。这样程序运行的时候,不做什么操作就直接寻找success对应的页面了。可是访问:http://localhost:8080/begjsp-ch13/home.do的时候,网页还是没有任何显示,白板一块,什么都没显示,而且tomcat窗口没有任何出错信息。
到这里我真有点懵了。各位高手如果遇到过类似问题的解决方法或者测试方法请不惜笔墨,详加指点。分数多多的给!
连接过去而不是手动输入试一试,可能需要得到参数
这种情况是没找到action,你检查一下struts-config.xml,程序根本没有进入到你的HomeAction中.
我只能告诉你如何看到 System.out.println() 的输出!!
看看 TOMCAT的日志文件里面有没有!!
如果没有,看你的 catalina.bat 文件!!
最后一条 java 命令,后面添加如下语句, 1>>c:\aa.txt 2>>c:\\aa.txt
up
建议你把你的方法名称改成execute,你现在用的这个perform已经不建议使用了
如果还不行的话,你把你的这个类编译完的class删除掉,看看他报不报错
现在的问题就是他根本没有走你的action
如果还不行的话,那就是你的配置文件的问题了,你再好好检查一下
我删除这个类的class文件后,提示:
type Status report

message No action instance for path /home could be created

description The server encountered an internal error (No action instance for path /home could be created) that prevented it from fulfilling this request.

看来还是发现了这个文件。
我的struts-config.xml文件的全部内容如下:
-------------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>



<!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="attractionForm" type="com.wrox.tourism.entity.Attraction" />
        <form-bean name="eventForm" type="com.worx.tourism.entity.Event" />
    </form-beans>

<action-mappings>

      <action path="/home"
        type="com.wrox.tourism.actions.HomeAction"
        unknown="true">
          <forward name="success" path="/home.jsp" />
      </action>

      <action path="/viewAttraction"
          type="com.wrox.tourism.actions.ViewAttractionAction"
          input="/home.do">
            <forward name="success" path="/viewAttraction.jsp" />
       </action>

      <action path="/registerAttraction"
        type="com.wrox.tourism.actions.RegisterAttractionAction"
        input="/registerAttraction.jsp"
        name="attractionForm"
        scope="request">
          <forward name="success" path="/confirmRegistration.jsp" />
        </action>

      <action path="/editAttraction"
        type="com.wrox.tourism.actions.EditAttractionAction"
        input="/home.do">
          <forward name="success" path="/editAttraction.jsp" />
        </action>

       <action path="/updateAttraction"
        type="com.wrox.tourism.actions.UpdateAttractionAction"
        input="/editAttraction.jsp"
        name="attractionForm"
        scope="request">
           <forward name="success" path="/confirmUpdate.jsp" />
        </action>

        <action path="/listEvents"
          type="com.wrox.tourism.actions.ListEventsAction"
          input="/editAttraction.do">
            <forward name="success" path="/listEvents.jsp" />
        </action>


        <action path="/deleteEvent"
          type="com.wrox.tourism.actions.DeleteEventAction"
          input="/listEvents.do">
            <forward name="success" path="/listEvents.do" />
          </action>

        <action path="/editEvent"
          type="com.wrox.tourism.actions.EditEventAction"
          input="/listEvents.do">
            <forward name="success" path="/editEvent.jsp" />
          </action>

        <action path="/updateEvent"
          type="con.wrox.tourism.actions.UpdateEventAction"
          input="/editEvent.jsp">
          <forward name="success" path="/listEvents.do" />
          </action>

        <action path="/deregisterAttraction"
          type="com.wrox.tourism.action.DeregisterAttractionAction"
          input="/editAttraction.do">
          <forward name="success" path="/home.do" redirect="true" />
          </action>

        <action path="/logoff"
          type="com.wrox.tourism.actions.LogoffAction"
          input="/editAttraction.do">
          <forward name="success" path="/home.do" redirect="true" />
          </action>

    </action-mappings>

</struts-config>
-------------------------------------------------------------------
而且我的其他页面都没有这种情况,不管对错都会有个显示。唯独这个页面。
补充一句,我在 TOMCAT的日志文件里面有没有找到输出的那句话!!
按照你的说法我在 catalina.bat 文件最后一条 java 命令,后面添加如下语句, 1>>c:\aa.txt 2>>c:\\aa.txt
后访问home.do在tomcat窗口终于出现了Hello world。但是这个信息之能显示一次。
以后无论怎么访问都不在显示了,除非重起tomcat。
页面依然是白板一块。
吃过饭后,再来看。。。
后面我又进行了如下测试,加入了2部分显示信息:
System.out.println("Hello world 2 !!");和System.out.println("Hello world 1 !!");
结果tomcat窗口只显示了Hellow world 2。而Hello world 1没有显示。
------------------------------------------------------------------------------
    public HomeAction(){
        pool = ConnectionPool.getInstance();
       System.out.println("Hello world 2 !!");
    }

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
       throws Exception,ServletException, SQLException{

        Connection con = null;

        try{
            System.out.println("Hello world 1 !!");
            con = pool.getConnection();
            AttractionDAO attractionDAO = new AttractionDAO(con);
            Collection col = attractionDAO.findAll();
            request.setAttribute(BeanNames.ATTRACTION_LIST,col);
            return mapping.findForward("success");
        }catch(SQLException e){
            e.printStackTrace();
            throw new RuntimeException("Unable to get connection.");
        }......
着可不可以说明程序try部分没有运行呢?
下面我把System.out.println("Hello world 1 !!");调到try外面,可是还是只能显示Hello world 2。难道 public ActionForward execute(ActionMapping mapping....以后都没有执行?
--------------------------------------------------------------------------------
    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
       throws Exception,ServletException, SQLException{

        Connection con = null;
        System.out.println("Hello world 1 !!");
        try{
关注—Studying
up看看
yun

u.......p
up
我找到了问题的所在,你必须在你的Action中抛出IOException,不要直接throws Exception,我还是用了perform,用excute没有通过,不知是不是struts版本的缘故,我感觉struts还是有bug
改为
    public ActionForward perform(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
       throws IOEception,ServletException, SQLException{
    
     //....
     return mapping.findForward("your_perform");
    }
对不起我拼写错误,应该是execute,
不过不知楼上的朋友看没看struts的源代码,execute方法中就是执行的perform方法.只不过execute是throws Exception,而perform是throws IOException,ServletException,
我在JBuilder中用的struts中没有execute方法.
to:u25(天堂放逐) 
你的JBuilder自带的Struts可能版本比较老,
可能是1.0的。
up
up
UP
up
up
up
学习
up
我昨天就知道了,你把perform写成preform了
up
把你的jsp貼出來看一下,說不定是jsp的問題
解决了吗?
^_^
up
楼主,我吃饭回来了。
嘿嘿
:)


我刚刚看了一下你所描述的。
估计了以下几种情况,你自己看看:

1、你的Struts版本不对。比方,你写的程序是1.1的,但你的库是1.0的。会有这种情况;

2、你的程序没有正常返回,所谓没有正常返回,
  就是指没有执行return mapping.findForward("success"); 
  如果没有执行return mapping.findForward("success");它就不会返回你的home.jsp,

3、你的Struts-config。xml文件定义重复。有多个返回出口
  (这点应该不大可能,我只是尽可能列出所有情况)

另外,楼主描述问题时,尽可能提前说明意图,
你这样贴了这么多的说明文字,中间又插了步骤,
很容易让别人一片茫然。。。
(我就看了糊涂。。。)

如果楼主有可能,
请回帖,重新描述一下步骤和现象,
源程序,如果有大改动就贴吧。。。


祝楼主和楼上各位,猴年爬爬高
sandyen(杉叶)一语道破天机。
我昨天就知道了,你把perform写成preform了
-------------------------------------------
靠!intellij IDEA竟然没有发现这个低能错误。而且还竟然能编译通过。
我晕!
谢谢各位的关心和捧场。
同时祝贺各位2004年工作顺利,身体健康!
Leemaasn
多谢你的关注和支持!
希望有机会和你多多接触:)
我的MSN:fightplane@hotmail.com
我愿意和所有喜欢java的朋友交往,让我们共同进步!
stonecsdn(东东)?
你真的是一个优雅的胖子么?
哈哈!开个玩笑:)
我喜欢你的网站!多谢过来捧场。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘