📄 jspcompiler.java
字号:
throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: Unknown jsp directive '<I>" + keyAndValue[0] + "</I>'"); } } } private void parseSSI() throws StringIndexOutOfBoundsException, JSPException { String[] keyAndValue; srcPos += 12; skipWhitespace(); keyAndValue = parseKeyAndValue(); if(keyAndValue[0].equalsIgnoreCase("FILE")) { parseInclude(keyAndValue[1], false); } else if(keyAndValue[0].equalsIgnoreCase("VIRTUAL")) { parseInclude(keyAndValue[1], true); } else { throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: Unknown #INCLUDE parameter " + keyAndValue[0]); } setSrcPos(src.indexOf('>', srcPos)); srcPos++; } private void parseInclude(String value, boolean virtual) throws StringIndexOutOfBoundsException, JSPException { File prevJspFile; String s, prevSrc; int prevSrcPos, prevLineNr; prevJspFile = jspFile; prevSrc = src; prevSrcPos = srcPos; prevLineNr = lineNr; try { if(virtual) { s = servletRequest.getRealPath(value); if(s == null) throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: Virtual file " + value + " could not be mapped to a real file"); jspFile = new File(s); } else { jspFile = new File(jspFile.getParent(), value); } try { jspFile = new File(jspFile.getCanonicalPath()); } catch(IOException ioexc) { jspFile = new File(jspFile.getAbsolutePath()); } parseOneJspFile(); } finally { jspFile = prevJspFile; src = prevSrc; srcPos = prevSrcPos; lineNr = prevLineNr; } } private void parseBean() throws StringIndexOutOfBoundsException, JSPException { Properties beanAttributes; Hashtable beanDefaultProperties; Enumeration e; String[] keyAndValue; String k, v, name, varName, type, introspect, create, scope, beanName, getFromScope; int startLineNr, endLineNr, i; startLineNr = lineNr; srcPos += 5; skipWhitespace(); // gather <BEAN> tag parameters beanAttributes = new Properties(); for(;;) { // check for end of tag if(src.charAt(srcPos) == '>') { break; } keyAndValue = parseKeyAndValue(); beanAttributes.put(keyAndValue[0].toLowerCase(), keyAndValue[1]); } // gather <PARAM> tags beanDefaultProperties = new Hashtable(); for(;;) { setSrcPos(src.indexOf('<', srcPos)); if(src.substring(srcPos+1, srcPos+6).equalsIgnoreCase("/BEAN") && (Character.isWhitespace(src.charAt(srcPos+6)) || src.charAt(srcPos+6) == '>')) { // </BEAN> tag setSrcPos(src.indexOf('>', srcPos)); srcPos++; break; } else if(src.substring(srcPos+1, srcPos+6).equalsIgnoreCase("PARAM") && Character.isWhitespace(src.charAt(srcPos+6))) { // <PARAM> tag srcPos += 6; skipWhitespace(); for(;;) { // check for end of tag if(src.charAt(srcPos) == '>') { break; } keyAndValue = parseKeyAndValue(); beanDefaultProperties.put(keyAndValue[0], keyAndValue[1]); } } else { srcPos++; } } // check bean attributes name = beanAttributes.getProperty("name"); if(name == null) throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: <BEAN> tag does not have required name attribute"); varName = beanAttributes.getProperty("varname", name); type = beanAttributes.getProperty("type", "Object"); introspect = beanAttributes.getProperty("introspect", "yes"); create = beanAttributes.getProperty("create", "yes"); scope = beanAttributes.getProperty("scope", "request"); beanName = beanAttributes.getProperty("beanname", type); if(scope.equals("request")) { getFromScope = "request.getAttribute(\""; } else if(scope.equals("session")) { createSession = true; getFromScope = "__session.getValue(\""; } else { throw new JSPException("<B>" + jspFile.getPath() + ":" + lineNr + "</B>: <BEAN> tag has invalid scope attribute " + scope); } // generate bean code endLineNr = lineNr; try { // put back line number for start of <BEAN> tag lineNr = startLineNr; if(beanCode.length() == 0) { beanCode.append("\t\tjava.beans.PropertyDescriptor[] __propertyDescriptors;").append(lineSeparator); } // bean retrieval recordFileAndLineNr(beanCode); beanCode.append("\t\t").append(type).append((char) ' ').append(varName) .append(" = null;").append(lineSeparator); recordFileAndLineNr(beanCode); beanCode.append("\t\t").append("if(").append(getFromScope).append(javaStringEncode(name)) .append("\") instanceof ").append(type).append(") {").append(lineSeparator); recordFileAndLineNr(beanCode); beanCode.append("\t\t\t").append(varName).append(" = (").append(type).append(") ") .append(getFromScope).append(javaStringEncode(name)).append("\");").append(lineSeparator); beanCode.append("\t\t} else {").append(lineSeparator); if(create.equalsIgnoreCase("yes")) { // bean creation beanCode.append("\t\t\ttry {").append(lineSeparator); recordFileAndLineNr(beanCode); beanCode.append("\t\t\t\t").append(varName).append(" = (").append(type) .append(") ").append("java.beans.Beans.instantiate(this.getClass().getClassLoader(), \"") .append(beanName).append("\");").append(lineSeparator);; if(scope.equals("session")) { recordFileAndLineNr(beanCode); beanCode.append("\t\t\t\t__session.putValue(\"").append(javaStringEncode(name)).append("\", ") .append(varName).append(");").append(lineSeparator); } beanCode.append("\t\t\t} catch(java.lang.ClassNotFoundException cnfexc) {").append(lineSeparator); beanCode.append("\t\t\t\t__beanError(response, \"Could not create bean ").append(javaStringEncode(name)) .append(" of type ").append(javaStringEncode(type)).append(" (class not found)\");").append(lineSeparator); beanCode.append("\t\t\t\treturn;").append(lineSeparator); beanCode.append("\t\t\t}").append(lineSeparator); } else { recordFileAndLineNr(beanCode); beanCode.append("\t\t\t__beanError(response, \"Bean ").append(javaStringEncode(name)) .append(" does not exist or is not of type ").append(javaStringEncode(type)).append("\");").append(lineSeparator); beanCode.append("\t\t\treturn;"); } beanCode.append("\t\t}").append(lineSeparator); if(beanDefaultProperties.size() > 0 || introspect.equalsIgnoreCase("yes")) { beanCode.append("\t\ttry {").append(lineSeparator); recordFileAndLineNr(beanCode); beanCode.append("\t\t\t__propertyDescriptors = java.beans.Introspector.getBeanInfo(") .append(varName).append(".getClass()).getPropertyDescriptors();").append(lineSeparator); // set bean default properties e = beanDefaultProperties.keys(); while(e.hasMoreElements()) { k = (String) e.nextElement(); v = (String) beanDefaultProperties.get(k); recordFileAndLineNr(beanCode); beanCode.append("\t\t\tif(!__beanSetProperty(").append(varName) .append(", __propertyDescriptors, \"").append(javaStringEncode(k)) .append("\", \"").append(javaStringEncode(v)).append("\")) {").append(lineSeparator); beanCode.append("\t\t\t\t__beanError(response, \"Bean ").append(javaStringEncode(name)) .append(" of type").append(javaStringEncode(type)).append(" has no property named ") .append(javaStringEncode(k)).append("\");").append(lineSeparator); beanCode.append("\t\t\t\treturn;").append(lineSeparator); beanCode.append("\t\t\t}").append(lineSeparator); } // do bean introspection if(introspect.equalsIgnoreCase("yes")) { recordFileAndLineNr(beanCode); beanCode.append("\t\t\t__beanIntrospect(").append(varName) .append(", __propertyDescriptors, request);").append(lineSeparator); } beanCode.append("\t\t} catch(java.beans.IntrospectionException introexc) {").append(lineSeparator); beanCode.append("\t\t\t__beanError(response, \"Introspection failed for bean ") .append(javaStringEncode(name)).append(" of type ").append(javaStringEncode(type)) .append("\");").append(lineSeparator); beanCode.append("\t\t}").append(lineSeparator); } beanCode.append(lineSeparator); } finally { lineNr = endLineNr; } } private String[] parseKeyAndValue() throws StringIndexOutOfBoundsException { char c; int pos; String[] keyAndValue = new String[2]; // gather key pos = srcPos; for(;;) { c = src.charAt(srcPos); if(c == '=' || Character.isWhitespace(c)) { break; } srcPos++; } keyAndValue[0] = src.substring(pos, srcPos);
skipWhitespace();
// quick work around page processing
if ("page".equals(keyAndValue[0])) return parseKeyAndValue();
// gather optional value if(src.charAt(srcPos) == '=') { srcPos++; skipWhitespace(); c = src.charAt(srcPos); if(c == '\'' || c == '\"') { pos = src.indexOf(c, srcPos+1); keyAndValue[1] = src.substring(srcPos+1, pos); setSrcPos(pos+1); } else { pos = srcPos; for(;;) { c = src.charAt(srcPos); if(c == '%' || c == '>' || Character.isWhitespace(c)) { break; } srcPos++; } keyAndValue[1] = src.substring(pos, srcPos); } skipWhitespace(); } else { keyAndValue[1] = keyAndValue[0]; } return keyAndValue; } private void changeParseState(int newState) { if(newState == parseState) return; switch(parseState) { case PARSE_HTML: scriptletsCode.append("\");").append(lineSeparator); break; case PARSE_EXPRESSION: scriptletsCode.append("));").append(lineSeparator); break; case PARSE_DECLARATION: declarationsCode.append(lineSeparator); break; case PARSE_SCRIPTLET: scriptletsCode.append(lineSeparator); break; } parseState = newState; switch(parseState) { case PARSE_HTML: recordFileAndLineNr(scriptletsCode); scriptletsCode.append("\t\t\tout.print(\""); break; case PARSE_EXPRESSION: recordFileAndLineNr(scriptletsCode); scriptletsCode.append("\t\t\tout.print(__valueOf("); break; case PARSE_DECLARATION: recordFileAndLineNr(declarationsCode); break; case PARSE_SCRIPTLET: recordFileAndLineNr(scriptletsCode); break; } } private void recordFileAndLineNr(StringBuffer code) { // FIXME: do nice encoding of backslashes in filename code.append("//line " + jspFile.toString().replace('\\', '/') + ":" + lineNr).append(lineSeparator); } private void skipWhitespace() { char c; for(;;) { c = src.charAt(srcPos); if(!Character.isWhitespace(c)) { break; } else if(c == '\n') { lineNr++; } srcPos++; } } private void setSrcPos(int newSrcPos) { int from; if(newSrcPos < 0 || newSrcPos >= src.length()) throw new StringIndexOutOfBoundsException(Integer.toString(newSrcPos)); from = srcPos-1; for(;;) { from = src.indexOf('\n', from+1); if(from == -1 || from >= newSrcPos) { break; } lineNr++; } srcPos = newSrcPos; } private void generateJavaFile() throws JSPException { PrintWriter out; Enumeration e; File f; String pn, cn; Long l; int i; try { f = new File(javaFile.getParent()); f.mkdirs(); out = new PrintWriter(new FileWriter(javaFile)); i = className.lastIndexOf('.'); if(i > 0) { pn = className.substring(0, i); cn = className.substring(i+1); } else { pn = null; cn = className; } try { // generate header and start of class out.println("/* Automatically generated by GNUJSP. Do not edit. */"); if(pn != null) { out.println("package " + pn + ";"); } out.println(importDirective); out.println("public final class " + cn + " extends " + extendsDirective + implementsDirective); out.println("{"); // generate declarations out.println(declarationsCode); // generate specified method out.println("\tpublic void " + methodDirective + "(javax.servlet.http.HttpServletRequest request, " + "javax.servlet.http.HttpServletResponse response) " + "throws javax.servlet.ServletException, java.io.IOException"); out.println("\t{"); if(createSession) { out.println("\t\tjavax.servlet.http.HttpSession __session = request.getSession(true);"); } out.println(beanCode); out.println("\t\tresponse.setContentType(\"" + javaStringEncode(content_typeDirective) + "\");"); out.println("\t\tjava.io.PrintWriter out = response.getWriter();"); out.println("\t\ttry {"); out.println(scriptletsCode); out.println("\t\t} finally {"); out.println("\t\t\tout.flush();"); out.println("\t\t\tout.close();"); out.println("\t\t}"); out.println("\t}"); out.println(); // generate own version of String.valueOf() out.println("\tprivate static java.lang.String __valueOf(java.lang.Object obj) {"); out.println("\t\tif(obj == null) {"); out.println("\t\t\treturn \"\";"); out.println("\t\t} else {"); out.println("\t\t\treturn obj.toString();"); out.println("\t\t}"); out.println("\t}"); out.println("\tprivate static java.lang.String __valueOf(boolean b) { return java.lang.String.valueOf(b); }"); out.println("\tprivate static java.lang.String __valueOf(char c) { return java.lang.String.valueOf(c); }"); out.println("\tprivate static java.lang.String __valueOf(int i) { return java.lang.String.valueOf(i); }");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -