struts 2 的 上传文件问题
今天写了一个上传文件的Web 程序,结果,一直报错。
错误如下:
No result defined for action action.UploadAction and result list
然后,上网一直发帖,找资料。最后,发现,居然是struts.xml 文件里面有错。
原先的struts.xml文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="main" extends="struts-default">
<action name="loginPerson"
class="action.Login">
<result name="login">/Login.jsp</result>
<result name="success">/Success.jsp</result>
</action>
<action name="upload"
class="action.UploadAction">
<result name="input">/Success.jsp</result>
<result name="list">/Uploadlist.jsp</result>
</action>
</package>
</struts>
居然是 action 名字<action name="upload" 与struts 的关键字冲突(百度上面这么说的。)
于是,修改了action 名字和 相关配置,就好了。
<action name="fileupload"
class="action.UploadAction">
<result name="input">/Success.jsp</result>
<result name="list">/Uploadlist.jsp</result>
</action>
接下去写文件的下载,又有问题了。MD,这次是有中文名的文件下载出错了。
找了N多资料,最终,还是要用上次那招对付中文乱码的方法。
首先,写个过滤器。
这是它在web-xml里面的代码
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>helloweenvsfei.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:如果有struts 2 的 filter,书上说要把Struts 2的分发器Filter最为最后一个Filter。
下面是helloweenvsfei.CharacterEncodingFilter的代码
package helloweenvsfei;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter
{
private String characterEncoding;
private boolean enabled;
public void destroy() {
characterEncoding = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
if(enabled || characterEncoding !=null)
{
request.setCharacterEncoding(characterEncoding);
response.setCharacterEncoding(characterEncoding);
}
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException
{
characterEncoding = config.getInitParameter("characterEncoding");
enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim());
}
}
最后,还要修改那个Tomcat的编码格式(当年,很傻逼地去修改了那个安装Tomcat的地方,结果,发现,这
个是错的。)
先去看Tomcat的位置。 window-〉Preferences->MyEclipse Tomcat 6,看Tomcat base directory
根据那个目录,找到conf->server.xml,再修改server.xml文件,指定URIEncoding。(不然,默认为
ISO-8859-)
改这句话<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
最后,搞定这件事。