在struts2项目中用servlet写的验证码无法显示:
There is no Action mapped for namespace / and action name authImg. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:177)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
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:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
这是控制台显示的相关信息!
但是取出掉了struts2的filter后验证码又能正常显示了!
验证码是用servlet写成的!
请问这是怎么回事啊!?

解决方案 »

  1.   

    已经用了struts2了,为什么还用servlet。
    struts2把servlet做了封装,他是可以不依赖于容器
    而且在struts2中有validate方法验证和xml配置验证的支持。
    楼主上边的报的这个错误是找不到Action,你可以看一下是不是
    提交的路径错误或是struts.xml配置有错误。
      

  2.   

    我怀疑是你的Servlet命名和web.xml中为struts配置的
    filtermapping冲突,导致该Servlet名被stuts拿去作为Action解析了,因此报找不到的错误。通常,struts的filterMapping为:*.action
      

  3.   

    你的验证码是通过authImg这个servlet实现的吧,估计是这个url匹配了struts的url-pattern被struts拦截了
      

  4.   

    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47) 
    错在这,找不到action,应没有配置好,看看struts.xml
      

  5.   

    这个servlet是图形验证码啊!貌似这个只有用servlet或者jsp实现吧!
      

  6.   

    web.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
             <servlet>
    <servlet-name>AuthImg</servlet-name>
    <servlet-class>com.blareck.web.AuthImg</servlet-class>
    </servlet> <servlet-mapping>
    <servlet-name>AuthImg</servlet-name>
    <url-pattern>/authImg</url-pattern>
    </servlet-mapping> <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
    struts.xml配置文件<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
             "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
             "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <include file="struts-default.xml" />
    </struts>
    index.jsp
    <img src="authImg">
    ====================================================
    各位帮忙看下 那里出错了啊!?感觉没出错啊!
      

  7.   

    struts2的过滤器和你自定义的路径冲突了..你可以把你的映射的名字加个后缀什么的就行了.比如这样 
    <url-pattern>/authImg.jpg </url-pattern> 
      

  8.   

    我照这佯作了以后还是出现:
    警告: Could not find action or result
    There is no Action mapped for namespace / and action name authImg. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:177)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    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:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)
    ================================================
    这到底要怎么改采没问题啊!?郁闷得很,莫非struts.xml文件要配置!我看李刚的那本ssh2的书里面的工作流系统里面的验证码也没出现过这种问题啊!
      

  9.   

    <filter-mapping>
    <filter-name>Struts2 </filter-name>
    <url-pattern>*.action </url-pattern>
    </filter-mapping> 或者直接拿struts2的action来写验证码
      

  10.   

    再问句啊!我看了李刚的那本SSH2的书后面哪个工作流的列子!里面的验证码的url-pattern配置为/web-inf/jsp/authImg.jsp后为什么能正常用呢!?其他的配置都一样啊!
      

  11.   

    匹配的优先级的问题
    1. 先匹配完全映射的 URL
    2. 再次匹配路径映射的 URL, 并且最长的路径的匹配优先
    3. 再次匹配扩展名映射
    4. 最后使用默认的 Servlet
      

  12.   

    End event threw exception
    java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:899)
    at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:193)
    at org.apache.tomcat.util.digester.Rule.end(Rule.java:229)
    at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1058)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
    at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369)
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4236)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> /*.action in filter mapping
    at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2169)
    ... 44 more
    2009-5-11 17:35:10 org.apache.catalina.startup.ContextConfig applicationWebConfig
    严重: Parse error in application web.xml file at jndi:/localhost/test/WEB-INF/web.xml
    java.lang.IllegalArgumentException: Invalid <url-pattern> /*.action in filter mapping
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2726)
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2752)
    at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1061)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
    at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369)
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4236)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    ================================================
    用了
    <filter-mapping>
    <filter-name>Struts2 </filter-name>
    <url-pattern>*.action </url-pattern>
    </filter-mapping> 
    结果项目都没法打开了!
      

  13.   


    public class ValidateCodeAction extends ActionSupport
    {
        private ByteArrayInputStream inputStream;
        private int width;
        private int height;
        private int fontSize;
        private int codeLength;    public ValidateCodeAction()
        {
        }    public void setCodeLength(int codeLength)
        {
            this.codeLength = codeLength;
        }    public void setFontSize(int fontSize)
        {
            this.fontSize = fontSize;
        }    public void setHeight(int height)
        {
            this.height = height;
        }    public void setWidth(int width)
        {
            this.width = width;
        }    public ByteArrayInputStream getInputStream()
        {
            return inputStream;
        }    public void setInputStream(ByteArrayInputStream inputStream)
        {
            this.inputStream = inputStream;
        }    public String execute()
            throws Exception
        {
            BufferedImage bimage = new BufferedImage(width, height, 1);
            Graphics g = bimage.getGraphics();
            Random random = new Random();
            g.setColor(getRandomColor(random, 200, 255));
            g.fillRect(0, 0, width, height);
            g.setFont(new Font("Times New Roman", 0, fontSize));
            g.setColor(getRandomColor(random, 160, 200));
            for(int i = 0; i < 155; i++)
            {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
            }        StringBuffer str = new StringBuffer();
            for(int i = 0; i < codeLength; i++)
            {
                String randomStr = String.valueOf(random.nextInt(10));
                str.append(randomStr);
                g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
                int x = (width / codeLength - 1) * i + random.nextInt(width / (codeLength * 2));
                int y = random.nextInt(height - fontSize) + fontSize;
                g.drawString(randomStr, x, y);
            }        ActionContext.getContext().getSession().put("validateCode", str.toString());
            g.dispose();
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageOutputStream iout = ImageIO.createImageOutputStream(output);
            ImageIO.write(bimage, "JPEG", iout);
            iout.close();
            output.close();
            ByteArrayInputStream in = new ByteArrayInputStream(output.toByteArray());
            setInputStream(in);
            return "success";
        }    private Color getRandomColor(Random random, int fc, int bc)
        {
            if(fc > 255)
                fc = 255;
            if(bc > 255)
                bc = 255;
            int r = fc + random.nextInt(bc - fc);
            int g = fc + random.nextInt(bc - fc);
            int b = fc + random.nextInt(bc - fc);
            return new Color(r, g, b);
        }}[/code] <action name="validate" class="validateCode">
    <param name="width">80</param>
    <param name="height">20</param>
    <param name="fontSize">18</param>
    <param name="codeLength">4</param>
    <result type="stream">
    <param name="contentType">image/jpeg</param>
    <param name="inputName">inputStream</param>
    </result>
    </action>
      

  14.   

    楼上的方法没试过!
    现在搞定了:<url-pattern>/authImg.jsp</url-pattern>   <img src="authImg.jsp">可以 但是authImg.jpg等其他方法好像没用!
    谢谢各位了!