教你如何在Struts2直接写Servlet类

项目使用了Struts2框架,想利用Huploadify实现上传功能,struts.xml文件和action写的都没有问题,请求上传的Action总是404错误。实在没办法了就想着直接请求Servelt。

一、思路

由于使用Struts2框架,所有的请求都会经过核心过滤器的处理。核心过滤器在根据配置的struts2.xml文件,执行相应的Action。所以在struts2框架中直接访问Servlet是可以的。
但可以从核心过滤器下手,继承核心过滤器,并重写其中的doFilter()方法,对请求链接进行过滤,如果判断为请求地址为Servlet,就直接放行。否则,执行核心过滤器的doFilter()。

二、代码实现

  1. 编写处理上传的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);
			}
		}
	}

  1. 继承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);
	}

}

  1. 配置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>
  1. 验证
    现在请求servlet,发现就可以请求成功了。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Time__Lc/article/details/89875262