2016-02-09 11 views
6

Mam utworzony podstawowy przykład JSP, gdy przechodzę przez plik serwletu utworzony automatycznie przez JSP. Widziałem dwa odniesienia do PageContext i JspWriter w metodzie _jspService. Dlaczego istnieją dwie refences z pageContext i JspWriterdlaczego jsp utworzyć dwa odniesienia do PageContext i JspWriter podczas konwertowania Jsp do Servlet

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {

final javax.servlet.jsp.PageContext pageContext; 
javax.servlet.http.HttpSession session = null; 
final javax.servlet.ServletContext application; 
final javax.servlet.ServletConfig config; 
javax.servlet.jsp.JspWriter out = null; 
final java.lang.Object page = this; 
javax.servlet.jsp.JspWriter _jspx_out = null; 
javax.servlet.jsp.PageContext _jspx_page_context = null; 

`

Odpowiedz

1

To pytanie dotyczyło implementacja plików bibliotecznych niestandardowych znaczników i znaczników JSP. Zmienna nieostateczna PageContext i JspWriter może ulec zmianie podczas działania. Oto przykład JSP

<html><body><%@ taglib uri="http://tomcat.apache.org/example-taglib" prefix="eg"%> 
<eg:log>It's <%="TEST"%></eg:log></body></html> 

wygenerowany kod Java Tomcat 7

1 pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); 
2 _jspx_page_context = pageContext; 
3 application = pageContext.getServletContext(); 
4 config = pageContext.getServletConfig(); 
5 session = pageContext.getSession(); 
6 out = pageContext.getOut(); 
7 _jspx_out = out; 
8 out.write("<html><body>\r\n"); 
9 // eg:log 
10 examples.LogTag _jspx_th_eg_005flog_005f0 = (examples.LogTag) _005fjspx_005ftagPool_005feg_005flog.get(examples.LogTag.class); 
11 _jspx_th_eg_005flog_005f0.setPageContext(_jspx_page_context); 
12 _jspx_th_eg_005flog_005f0.setParent(null); 
13 int _jspx_eval_eg_005flog_005f0 = _jspx_th_eg_005flog_005f0.doStartTag(); 
14 if (_jspx_eval_eg_005flog_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) { 
15 if (_jspx_eval_eg_005flog_005f0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) { 
16 out = _jspx_page_context.pushBody(); 
17 _jspx_th_eg_005flog_005f0.setBodyContent((javax.servlet.jsp.tagext.BodyContent) out); 
18 _jspx_th_eg_005flog_005f0.doInitBody(); 
19 } 
20 do { 
21 out.write("It's "); 
22 out.print("TEST"); 
23 int evalDoAfterBody = _jspx_th_eg_005flog_005f0.doAfterBody(); 
24 if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) 
25  break; 
26 } while (true); 
27 if (_jspx_eval_eg_005flog_005f0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) { 
28 out = _jspx_page_context.popBody(); 
29 } 
30 } 

W linii 16, gdy program wykonać _jspx_page_context.pushBody(). Zostaje zwrócone nowe JSPWriter. Służy do przechwytywania danych wyjściowych treści, więc dane nie są bezpośrednio zapisywane w pliku response outputStream. The LogTag.doAfterBody() można uzyskać przechwycony ouput i obsługiwać go.