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 文字列を作成していくかという作業に注力していくことになる。