2. Filter > Js

배고픈 징징이 ㅣ 2023. 2. 6. 16:12

1. 설명

기본 Maven 프로젝트를 만들었다면, 이제 js파일들을 가져오는 부분을 Filter쪽에서 구현해주도록 한다.

 

Filter에 대한 설명은 아래 포스팅을 참조

 

Filter 와 Interceptor

[Filter vs Interceptor] 1. Filter는 Spring 범위 밖(Web Container)에서 처리되고, Interceptor는 Spring 범위 안(Spring Container)에서 처리된다. 2. Filter는 공통된 보안작업, 모든 요청에 대한 확인, 이미지&데이터 압축

pinokio5600.tistory.com

 

2. Tomcat에 Filter 세팅

filter를 사용하기 위해 web.xml에 filter태그에 Filter로 사용할 Class를  넣어주고,

filter-mapping 태그에 해당 필터가 매칭될 url pattern을 넣어준다.

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0" metadata-complete="true">
    <display-name>Welcome to Tomcat</display-name>
    <description>Welcome to Tomcat</description>

    <filter>
        <filter-name>FrontFilter</filter-name>
        <filter-class>com.simms.controller.FrontFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FrontFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>com.simms.ApplicationLoader</listener-class>
    </listener>
</web-app>

 

FrontFilter.java

public class FrontFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

 

3. Filter에 Js 처리 로직 추가

Option의 ROOT는 Servlet에서 생성해주는 ROOT 디렉토리 경로이다.

Option의 getFile은 ROOT 디렉토리 경로와  파라미터로 받은 파일명으로 new File을 진행하는 메소드이다.

Servlet으로 ROOT 로직을 옮긴 이유는 ROOT는 변경될 일이 없기때문에 서버 구동시 한번만 실행되게하기 위해서이다.

 

FrontFilter.java

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    response.setCharacterEncoding("UTF-8");
    String servletPath = request.getServletPath();

    try {
        if (servletPath.startsWith("/js/")) { 						//Request가 /js/로 시작한다면
            File file = Option.ROOT.getFile(servletPath + ".js");   //해당 경로의 js파일을 가져온다.
            String jsFile = FileUtils.readFileToString(file); 		//js파일을 Stringd으로 변환
            response.setContentType("text/javascript"); 		//response의 contentType을 javascript로 명시
            response.getWriter().println(jsFile); 					//js String을 내려준다.
            return;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

ApplicationLoader.java

public class ApplicationLoader implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        String realPath = sce.getServletContext().getRealPath("/");
        Option.ROOT.setValue(realPath);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }
}

 

Option.java

public enum Option {
    ROOT("...");

    String value;

    public File getFile(String name) {
        return new File(value, name);
    }

    public void setValue(String value) {
        this.value = value;
    }

    Option(String value) {
        this.value = value;
    }
}
반응형

'Java > - Pure Java Project' 카테고리의 다른 글

6. Annotation  (0) 2023.02.09
5. JNDI : DB Connect  (0) 2023.02.08
4. Router (Dynamic Import & Create Class)  (0) 2023.02.07
3. Filter > Controller, Css  (0) 2023.02.06
1. 시작  (0) 2023.02.06