问题一:upload.parseRequest(request)得到的items为空
private HttpServletRequest request;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); #request有值,但items却为null
原因:
web.xml中的过滤器:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts2过滤时,会改变request的类型,由HttpServletRequest变成MultiPartRequestWrapper
解决:
第一步:加一个类
public class RequestParseWrapper extends JakartaMultiPartRequest {
public void parse(HttpServletRequest servletRequest, String saveDir) throws IOException {
}
}
第二步:struts.xml配置文件加如下
<!-- upload filt httpreqest process-->
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="myRequestParser" class="com.dirsir.base.frame.RequestParseWrapper" scope="default" optional="true" />
<constant name="struts.multipart.handler" value="myRequestParser" />
这样配置之后引来了问题二。
问题二:action中通过getUpload()获取jsp页面中的表单数据<input type="file" name="upload"/>
得到的files为空
jsp中:<input type="file" name="upload"/>
action中:List<File> files = getUpload(); #files为空
原因:
struts2的过滤器:StrutsPrepareAndExecuteFilter源代码解析
由于重写了RequestParseWrapper 类,并把里面的内容置为空,影响了action中对file类型的表单数据“upload”的获取。
解决:
在action中采用HttpServletRequest的方式获取“upload”,即:
private HttpServletRequest request;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
然后再对items进行分情况处理。
注意:action中获得HttpServletRequest四种方式
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 在action中获得HttpServletRequest四种方式
*/
public class Login extends ActionSupport implements ServletRequestAware,RequestAware{
private HttpServletRequest req1=null;
private HttpServletRequest req2=null;
private HttpServletRequest req3=null;
private HttpServletRequest req4=null;
public String execute(){
HttpServletRequest req2 = ServletActionContext.getRequest();
req4 = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
return "success";
}
public void setServletRequest(HttpServletRequest request) {
req1=request;
}
public void setRequest(Map<String, Object> request) {
req3 = (HttpServletRequest) request;
}
}