Last active
December 23, 2015 22:19
-
-
Save dwelch2344/6702279 to your computer and use it in GitHub Desktop.
A simple standalone dispatcher servlet, for working in disappointing environments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @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