読者です 読者をやめる 読者になる 読者になる

JSONだけを応答レスポンスとして返すWebシステム

JSONだけを応答レスポンスとして返すWebシステム構築を考えた時、
HTTPリクエストから、JSON だけを応答することに
というコンセプトを持てば、、
Tomcat等のWebコンテナの他に必要なものとして、
有名なWebフレームワークの多くは、余計な機能があり過ぎて必要がない。
Servlet-APIと、JSON生成の為のライブラリ、他は文字列操作やログ出力等、今まで
Jakartaプロジェクトで使ってた便利API、せいぜい、Google-guice でもあれば、充分である。

import javax.servlet.http.HttpServletRequest;
/**
 * JsonResponder JSONレスポンス応答インターフェース.
 */

public interface JsonResponder{
   /**
    * HttpServletRequest→JSON.
    * @param request javax.servlet.http.HttpServletRequest
    * @return JSON文字列データ、null を返却すると HTTPレスポンスを返さない。
    */

   public String answer(HttpServletRequest request);
}

public abstract class JacobApplication{
   public abstract JsonResponder init();
}

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * フィルタ.
 */

public final class JacobFilter implements Filter{
   private Logger logger = LoggerFactory.getLogger(this.getClass());

   private JsonResponder jsonResponder;

   @Override
   public void init(FilterConfig config) throws ServletException{

      String applicationClassName = config.getInitParameter("applicationClassName");
      ClassLoader loader = Thread.currentThread().getContextClassLoader();
      try{
         JacobApplication application = (JacobApplication)loader.loadClass(applicationClassName).getConstructor(new Class<?>{}).newInstance();
         jsonResponder = application.init();
      }catch(Exception e){
         logger.error(e.getMessage(), e);
      }
   }
   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{

      HttpServletRequest httpServletRequest = (HttpServletRequest)request;
      String method = httpServletRequest.getMethod();
      if (!method.equals("GET") && !method.equals("POST")) return;
      String content = jsonResponder.answer(httpServletRequest);
      if (content != null){
         HttpServletResponse httpres = (HttpServletResponse)response;
         httpres.addHeader("Content-Type", "application/json; charset=utf-8");
         httpres.addHeader("Access-Control-Allow-Origin", "*");
         httpres.addHeader("Access-Control-Allow-Headers", "X-Requested-With");
         byte
 b = content.getBytes();
         httpres.addHeader("Content-Length", Integer.toString(b.length));
         response.setCharacterEncoding("UTF-8");
         response.getOutputStream().write(content.getBytes());
      }
   }
   @Override
   public void destroy(){
   }
}


web.xml が以外にも鍵であり、、、、

  <filter>
    <filter-name>JacobFilter</filter-name>
    <filter-class>xxx.xxx.JacobFilter</filter-class>
    <init-param>
      <param-name>applicationClassName</param-name>
      <param-value>sample.SampleApplication</param-value>
    </init-param>
  </filter>

SampleApplication extends JacobApplication を
如何に用意して、
この JsonResponder 実装、即ち、HTTP要求に対して、如何に!?
JSON 文字列を作成していくかという作業に注力していくことになる。