我想在servlet中使模板引擎可用。具体的模板引擎实现应该可以在TemplateEngine界面后面更改。通常依赖注入它可能看起来像这样:
public abstract class BaseServlet extends HttpServlet {
private TemplateEngine templateEngine;
public void setTemplateEngine(TemplateEngine te) {
templateEngine = te;
}
protected void render(Result result, HttpServletResponse response) {
templateEngine.render(result, resonse);
}
}
这种方法的缺点是每个想要使用render方法的Servlet都必须扩展BaseServlet。因此,我想要一个静态导入的渲染方法。
public class TemplateEngineWrapper {
@Inject
static TemplateEngine templateEngine;
public static void render(Result result, HttpServletResponse response) {
templateEngine.render(result, resonse);
}
}
在Servlet中我会这样使用它:
import static TemplateEngineWrapper.render;
...
public void doGet(...) {
render(new Result(200, "Everything is fine."), response);
}
...
这种方法有问题吗?如果是这样的话:你会建议什么?
答案 0 :(得分:8)
这种方法的问题在于它将你的Servlet紧密地耦合到渲染的单个实现(它是伪装的单身)。避免这种紧密耦合是依赖注入的主要优点。使用以下方法将渲染器注入每个servlet会更好:
@Inject
private TemplateEngine templateEngine;
如果你想避免必须从BaseServlet继承(可以理解,因为它将你锁定到一个类层次结构中)。