javajspgenerator.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 2,451 行 · 第 1/5 页
JAVA
2,451 行
} /** * Returns true if the JSP compilation has produced a static file. */ public boolean isStatic() { return _isStatic; } /** * Returns the page's XML view. */ public PageData getPageData() throws IOException { if (_pageData != null) return _pageData; TempStream ts = new TempStream(); ts.openWrite(); WriteStream ws = new WriteStream(ts); ws.setEncoding("UTF-8"); _rootNode.printXml(ws); ws.close(); if (log.isLoggable(Level.FINER)) { StringBuilder sb = new StringBuilder(); ReadStream is = ts.openReadAndSaveBuffer(); int ch; while ((ch = is.readChar()) >= 0) { sb.append((char) ch); } is.close(); log.finer("JSP[" + _fullClassName + "] " + sb); } _pageData = new QPageData(ts); return _pageData; } public ELContext getELContext() { return _elContext; } /** * Validates the JSP page. */ public void validate() throws Exception { for (int i = 0; i < _tagLibraryList.size(); i++) { Taglib taglib = _tagLibraryList.get(i); TagLibraryValidator validator = taglib.getValidator(); if (validator != null) { ValidationMessage []messages; messages = validator.validate(taglib.getPrefixString(), taglib.getURI(), getPageData()); if (messages != null && messages.length > 0) { StringBuilder message = new StringBuilder(); for (int j = 0; j < messages.length; j++) { if (j != 0) message.append("\n"); message.append(messages[j].getMessage()); } throw _rootNode.error(message.toString()); } } } } /** * Generates the JSP page. */ protected void generate(Path path, String className) throws Exception { init(className); if (_jspCompilerInstance == null || ! _jspCompilerInstance.isGeneratedSource()) addDepend(path); _cacheDepends = new ArrayList<Depend>(); _tagId = 1; if (_ideHack) _config.setStaticEncoding(false); // disable static pages. No longer needed and complicates // precompilation if (isGenerateStatic() && ! _parseState.getJspPropertyGroup().getStaticPageGeneratesClass()) { generateStatic(); } else { WriteStream os = openWriteStream(); JspJavaWriter out = new JspJavaWriter(os, this); try { generate(out); } finally { if (os != null) os.close(); } } if (_lineMap != null) { Path javaPath = getGeneratedPath(); String tail = javaPath.getTail(); tail = tail + ".smap"; WriteStream os = javaPath.getParent().lookup(tail).openWrite(); LineMapWriter writer = new LineMapWriter(os); writer.write(_lineMap); os.close(); } } public void addDepend(Path path) { addDepend(path.createDepend()); } /** * Adds a dependency based on a class. */ public void addDepend(Class cl) { addDepend(new ClassDependency(cl)); } public void addDepend(PersistentDependency depend) { if (! _depends.contains(depend)) _depends.add(depend); } public ArrayList<PersistentDependency> getDependList() { return _depends; } public boolean isStaticEncoding() { return _config.isStaticEncoding(); } public boolean getRecycleTags() { return _parseState.isRecycleTags(); } /** * Adds a new Java declaration to the list. */ public void addDeclaration(JspDeclaration decl) { _declarations.add(decl); } /** * Sets the taglib manager. */ public void setTagManager(ParseTagManager tagManager) { _tagManager = tagManager; } /** * Returns the taglib manager. */ public ParseTagManager getTagManager() { return _tagManager; } protected void init(String className) { _fullClassName = className; _className = className; String prefix = getPackagePrefix(); if (prefix.endsWith(".")) prefix = prefix.substring(0, prefix.length() - 1); int p = className.lastIndexOf('.'); if (p > 0) { _pkg = className.substring(0, p); _className = className.substring(p + 1); } else _pkg = ""; if (prefix.length() > 0 && _pkg.length() > 0) _pkg = prefix + "." + _pkg; else if (prefix.length() > 0) _pkg = prefix; _workPath = _pkg.replace('.', '/'); _lineMap = new LineMap(className.replace('.', '/') + ".java"); } /** * True if it's a declared variable. */ public boolean isDeclared(String var) { return _declaredVariables.contains(var); } /** * Adds a declared variable. */ public void addDeclared(String var) { _declaredVariables.add(var); } /** * Generates the Java code. */ protected void generate(JspJavaWriter out) throws Exception { out.setLineMap(_lineMap); generateClassHeader(out); generatePageHeader(out); _rootNode.generate(out); generatePageFooter(out); // _rootNode.generateDeclaration(out); generateClassFooter(out); } /** * Generates a static file. */ protected void generateStatic() throws Exception { _isStatic = true; Path javaPath = getGeneratedPath(); String tail = javaPath.getTail(); int p = tail.indexOf('.'); tail = tail.substring(0, p); Path staticPath = javaPath.getParent().lookup(tail + ".static"); WriteStream os = staticPath.openWrite(); //os.setEncoding(_parseState.getCharEncoding()); os.setEncoding("UTF-8"); try { JspJavaWriter out = new JspJavaWriter(os, this); _rootNode.generateStatic(out); } finally { os.close(); } Path dependPath = javaPath.getParent().lookup(tail + ".depend"); StaticPage.writeDepend(dependPath, getDependList()); } /** * Generates the class header. * * @param doc the XML document representing the JSP page. */ protected void generateClassHeader(JspJavaWriter out) throws IOException, JspParseException { out.println("/*"); out.println(" * JSP generated by " + com.caucho.Version.FULL_VERSION); out.println(" */" ); out.println(); if (_pkg != null && ! _pkg.equals("")) out.println("package " + _pkg + ";"); out.println("import javax.servlet.*;"); out.println("import javax.servlet.jsp.*;"); out.println("import javax.servlet.http.*;"); fillSingleTaglibImports(); ArrayList<String> imports = _parseState.getImportList(); for (int i = 0; i < imports.size(); i++) { String name = imports.get(i); out.print("import "); out.print(name); out.println(";"); } _parseState.addImport("javax.servlet.*"); _parseState.addImport("javax.servlet.jsp.*"); _parseState.addImport("javax.servlet.http.*"); _parseState.addImport("java.lang.*"); out.println(); if (_parseState.getExtends() != null) { //if (extendsLocation != null) //setLocation(extendsLocation.srcFilename, extendsLocation.srcLine, 0); out.print("public class "); out.print(_className); out.print(" extends "); out.print(_parseState.getExtends().getName()); out.print(" implements com.caucho.jsp.CauchoPage"); if (! _parseState.isThreadSafe()) out.print(", javax.servlet.SingleThreadModel"); } else { out.print("public class "); out.print(_className); out.print(" extends com.caucho.jsp.JavaPage"); if (! _parseState.isThreadSafe()) out.print(" implements javax.servlet.SingleThreadModel"); } out.println(); out.println("{"); out.pushDepth(); out.println("private static final java.util.HashMap<String,java.lang.reflect.Method> _jsp_functionMap = new java.util.HashMap<String,java.lang.reflect.Method>();"); out.println("private boolean _caucho_isDead;"); out.println("private com.caucho.jsp.PageManager _jsp_pageManager;"); //out.println("private com.caucho.util.FreeList<TagState> _jsp_freeState = new com.caucho.util.FreeList<TagState>(8);"); String info = _parseState.getInfo(); if (info != null) { out.println(); out.print("public String getServletInfo() { return \""); for (int i = 0; i < info.length(); i++) { char ch = info.charAt(i); if (ch == '\\') out.print("\\\\"); else if (ch == '\n') out.print("\\n"); else if (ch == '\r') out.print("\\r"); else if (ch == '"') out.print("\\\""); else out.print(ch); } out.println("\"; }"); } for (int i = 0; i < _declarations.size(); i++) { JspDeclaration decl = _declarations.get(i); out.println(); decl.generateDeclaration(out); } } /** * As a convenience, when the Tag isn't in a package, import * it automatically. */ protected void fillSingleTaglibImports() throws JspParseException { /* Iterator<Taglib> iter = _taglibMap.values().iterator(); while (iter.hasNext()) { Taglib taglib = iter.next(); if (taglib == null) continue; ArrayList<String> singleTags = taglib.getSingleTagClassNames(); for (int i = 0; i < singleTags.size(); i++) { String className = singleTags.get(i); _parseState.addImport(className); } } */ } /** * Prints the _jspService header */ protected void generatePageHeader(JspJavaWriter out) throws Exception { out.println(""); out.println("public void"); out.println("_jspService(javax.servlet.http.HttpServletRequest request,"); out.println(" javax.servlet.http.HttpServletResponse response)"); out.println(" throws java.io.IOException, javax.servlet.ServletException"); out.println("{"); out.pushDepth(); // static shouldn't start up a session boolean isSession = _parseState.isSession() && ! _rootNode.isStatic(); if (isSession) { out.println("javax.servlet.http.HttpSession session = request.getSession(true);"); } out.println("com.caucho.server.webapp.WebApp _jsp_application = _caucho_getApplication();"); out.print("com.caucho.jsp.PageContextImpl pageContext = _jsp_pageManager.allocatePageContext("); out.print("this, _jsp_application, request, response, "); if (_parseState.getErrorPage() == null) out.print("null"); else out.print("\"" + _parseState.getErrorPage() + "\""); out.print(", "); if (isSession) { out.print("session"); } else out.print("null"); out.print(", "); out.print(_parseState.getBuffer()); out.print(", "); out.print(_parseState.isAutoFlush()); out.print(", "); out.print(_parseState.isPrintNullAsBlank()); out.println(");"); out.println(); out.println("TagState _jsp_state = new TagState();"); // out.println("TagState _jsp_state = _jsp_freeState.allocate();"); //out.println("if (_jsp_state == null)"); //out.println(" _jsp_state = new TagState();"); out.println(); out.println("try {"); out.pushDepth(); if (isSession) out.println("_jspService(request, response, pageContext, _jsp_application, session, _jsp_state);"); else out.println("_jspService(request, response, pageContext, _jsp_application, _jsp_state);"); out.popDepth(); out.println("} catch (java.lang.Throwable _jsp_e) {"); out.println(" pageContext.handlePageException(_jsp_e);"); out.println("} finally {"); out.pushDepth(); //out.println("if (! _jsp_freeState.free(_jsp_state))"); out.println("_jsp_state.release();"); out.println("_jsp_pageManager.freePageContext(pageContext);"); // close finally out.popDepth(); out.println("}"); out.popDepth(); out.println("}"); // impl out.println(""); out.println("private void"); out.println("_jspService(javax.servlet.http.HttpServletRequest request,"); out.println(" javax.servlet.http.HttpServletResponse response,"); out.println(" com.caucho.jsp.PageContextImpl pageContext,"); out.println(" javax.servlet.ServletContext application,"); if (isSession) { out.println(" javax.servlet.http.HttpSession session,"); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?