Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用HttpServlet进行Java继承设计-会导致问题吗_Java_Jsp_Servlets_Inheritance - Fatal编程技术网

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

使用HttpServlet进行Java继承设计-会导致问题吗,java,jsp,servlets,inheritance,Java,Jsp,Servlets,Inheritance,我需要一些帮助,我的意思是这个继承设计的意见 我已经创建了扩展HttpServlet的Controller.class和扩展Controller.class的AjaxController.class,对于PostBackController.class也是如此 正如你们所看到的,有一些servlet.class和一些servlet1.class分别扩展了Controller.class和AjaxController.class 如果我继续这样做的话,我会将这种设计用于更多我想创建为servlet

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

我已经创建了扩展HttpServlet的Controller.class和扩展Controller.class的AjaxController.class,对于PostBackController.class也是如此

正如你们所看到的,有一些servlet.class和一些servlet1.class分别扩展了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;
    }
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);
    }

}
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);
    }
}
AjaxController.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;
    }
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);
    }

}
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);
    }
}
PostBackController.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;
    }
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);
    }

}
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
    }

}
这段代码会在web容器中产生任何问题吗 直接继承扩展HttpServlet,但通过 等级制度

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

因为您创建了太多的servlet类/实例,所以真正的问题是您违反了FrontController设计模式,这是所有流行框架(如Spring、Struts等)遵循的模式,您可以查看此模式

FrontController设计模式的思想是,一个servlet充当所有请求的中心点,然后请求将被委托给相应的控制器/动作类,而这些控制器/动作类不是servlet

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

每个请求完成公共系统服务处理。例如 安全服务完成身份验证和授权 支票

处理请求的集中联络点可能有用, 例如,控制和记录用户在站点中的进度

最好在一个中心位置处理的逻辑是 在众多视图中复制

在检索和操作方面存在决策点 大量的数据

更新:

我主要担心的是,当40个班级延长时,会不会引起任何问题 控制器通过给出实现过程的方法如下 SomeServlet.java。不直接扩展HttpServlet会导致 有什么问题吗


这是一个糟糕的设计,您将失去Front Controller的上述优点。

为什么需要这么多servlet/层次结构?@sundarajgovindasamy只是为了方便起见,但当我添加更多扩展此层次结构的类时,这会导致任何问题吗?我的主要目的是减少控制器重复输入相同的代码。java所有样板代码和调用在doGet和doPost中都是一个抽象方法进程,无论哪个类扩展Controller.java都必须只实现process方法,而不需要再次处理样板代码,因为它负责try-catch和其他内容。我主要担心的是,当40个类通过提供诸如SomeServlet.java之类的过程方法的实现来扩展控制器时,它会导致任何问题。如果不直接扩展HttpServlet,会不会引起我最担心的问题?为什么需要将所有这些都作为servlet?为什么它们不能是由单个Servlet类处理的普通Java类呢?控制器类是抽象的,我希望我的Servlet绑定到不同的url。我最担心的是这会不会导致任何problems@SukhvirThapar,我想你是在试图重新发明轮子。