比如说,有一个MyJSPWriter扩展JspWriter和实现所有抽象方法的类。print(String )经过修改后添加了一些特殊的行为,因此所有作为字符串的表达式都将得到不同的对待(也许我可以将其用于某些特殊的编码等这样-这是一个简化的示例):
MyJSPWriter
JspWriter
print(String )
package com.myproject.base; import java.io.IOException; import javax.servlet.jsp.JspWriter; public class MyJSPWriter extends JspWriter{ JspWriter out = null; public MyJSPWriter(JspWriter out) { super(0, true); this.out = out; } @Override public String toString() { return out.toString(); } @Override public void clear() throws IOException { out.clear(); } @Override public void clearBuffer() throws IOException { out.clearBuffer(); } @Override public void close() throws IOException { out.close(); } @Override public void flush() throws IOException { out.flush(); } @Override public int getRemaining() { return out.getRemaining(); } @Override public void newLine() throws IOException { out.newLine(); } @Override public void print(boolean b) throws IOException { out.print(b); } @Override public void print(char c) throws IOException { out.print(c); } @Override public void print(int i) throws IOException { out.print(i); } @Override public void print(long l) throws IOException { out.print(l); } @Override public void print(float f) throws IOException { out.print(f); } @Override public void print(double d) throws IOException { out.print(d); } @Override public void print(char[] s) throws IOException { out.print(s); } @Override public void print(String s) throws IOException { out.print("Processed String: " + s); } @Override public void print(Object obj) throws IOException { out.print(obj); } @Override public void println() throws IOException { out.println(); } @Override public void println(boolean x) throws IOException { out.println(x); } @Override public void println(char x) throws IOException { out.println(x); } @Override public void println(int x) throws IOException { out.println(x); } @Override public void println(long x) throws IOException { out.println(x); } @Override public void println(float x) throws IOException { out.println(x); } @Override public void println(double x) throws IOException { out.println(x); } @Override public void println(char[] x) throws IOException { out.println(x); } @Override public void println(String x) throws IOException { out.println(x); } @Override public void println(Object x) throws IOException { out.println(x); } @Override public void write(char[] cbuf, int off, int len) throws IOException { out.write(cbuf, off, len); } }
我有jsp(说Main.jsp),它看起来像这样:
Main.jsp
<%@page import="com.myproject.base"%> <% out = new MyJSPWriter(out); %> <%= " Hello World" %>
因此,在我的输出中,它将显示为
Processed String: Hello World
现在,如果我有更多的jsp:includes,并且可能在每个其中都包含includes。例如:
<%@page import="com.myproject.base"%> <% out = new MyJSPWriter(out); %> <%= " Hello World" %> <jsp:include page="Sub1.jsp"></jsp:include> <jsp:include page="Sub2.jsp"></jsp:include>
Sub1.jsp
<%= " Hello World from sub1.jsp" %>
Sub2.jsp
<%= " Hello World from sub2.jsp" %> <jsp:include page="Sub3.jsp"></jsp:include>
等等…
但是所有子jsp都有out自己的对象… :-(
out
我们如何在不添加的情况下为所有包含的jsps带来相同的行为
<% out = new MyJSPWriter(out); %>
在这些文件的每个文件中(因为我正在尝试在旧版应用程序中使用它)?
我还有其他方法可以解决吗?
附加信息: 当我们查看jsp的生成的.java文件时,这就是部分代码的样子
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out = new MyJSPWriter(out); // and so on writing content ....
如果您查看生成的jsp类的顶部,您将看到以下行
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
现在,自定义out对象的一种可能解决方案是具有自定义实现JspFactory。
JspFactory
脚步
创建一个自定义的JspFactory实现
public class MyJspFactory extends JspFactory { private static JspFactory _myFactory = null; public MyJspFactory(JspFactory factory) { _myFactory = factory; } //All abstract methods which looks up _myFactory and does the same thing public PageContext getPageContext(Servlet servlet, ServletRequest request, ServletResponse response, String errorPageURL, boolean needsSession, int bufferSize, boolean autoflush) { PageContext myCtxt = _myFactory.getPageContext(....) //Create a customPageContext and wrap myCtxt in it and return } }
创建一个CutsomPageContext类
public class MyPageContext extends PageContext { private PageContext _ctxt = null; public void setPageContext(PageContext ctxt) { _ctxt = ctxt; } //Implement all abstract methods using _ctxt object @override public JspWriter getOut() { JspWriter _out = _ctxt.getOut(); //Wrap _out object using MyJSPWriter as mentioned in question and return back; } }
现在,在servlet的初始化过程中,添加以下行
JspFactory newFactory = new MyJspFactory(JspFactory.getDefaultFactory()); JspFactory.setDefaultFactory(newFactory);
我还没有尝试过。但从概念上讲,它应该起作用。如果您可以通过此方法实现目标,请告诉我们。
祝好运!