Skip to content

Instantly share code, notes, and snippets.

@dwelch2344
Last active December 23, 2015 22:19
Show Gist options
  • Select an option

  • Save dwelch2344/6702279 to your computer and use it in GitHub Desktop.

Select an option

Save dwelch2344/6702279 to your computer and use it in GitHub Desktop.
A simple standalone dispatcher servlet, for working in disappointing environments
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public abstract class DispatcherServlet extends GenericServlet{
private static final String VIEW_SUFFIX = ".jsp";
private static final String VIEW_PREFIX = "/WEB-INF/views/";
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
handleReflectively(request, response);
} catch (Exception e) {
e.printStackTrace();
PrintWriter writer = response.getWriter();
writer.write( "<pre>" );
e.printStackTrace(writer);
writer.write("</pre>");
response.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
response.flushBuffer();
}
}
private void handleReflectively(HttpServletRequest request, HttpServletResponse response) throws Exception{
String uri = request.getRequestURI();
uri = uri.substring(1, uri.length());
if( uri.contains("/") ){
throw new IllegalStateException("Unable to handle anything but root requests");
}else if( uri.isEmpty() ){
uri = "index";
}
Method method = getClass().getDeclaredMethod(uri, Model.class);
Model model = new Model();
Object viewObject = method.invoke(this, model);
if(viewObject instanceof String == false){
throw new IllegalStateException("Right now we only support returning strings for views...");
}
String view = (String) viewObject;
Map<String, Object> map = model.getMap();
request.setAttribute("it", map);
request.getRequestDispatcher(VIEW_PREFIX + view + VIEW_SUFFIX).forward(request, response);
}
public static class Model{
private Map<String, Object> map = new HashMap<String, Object>();
public Model put(String key, Object value){
map.put(key, value);
return this;
}
private Map<String, Object> getMap(){
return map;
}
}
}
@SuppressWarnings("serial")
public class ImplServlet extends DispatcherServlet{
// will try to resolve /WEB-INF/views/test.jsp, with ${it.dummy} returning "Hello Worldddd"
public String index(Model model){
model.put("dummy", "Hello Worldddd");
return "test";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment