我需要一些帮助,我的意思是这种继承设计。
我创建了 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
}
}
答案 0 :(得分:1)
此代码是否会在Web容器中创建任何问题,因为我不是 直接继承(扩展)HttpServlet但经历一个 层次?
如果您的servlet没有直接扩展HttpServlet
,那么如果HttpServlet
作为继承层次结构中的父类之一存在,则没有问题。
因为你创建了太多的servlet类/实例,真正的问题是你违反了FrontController设计模式(其后是所有流行的框架,如Spring,Struts等。 ),你可以看看这个模式here。
FrontController设计模式的想法是,一个servlet充当所有请求的中心点,然后请求将委托给相应的Controller / Action类(不是servlet)。
以下是前端控制器模式的主要优点(取自上述链接):
通用系统服务处理按请求完成。例如, 安全服务完成身份验证和授权 检查。
处理请求的集中联系点可能很有用, 例如,控制并记录用户在网站上的进度。
最好在一个中心位置处理的逻辑 在众多观点中复制。
关于检索和操纵存在决策点 数据。
<强>更新强>
我主要担心的是,当40个课程扩展时会引起任何问题 控制器通过给出执行方法就好了 SomeServlet.java。不直接扩展HttpServlet,它会导致 有什么问题吗?
这是一个糟糕的设计,你将失去Front Controller的上述好处。