使用HttpServlet进行Java继承设计 - 会导致问题

时间:2017-03-28 16:44:03

标签: java jsp servlets inheritance

我需要一些帮助,我的意思是这种继承设计。

我创建了 Controller.class ,它扩展了 HttpServlet AjaxController.class 扩展 Controller.class PostBackController.class 也是如此。

你们可以看到扩展 <的 SomeServlet.class SomeServlet1.class em> Controller.class AjaxController.class

如果我继续使用这个设计更多的类我想要创建为servlet,例如,扩展Controller.classs的Search.class等等。

此代码是否会在Web容器中产生任何问题,因为我不是直接继承(扩展)HttpServlet而是通过层次结构。

请让我知道您在此设计中发现的任何问题。 谢谢

Controller.java

 package utility;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

public abstract class Controller extends HttpServlet {

    @Override
    final protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProcess(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doProcess(req, resp);
    }

    public void onError(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendError(500);
    }

    final private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Session session = Utils.openSession();
        session.beginTransaction();
        PrintWriter out = resp.getWriter();
        try {
            process(req, resp, session, req.getSession(), out);
            session.getTransaction().commit();
            session.close();
        } catch (Exception e) {
            session.getTransaction().rollback();
            session.close();
            if (showErrorLog()) {
                e.printStackTrace();
            }
            this.onError(req, resp);
        } finally {
            out.close();
        }
    }

    public boolean showErrorLog() {
        return false;
    }

    public abstract void process(HttpServletRequest req, HttpServletResponse resp, Session session, HttpSession httpSession, PrintWriter out) throws Exception;
    }

AjaxController.java

package utility;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public abstract class AjaxController extends Controller {

    @Override
    public void onError(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        out.print("error");
        out.close();
    }

    @Override
    final protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.onError(req, resp);
    }

}

PostBackController.java

package utility;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public abstract class PostBackController extends Controller{

    @Override
    final protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       super.onError(req, resp);
    }
}

SomeServlet.java

    package utility;

import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

@WebServlet("/someurl")
public class SomeServlet extends Controller{

    @Override
    public void process(HttpServletRequest req, HttpServletResponse resp, Session session, HttpSession httpSession, PrintWriter out) throws Exception {
       //does some work
       //includes a jsp for view
    }

}

如果我创建更多这样的类,它将导致Web服务器/容器中的任何问题 SomeServlet1.java

package utility;

import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

@WebServlet("/someurl1")
public class SomeServlet1 extends PostBackController{

    @Override
    public void process(HttpServletRequest req, HttpServletResponse resp, Session session, HttpSession httpSession, PrintWriter out) throws Exception {
       //does some work
       //USED TO HANDLE AJAX REQUEST
    }

}

1 个答案:

答案 0 :(得分:1)

  

此代码是否会在Web容器中创建任何问题,因为我不是   直接继承(扩展)HttpServlet但经历一个   层次?

如果您的servlet没有直接扩展HttpServlet,那么如果HttpServlet作为继承层次结构中的父类之一存在,则没有问题。

因为你创建了太多的servlet类/实例,真正的问题是你违反了FrontController设计模式(其后是所有流行的框架,如Spring,Struts等。 ),你可以看看这个模式here

FrontController设计模式的想法是,一个servlet充当所有请求的中心点,然后请求将委托给相应的Controller / Action类(不是servlet)。

以下是前端控制器模式的主要优点(取自上述链接):

  

通用系统服务处理按请求完成。例如,   安全服务完成身份验证和授权   检查。

     

处理请求的集中联系点可能很有用,   例如,控制并记录用户在网站上的进度。

     

最好在一个中心位置处理的逻辑   在众多观点中复制。

     

关于检索和操纵存在决策点   数据。

<强>更新

  

我主要担心的是,当40个课程扩展时会引起任何问题   控制器通过给出执行方法就好了   SomeServlet.java。不直接扩展HttpServlet,它会导致   有什么问题吗?

这是一个糟糕的设计,你将失去Front Controller的上述好处。