Simple custom implementations of patterns for web applications using servlets

There is simple custom implementations of design patterns for web applications using servlets, that have been mentioned on StackOverflow.

Folder structure

actions
----ActionFactory.java
----Action.java
----impl
--------HomePageActionImpl.java
--------CreateProductGetActionImpl.java
--------CreateProductPostActionImpl.java
----actionresults
--------ActionResult.java
--------impl
------------ForwardResult.java
------------RedirectResult.java
controller
----Controller.java

ActionFactory.java
public class ActionFactory {

    public static Map actions = new HashMap<String, Action>(
            new HashMap<String, Action>() {
                {
                    put("GET/", new HomePageActionImpl());
                    put("GET/createproduct", new CreateProductGetActionImpl());
                    put("POST/createproduct", new CreateProductPostActionImpl());
                }
            });

    public static Action getAction(HttpServletRequest request) {
        if (actions.containsKey(request.getMethod() + request.getRequestURI())) {
            return actions.get(request.getMethod() + request.getRequestURI());
        } else {
            return actions.get("GET/error");
        }
    }
}
Action.java
public interface Action {

    ActionResult execute(HttpServletRequest request, HttpServletResponse response) throws Exception;

}
HomePageActionImpl.java
public class HomePageActionImpl implements Action {

    public HomePageActionImpl(){}

    @Override
    public ActionResult execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

        //...

        return new ForwardResult("");
    }

}

CreateProductGetActionImpl.java
public class CreateProductGetActionImpl implements Action  {

    @Override
    public ActionResult execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

        // ...

        return new ForwardResult("createproduct");
    }
}

CreateProductPostActionImpl.java
public class CreateProductPostActionImpl implements Action {
    @Override
    public ActionResult execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

        try {
             // ...

        } catch (ValidationException e) {
            request.setAttribute("message", e.getMessage());
            return new ForwardResult("createproduct");
        }
        return new RedirectResult("");
    }
}

ActionResult.java
public interface ActionResult {

    void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

}

ForwardResult.java
public class ForwardResult implements ActionResult {
    protected final String jsp;

    public ForwardResult(String jsp) {
        this.jsp = jsp;
    }

    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        if (jsp == "") {
            request.getRequestDispatcher("/WEB-INF/home.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("/WEB-INF/" + jsp + ".jsp").forward(request, response);
        }
    }
}

RedirectResult.java
public class RedirectResult extends ForwardResult {

    public RedirectResult(String location) {
        super(location);
    }

    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect(jsp);
    }
}

Controller.java
public class Controller extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Action action = ActionFactory.getAction(request);

            ActionResult result = action.execute(request, response);

            result.execute(request, response);

        } catch (Exception e) {
            throw new ServletException("Executing action failed.", e);
        }
    }
}

No comments:

Post a Comment