项目使用了Struts2框架,想利用Huploadify实现上传功能,struts.xml文件和action写的都没有问题,请求上传的Action总是404错误。实在没办法了就想着直接请求Servelt。
一、思路
由于使用Struts2框架,所有的请求都会经过核心过滤器的处理。核心过滤器在根据配置的struts2.xml文件,执行相应的Action。所以在struts2框架中直接访问Servlet是可以的。
但可以从核心过滤器下手,继承核心过滤器,并重写其中的doFilter()方法,对请求链接进行过滤,如果判断为请求地址为Servlet,就直接放行。否则,执行核心过滤器的doFilter()。
二、代码实现
- 编写处理上传的Servlet
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=UTF-8");
String userDir1 = "D:\\upload";
DiskFileItemFactory fac = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fac);
List<FileItem> fileList = null;
try {
fileList = upload.parseRequest(request);
} catch (FileUploadException ex) {
ex.printStackTrace();
System.out.println("deleteIf");
return;
}
Iterator<FileItem> it = fileList.iterator();
while(it.hasNext()) {
FileItem item = it.next();
if(!item.isFormField()) {
BufferedInputStream in = new BufferedInputStream(item.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(userDir1+"/"+ item.getName())));
Streams.copy(in, out, true);
}
}
}
- 继承Struts2核心过滤器,重写doFilter()方法
@WebFilter("/StrutsFilter")
public class StrutsFilter extends StrutsPrepareAndExecuteFilter implements Filter {
/**
* @see StrutsPrepareAndExecuteFilter#StrutsPrepareAndExecuteFilter()
*/
public StrutsFilter() {
super();
// TODO Auto-generated constructor stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("新的过滤器");
HttpServletRequest httprequest = (HttpServletRequest) request;
String url = httprequest.getRequestURI();
// 如果请求的是servlet 直接转发到sevlet 不执行struts2的核心过滤器
if(url.contains("UploadServlet")) {
System.out.println(url);
chain.doFilter(request, response);
}else {
// 请求的为action 交给核心处理器来处理
super.doFilter(request, response,chain);
}
// pass the request along the filter chain
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
super.init(fConfig);
}
}
- 配置web.xml文件
这里将我们重写后的过滤器配置在web.xml文件中。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SH</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>time.filter.StrutsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- 验证
现在请求servlet,发现就可以请求成功了。