2008/09/11 21:56

Struts2 에서 확장자 제거하기

Struts2에서 Action의 기본확장자는 action이다.
REST의 관점에서 보면 URL은 Resource를 가리키고 있을 뿐이어서 action이란 접미어가 붙는 것은 restful 하지 않아 보인다.
그래서 struts.properties의 struts.action.extension에 아무것도 할당하지 않으면 간단히 확장자를 제거 할 수 있다.
struts.action.extension=
struts.properties

하지만, 이렇게 하면 welcome-file을 사용할 수 없고, *.jsp, *.gif, *.jpg등 struts action이 아닌 resource들은 접근 할 수도 없다. 그래서 다음과 같이 간단한 필터를 만들어 보았다.
  1. package filters;  
  2.  
  3. import java.io.IOException;  
  4.  
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12.  
  13. import org.apache.struts2.dispatcher.FilterDispatcher;  
  14.  
  15. public class StrutsRedirectFilter implements Filter {  
  16.  
  17.     FilterDispatcher dispatcher = new FilterDispatcher();  
  18.  
  19.     @Override 
  20.     public void doFilter(ServletRequest req, ServletResponse res,  
  21.             FilterChain chain) throws IOException, ServletException {  
  22.  
  23.         HttpServletRequest request = (HttpServletRequest) req;  
  24.         String uri = request.getRequestURI();  
  25.  
  26.         // 확장자가 있는 경우  
  27.         if (uri != null 
  28.                 && (uri.equals(request.getContextPath().concat("/")) || uri  
  29.                         .substring(uri.indexOf("/")).indexOf(".") > -1)) {  
  30.             chain.doFilter(req, res);  
  31.             // 아닌 경우 struts로 넘긴다.  
  32.         } else {  
  33.             dispatcher.doFilter(req, res, chain);  
  34.         }  
  35.     }  
  36.  
  37.     @Override 
  38.     public void destroy() {  
  39.         dispatcher.destroy();  
  40.     }  
  41.  
  42.     @Override 
  43.     public void init(FilterConfig config) throws ServletException {  
  44.         dispatcher.init(config);  
  45.     }  
  46. }  
StrutsRedirectFilter.java

이 필터를 org.apache.struts2.dispatcher.FilterDispatcher 대신 web.xml 에 넣어주면 된다.
  1. <?xml version="1.0"?> 
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3. "http://java.sun.com/dtd/web-app_2_3.dtd"> 
  4.  
  5. <web-app> 
  6.   <display-name>My Application</display-name> 
  7.   <filter> 
  8.     <filter-name>struts2</filter-name> 
  9.     <filter-class>filters.StrutsRedirectFilter</filter-class> 
  10.   </filter> 
  11.  
  12.   <filter-mapping> 
  13.     <filter-name>struts2</filter-name> 
  14.     <url-pattern>/*</url-pattern> 
  15.   </filter-mapping> 
  16. </web-app> 


    출처 : http://blog.fguy.com/19
Trackback 0 Comment 0