- 浏览: 363888 次
- 性别:
- 来自: 广东珠海
文章分类
最新评论
-
cuiyijing:
[size=small]马士兵 26_homework_dml ...
SQL面试题 -
utobe:
兄弟 你真的出名了,尚学堂 oracle 马士兵的视频拿你的题 ...
SQL面试题 -
tlqtangok:
没看懂,能解释一下吗?
安装Oracle后java的jvm会报错 -
a114d:
itling 写道尚学堂的demo楼上威武
hibernate 全面学习【hibernate抓取策略 】 -
wohenshuaiba:
不错,但是没写return checkimg( this ); ...
图片上传
深入Jsp原理之《手动编译jsp文件解析视频教程》
1.为什么要手工编译Jsp文件 ?
学习Java,深入理解其技术原理!!!
便于布署,编译为class文件,或打为war包。
理解jsp 到 servlet 的过程
2.编译时需要用到的类库:
jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;catalina-ant.jar;jasper-el.jar;jasper-jdt.jar;
tomcat-juli.jar;jsp-api.jar;
以上类库一般在bin、lib目录下。
我们将需要的类库考入lib下
编译类:jasper.jar中的org.apache.jasper.JspC类
可能少了ant包,需要下载!
3.编译参数:
编译参数说明:
-compile 表示要编译生成的java文件
-d ./ 定义输出的路径为当前目录
-p netjava.cn :定义包名为netjava
-d classes :编译后存放目录
-javaEncoding GBK :编码为GBK
-webapp webapp:编译webapp目录下的jsp
执行命令:
java -cp jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;catalina-ant.jar;jasper-el.jar;jasper-jdt.jar;
tomcat-juli.jar;jsp-api.jar;ant.jar org.apache.jasper.JspC
4.编写一个测试jsp文件进行编译
首先,编写测试用jsp文件:netjava.jsp;
下lib(放了以上类库)的目录下,新建一个webapp目录,将netjava.jsp拷入;
执行完整的编译命令:
java -cp jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;ant.jar;catalina-ant.jar;jasper-el.jar;
jasper-jdt.jar;tomcat-juli.jar;jsp-api.jar; org.apache.jasper.JspC -webapp webapp -uriroot
webapp -compile -webxml web.xml -d classes -javaEncoding GBK -p netjava.cn
结果:
生成web.xml文件和classes目录.
5.在tomcat的webapps下新建一个目录,netjava(不一定要同名)
在其下新建WEB-INF目录,将上面生成的web.xml和classes目录考入
6.OK,在IE里测试下!(根据web.xml中配置的servlet名)
一般是http://localhost:8080/netjava/netjava.jsp
7.打war包:
在netjava目录下执行:
jar -cvf netjavacompile.war -c WEB-INF\
将生成的war入到webapps下,服务器会自动加载
1.为什么要手工编译Jsp文件 ?
学习Java,深入理解其技术原理!!!
便于布署,编译为class文件,或打为war包。
理解jsp 到 servlet 的过程
2.编译时需要用到的类库:
jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;catalina-ant.jar;jasper-el.jar;jasper-jdt.jar;
tomcat-juli.jar;jsp-api.jar;
以上类库一般在bin、lib目录下。
我们将需要的类库考入lib下
编译类:jasper.jar中的org.apache.jasper.JspC类
public class JspC implements Options { public static final String DEFAULT_IE_CLASS_ID = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"; // Logger protected static Log log = LogFactory.getLog(JspC.class); protected static final String SWITCH_VERBOSE = "-v"; protected static final String SWITCH_HELP = "-help"; protected static final String SWITCH_OUTPUT_DIR = "-d"; protected static final String SWITCH_PACKAGE_NAME = "-p"; protected static final String SWITCH_CACHE = "-cache"; protected static final String SWITCH_CLASS_NAME = "-c"; protected static final String SWITCH_FULL_STOP = "--"; protected static final String SWITCH_COMPILE = "-compile"; protected static final String SWITCH_SOURCE = "-source"; protected static final String SWITCH_TARGET = "-target"; protected static final String SWITCH_URI_BASE = "-uribase"; protected static final String SWITCH_URI_ROOT = "-uriroot"; protected static final String SWITCH_FILE_WEBAPP = "-webapp"; protected static final String SWITCH_WEBAPP_INC = "-webinc"; protected static final String SWITCH_WEBAPP_XML = "-webxml"; protected static final String SWITCH_MAPPED = "-mapped"; protected static final String SWITCH_XPOWERED_BY = "-xpoweredBy"; protected static final String SWITCH_TRIM_SPACES = "-trimSpaces"; protected static final String SWITCH_CLASSPATH = "-classpath"; protected static final String SWITCH_DIE = "-die"; protected static final String SWITCH_POOLING = "-poolingEnabled"; protected static final String SWITCH_ENCODING = "-javaEncoding"; protected static final String SWITCH_SMAP = "-smap"; protected static final String SWITCH_DUMP_SMAP = "-dumpsmap"; protected static final String SHOW_SUCCESS ="-s"; protected static final String LIST_ERRORS = "-l"; protected static final int INC_WEBXML = 10; protected static final int ALL_WEBXML = 20; protected static final int DEFAULT_DIE_LEVEL = 1; protected static final int NO_DIE_LEVEL = 0; protected static final String[] insertBefore = { "</web-app>", "<servlet-mapping>", "<session-config>", "<mime-mapping>", "<welcome-file-list>", "<error-page>", "<taglib>", "<resource-env-ref>", "<resource-ref>", "<security-constraint>", "<login-config>", "<security-role>", "<env-entry>", "<ejb-ref>", "<ejb-local-ref>" }; protected static int die; protected String classPath = null; protected URLClassLoader loader = null; protected boolean trimSpaces = false; protected boolean genStringAsCharArray = false; protected boolean xpoweredBy; protected boolean mappedFile = false; protected boolean poolingEnabled = true; protected File scratchDir; protected String ieClassId = DEFAULT_IE_CLASS_ID; protected String targetPackage; protected String targetClassName; protected String uriBase; protected String uriRoot; protected Project project; protected int dieLevel; protected boolean helpNeeded = false; protected boolean compile = false; protected boolean smapSuppressed = true; protected boolean smapDumped = false; protected boolean caching = true; protected Map cache = new HashMap(); protected String compiler = null; protected String compilerTargetVM = "1.4"; protected String compilerSourceVM = "1.4"; protected boolean classDebugInfo = true; /** * Throw an exception if there's a compilation error, or swallow it. * Default is true to preserve old behavior. */ protected boolean failOnError = true; /** * The file extensions to be handled as JSP files. * Default list is .jsp and .jspx. */ protected List extensions; /** * The pages. */ protected List pages = new Vector(); /** * Needs better documentation, this data member does. * True by default. */ protected boolean errorOnUseBeanInvalidClassAttribute = true; /** * The java file encoding. Default * is UTF-8. Added per bugzilla 19622. */ protected String javaEncoding = "UTF-8"; // Generation of web.xml fragments protected String webxmlFile; protected int webxmlLevel; protected boolean addWebXmlMappings = false; protected Writer mapout; protected CharArrayWriter servletout; protected CharArrayWriter mappingout; /** * The servlet context. */ protected JspCServletContext context; /** * The runtime context. * Maintain a dummy JspRuntimeContext for compiling tag files. */ protected JspRuntimeContext rctxt; /** * Cache for the TLD locations */ protected TldLocationsCache tldLocationsCache = null; protected JspConfig jspConfig = null; protected TagPluginManager tagPluginManager = null; protected boolean verbose = false; protected boolean listErrors = false; protected boolean showSuccess = false; protected int argPos; protected boolean fullstop = false; protected String args[]; public static void main(String arg[]) { if (arg.length == 0) { System.out.println(Localizer.getMessage("jspc.usage")); } else { try { JspC jspc = new JspC(); jspc.setArgs(arg); if (jspc.helpNeeded) { System.out.println(Localizer.getMessage("jspc.usage")); } else { jspc.execute(); } } catch (JasperException je) { System.err.println(je); if (die != NO_DIE_LEVEL) { System.exit(die); } } } } public void setArgs(String[] arg) throws JasperException { args = arg; String tok; dieLevel = NO_DIE_LEVEL; die = dieLevel; while ((tok = nextArg()) != null) { if (tok.equals(SWITCH_VERBOSE)) { verbose = true; showSuccess = true; listErrors = true; } else if (tok.equals(SWITCH_OUTPUT_DIR)) { tok = nextArg(); setOutputDir( tok ); } else if (tok.equals(SWITCH_PACKAGE_NAME)) { targetPackage = nextArg(); } else if (tok.equals(SWITCH_COMPILE)) { compile=true; } else if (tok.equals(SWITCH_CLASS_NAME)) { targetClassName = nextArg(); } else if (tok.equals(SWITCH_URI_BASE)) { uriBase=nextArg(); } else if (tok.equals(SWITCH_URI_ROOT)) { setUriroot( nextArg()); } else if (tok.equals(SWITCH_FILE_WEBAPP)) { setUriroot( nextArg()); } else if ( tok.equals( SHOW_SUCCESS ) ) { showSuccess = true; } else if ( tok.equals( LIST_ERRORS ) ) { listErrors = true; } else if (tok.equals(SWITCH_WEBAPP_INC)) { webxmlFile = nextArg(); if (webxmlFile != null) { webxmlLevel = INC_WEBXML; } } else if (tok.equals(SWITCH_WEBAPP_XML)) { webxmlFile = nextArg(); if (webxmlFile != null) { webxmlLevel = ALL_WEBXML; } } else if (tok.equals(SWITCH_MAPPED)) { mappedFile = true; } else if (tok.equals(SWITCH_XPOWERED_BY)) { xpoweredBy = true; } else if (tok.equals(SWITCH_TRIM_SPACES)) { setTrimSpaces(true); } else if (tok.equals(SWITCH_CACHE)) { tok = nextArg(); if ("false".equals(tok)) { caching = false; } else { caching = true; } } else if (tok.equals(SWITCH_CLASSPATH)) { setClassPath(nextArg()); } else if (tok.startsWith(SWITCH_DIE)) { try { dieLevel = Integer.parseInt( tok.substring(SWITCH_DIE.length())); } catch (NumberFormatException nfe) { dieLevel = DEFAULT_DIE_LEVEL; } die = dieLevel; } else if (tok.equals(SWITCH_HELP)) { helpNeeded = true; } else if (tok.equals(SWITCH_POOLING)) { tok = nextArg(); if ("false".equals(tok)) { poolingEnabled = false; } else { poolingEnabled = true; } } else if (tok.equals(SWITCH_ENCODING)) { setJavaEncoding(nextArg()); } else if (tok.equals(SWITCH_SOURCE)) { setCompilerSourceVM(nextArg()); } else if (tok.equals(SWITCH_TARGET)) { setCompilerTargetVM(nextArg()); } else if (tok.equals(SWITCH_SMAP)) { smapSuppressed = false; } else if (tok.equals(SWITCH_DUMP_SMAP)) { smapDumped = true; } else { if (tok.startsWith("-")) { throw new JasperException("Unrecognized option: " + tok + ". Use -help for help."); } if (!fullstop) { argPos--; } // Start treating the rest as JSP Pages break; } } // Add all extra arguments to the list of files while( true ) { String file = nextFile(); if( file==null ) { break; } pages.add( file ); } } public boolean getKeepGenerated() { // isn't this why we are running jspc? return true; } public boolean getTrimSpaces() { return trimSpaces; } public void setTrimSpaces(boolean ts) { this.trimSpaces = ts; } public boolean isPoolingEnabled() { return poolingEnabled; } public void setPoolingEnabled(boolean poolingEnabled) { this.poolingEnabled = poolingEnabled; } public boolean isXpoweredBy() { return xpoweredBy; } public void setXpoweredBy(boolean xpoweredBy) { this.xpoweredBy = xpoweredBy; } public boolean getDisplaySourceFragment() { return true; } public boolean getErrorOnUseBeanInvalidClassAttribute() { return errorOnUseBeanInvalidClassAttribute; } public void setErrorOnUseBeanInvalidClassAttribute(boolean b) { errorOnUseBeanInvalidClassAttribute = b; } public int getTagPoolSize() { return Constants.MAX_POOL_SIZE; } /** * Are we supporting HTML mapped servlets? */ public boolean getMappedFile() { return mappedFile; } // Off-line compiler, no need for security manager public Object getProtectionDomain() { return null; } /** * @deprecated */ @Deprecated public boolean getSendErrorToClient() { return true; } public void setClassDebugInfo( boolean b ) { classDebugInfo=b; } public boolean getClassDebugInfo() { // compile with debug info return classDebugInfo; } /** * @see Options#isCaching() */ public boolean isCaching() { return caching; } /** * @see Options#isCaching() */ public void setCaching(boolean caching) { this.caching = caching; } /** * @see Options#getCache() */ public Map getCache() { return cache; } /** * Background compilation check intervals in seconds */ public int getCheckInterval() { return 0; } /** * Modification test interval. */ public int getModificationTestInterval() { return 0; } /** * Is Jasper being used in development mode? */ public boolean getDevelopment() { return false; } /** * Is the generation of SMAP info for JSR45 debuggin suppressed? */ public boolean isSmapSuppressed() { return smapSuppressed; } /** * Set smapSuppressed flag. */ public void setSmapSuppressed(boolean smapSuppressed) { this.smapSuppressed = smapSuppressed; } /** * Should SMAP info for JSR45 debugging be dumped to a file? */ public boolean isSmapDumped() { return smapDumped; } /** * Set smapSuppressed flag. */ public void setSmapDumped(boolean smapDumped) { this.smapDumped = smapDumped; } /** * Determines whether text strings are to be generated as char arrays, * which improves performance in some cases. * * @param genStringAsCharArray true if text strings are to be generated as * char arrays, false otherwise */ public void setGenStringAsCharArray(boolean genStringAsCharArray) { this.genStringAsCharArray = genStringAsCharArray; } /** * Indicates whether text strings are to be generated as char arrays. * * @return true if text strings are to be generated as char arrays, false * otherwise */ public boolean genStringAsCharArray() { return genStringAsCharArray; } /** * Sets the class-id value to be sent to Internet Explorer when using * <jsp:plugin> tags. * * @param ieClassId Class-id value */ public void setIeClassId(String ieClassId) { this.ieClassId = ieClassId; } /** * Gets the class-id value that is sent to Internet Explorer when using * <jsp:plugin> tags. * * @return Class-id value */ public String getIeClassId() { return ieClassId; } public File getScratchDir() { return scratchDir; } public Class getJspCompilerPlugin() { // we don't compile, so this is meanlingless return null; } public String getJspCompilerPath() { // we don't compile, so this is meanlingless return null; } /** * Compiler to use. */ public String getCompiler() { return compiler; } public void setCompiler(String c) { compiler=c; } /** * Compiler class name to use. */ public String getCompilerClassName() { return null; } /** * @see Options#getCompilerTargetVM */ public String getCompilerTargetVM() { return compilerTargetVM; } public void setCompilerTargetVM(String vm) { compilerTargetVM = vm; } /** * @see Options#getCompilerSourceVM() */ public String getCompilerSourceVM() { return compilerSourceVM; } /** * @see Options#getCompilerSourceVM() */ public void setCompilerSourceVM(String vm) { compilerSourceVM = vm; } public TldLocationsCache getTldLocationsCache() { return tldLocationsCache; } /** * Returns the encoding to use for * java files. The default is UTF-8. * * @return String The encoding */ public String getJavaEncoding() { return javaEncoding; } /** * Sets the encoding to use for * java files. * * @param encodingName The name, e.g. "UTF-8" */ public void setJavaEncoding(String encodingName) { javaEncoding = encodingName; } public boolean getFork() { return false; } public String getClassPath() { if( classPath != null ) return classPath; return System.getProperty("java.class.path"); } public void setClassPath(String s) { classPath=s; } /** * Returns the list of file extensions * that are treated as JSP files. * * @return The list of extensions */ public List getExtensions() { return extensions; } /** * Adds the given file extension to the * list of extensions handled as JSP files. * * @param extension The extension to add, e.g. "myjsp" */ protected void addExtension(final String extension) { if(extension != null) { if(extensions == null) { extensions = new Vector(); } extensions.add(extension); } } /** * Sets the project. * * @param theProject The project */ public void setProject(final Project theProject) { project = theProject; } /** * Returns the project: may be null if not running * inside an Ant project. * * @return The project */ public Project getProject() { return project; } /** * Base dir for the webapp. Used to generate class names and resolve * includes */ public void setUriroot( String s ) { if( s==null ) { uriRoot = s; return; } try { uriRoot = resolveFile(s).getCanonicalPath(); } catch( Exception ex ) { uriRoot = s; } } /** * Parses comma-separated list of JSP files to be processed. If the argument * is null, nothing is done. * * <p>Each file is interpreted relative to uriroot, unless it is absolute, * in which case it must start with uriroot.</p> * * @param jspFiles Comma-separated list of JSP files to be processed */ public void setJspFiles(final String jspFiles) { if(jspFiles == null) { return; } StringTokenizer tok = new StringTokenizer(jspFiles, ","); while (tok.hasMoreTokens()) { pages.add(tok.nextToken()); } } /** * Sets the compile flag. * * @param b Flag value */ public void setCompile( final boolean b ) { compile = b; } /** * Sets the verbosity level. The actual number doesn't * matter: if it's greater than zero, the verbose flag will * be true. * * @param level Positive means verbose */ public void setVerbose( final int level ) { if (level > 0) { verbose = true; showSuccess = true; listErrors = true; } } public void setValidateXml( boolean b ) { org.apache.jasper.xmlparser.ParserUtils.validating=b; } public void setListErrors( boolean b ) { listErrors = b; } public void setOutputDir( String s ) { if( s!= null ) { scratchDir = resolveFile(s).getAbsoluteFile(); } else { scratchDir=null; } } public void setPackage( String p ) { targetPackage=p; } /** * Class name of the generated file ( without package ). * Can only be used if a single file is converted. * XXX Do we need this feature ? */ public void setClassName( String p ) { targetClassName=p; } /** * File where we generate a web.xml fragment with the class definitions. */ public void setWebXmlFragment( String s ) { webxmlFile=resolveFile(s).getAbsolutePath(); webxmlLevel=INC_WEBXML; } /** * File where we generate a complete web.xml with the class definitions. */ public void setWebXml( String s ) { webxmlFile=resolveFile(s).getAbsolutePath(); webxmlLevel=ALL_WEBXML; } public void setAddWebXmlMappings(boolean b) { addWebXmlMappings = b; } /** * Set the option that throws an exception in case of a compilation error. */ public void setFailOnError(final boolean b) { failOnError = b; } public boolean getFailOnError() { return failOnError; } /** * Obtain JSP configuration informantion specified in web.xml. */ public JspConfig getJspConfig() { return jspConfig; } public TagPluginManager getTagPluginManager() { return tagPluginManager; } public void generateWebMapping( String file, JspCompilationContext clctxt ) throws IOException { if (log.isDebugEnabled()) { log.debug("Generating web mapping for file " + file + " using compilation context " + clctxt); } String className = clctxt.getServletClassName(); String packageName = clctxt.getServletPackageName(); String thisServletName; if ("".equals(packageName)) { thisServletName = className; } else { thisServletName = packageName + '.' + className; } if (servletout != null) { servletout.write("\n <servlet>\n <servlet-name>"); servletout.write(thisServletName); servletout.write("</servlet-name>\n <servlet-class>"); servletout.write(thisServletName); servletout.write("</servlet-class>\n </servlet>\n"); } if (mappingout != null) { mappingout.write("\n <servlet-mapping>\n <servlet-name>"); mappingout.write(thisServletName); mappingout.write("</servlet-name>\n <url-pattern>"); mappingout.write(file.replace('\\', '/')); mappingout.write("</url-pattern>\n </servlet-mapping>\n"); } } /** * Include the generated web.xml inside the webapp's web.xml. */ protected void mergeIntoWebXml() throws IOException { File webappBase = new File(uriRoot); File webXml = new File(webappBase, "WEB-INF/web.xml"); File webXml2 = new File(webappBase, "WEB-INF/web2.xml"); String insertStartMarker = Localizer.getMessage("jspc.webinc.insertStart"); String insertEndMarker = Localizer.getMessage("jspc.webinc.insertEnd"); BufferedReader reader = new BufferedReader(new FileReader(webXml)); BufferedReader fragmentReader = new BufferedReader(new FileReader(webxmlFile)); PrintWriter writer = new PrintWriter(new FileWriter(webXml2)); // Insert the <servlet> and <servlet-mapping> declarations int pos = -1; String line = null; while (true) { line = reader.readLine(); if (line == null) { break; } // Skip anything previously generated by JSPC if (line.indexOf(insertStartMarker) >= 0) { while (true) { line = reader.readLine(); if (line == null) { return; } if (line.indexOf(insertEndMarker) >= 0) { line = reader.readLine(); line = reader.readLine(); if (line == null) { return; } break; } } } for (int i = 0; i < insertBefore.length; i++) { pos = line.indexOf(insertBefore[i]); if (pos >= 0) break; } if (pos >= 0) { writer.print(line.substring(0, pos)); break; } else { writer.println(line); } } writer.println(insertStartMarker); while (true) { String line2 = fragmentReader.readLine(); if (line2 == null) { writer.println(); break; } writer.println(line2); } writer.println(insertEndMarker); writer.println(); for (int i = 0; i < pos; i++) { writer.print(" "); } writer.println(line.substring(pos)); while (true) { line = reader.readLine(); if (line == null) { break; } writer.println(line); } writer.close(); reader.close(); fragmentReader.close(); FileInputStream fis = new FileInputStream(webXml2); FileOutputStream fos = new FileOutputStream(webXml); byte buf[] = new byte[512]; while (true) { int n = fis.read(buf); if (n < 0) { break; } fos.write(buf, 0, n); } fis.close(); fos.close(); webXml2.delete(); (new File(webxmlFile)).delete(); } protected void processFile(String file) throws JasperException { if (log.isDebugEnabled()) { log.debug("Processing file: " + file); } ClassLoader originalClassLoader = null; try { // set up a scratch/output dir if none is provided if (scratchDir == null) { String temp = System.getProperty("java.io.tmpdir"); if (temp == null) { temp = ""; } scratchDir = new File(new File(temp).getAbsolutePath()); } String jspUri=file.replace('\\','/'); JspCompilationContext clctxt = new JspCompilationContext ( jspUri, false, this, context, null, rctxt ); /* Override the defaults */ if ((targetClassName != null) && (targetClassName.length() > 0)) { clctxt.setServletClassName(targetClassName); targetClassName = null; } if (targetPackage != null) { clctxt.setServletPackageName(targetPackage); } originalClassLoader = Thread.currentThread().getContextClassLoader(); if( loader==null ) { initClassLoader( clctxt ); } Thread.currentThread().setContextClassLoader(loader); clctxt.setClassLoader(loader); clctxt.setClassPath(classPath); Compiler clc = clctxt.createCompiler(); // If compile is set, generate both .java and .class, if // .jsp file is newer than .class file; // Otherwise only generate .java, if .jsp file is newer than // the .java file if( clc.isOutDated(compile) ) { if (log.isDebugEnabled()) { log.debug(jspUri + " is out dated, compiling..."); } clc.compile(compile, true); } // Generate mapping generateWebMapping( file, clctxt ); if ( showSuccess ) { log.info( "Built File: " + file ); } } catch (JasperException je) { Throwable rootCause = je; while (rootCause instanceof JasperException && ((JasperException) rootCause).getRootCause() != null) { rootCause = ((JasperException) rootCause).getRootCause(); } if (rootCause != je) { log.error(Localizer.getMessage("jspc.error.generalException", file), rootCause); } // Bugzilla 35114. if(getFailOnError()) { throw je; } else { log.error(je.getMessage()); } } catch (Exception e) { if ((e instanceof FileNotFoundException) && log.isWarnEnabled()) { log.warn(Localizer.getMessage("jspc.error.fileDoesNotExist", e.getMessage())); } throw new JasperException(e); } finally { if(originalClassLoader != null) { Thread.currentThread().setContextClassLoader(originalClassLoader); } } } /** * Locate all jsp files in the webapp. Used if no explicit * jsps are specified. */ public void scanFiles( File base ) throws JasperException { Stack<String> dirs = new Stack<String>(); dirs.push(base.toString()); // Make sure default extensions are always included if ((getExtensions() == null) || (getExtensions().size() < 2)) { addExtension("jsp"); addExtension("jspx"); } while (!dirs.isEmpty()) { String s = dirs.pop(); File f = new File(s); if (f.exists() && f.isDirectory()) { String[] files = f.list(); String ext; for (int i = 0; (files != null) && i < files.length; i++) { File f2 = new File(s, files[i]); if (f2.isDirectory()) { dirs.push(f2.getPath()); } else { String path = f2.getPath(); String uri = path.substring(uriRoot.length()); ext = files[i].substring(files[i].lastIndexOf('.') +1); if (getExtensions().contains(ext) || jspConfig.isJspPage(uri)) { pages.add(path); } } } } } } /** * Executes the compilation. * * @throws JasperException If an error occurs */ public void execute() throws JasperException { if(log.isDebugEnabled()) { log.debug("execute() starting for " + pages.size() + " pages."); } try { if (uriRoot == null) { if( pages.size() == 0 ) { throw new JasperException( Localizer.getMessage("jsp.error.jspc.missingTarget")); } String firstJsp = (String) pages.get( 0 ); File firstJspF = new File( firstJsp ); if (!firstJspF.exists()) { throw new JasperException( Localizer.getMessage("jspc.error.fileDoesNotExist", firstJsp)); } locateUriRoot( firstJspF ); } if (uriRoot == null) { throw new JasperException( Localizer.getMessage("jsp.error.jspc.no_uriroot")); } if( context==null ) { initServletContext(); } // No explicit pages, we'll process all .jsp in the webapp if (pages.size() == 0) { scanFiles( new File( uriRoot )); } File uriRootF = new File(uriRoot); if (!uriRootF.exists() || !uriRootF.isDirectory()) { throw new JasperException( Localizer.getMessage("jsp.error.jspc.uriroot_not_dir")); } initWebXml(); Iterator iter = pages.iterator(); while (iter.hasNext()) { String nextjsp = iter.next().toString(); File fjsp = new File(nextjsp); if (!fjsp.isAbsolute()) { fjsp = new File(uriRootF, nextjsp); } if (!fjsp.exists()) { if (log.isWarnEnabled()) { log.warn (Localizer.getMessage ("jspc.error.fileDoesNotExist", fjsp.toString())); } continue; } String s = fjsp.getAbsolutePath(); if (s.startsWith(uriRoot)) { nextjsp = s.substring(uriRoot.length()); } if (nextjsp.startsWith("." + File.separatorChar)) { nextjsp = nextjsp.substring(2); } processFile(nextjsp); } completeWebXml(); if (addWebXmlMappings) { mergeIntoWebXml(); } } catch (IOException ioe) { throw new JasperException(ioe); } catch (JasperException je) { Throwable rootCause = je; while (rootCause instanceof JasperException && ((JasperException) rootCause).getRootCause() != null) { rootCause = ((JasperException) rootCause).getRootCause(); } if (rootCause != je) { rootCause.printStackTrace(); } throw je; } finally { if (loader != null) { LogFactory.release(loader); } } } // ==================== protected utility methods ==================== protected String nextArg() { if ((argPos >= args.length) || (fullstop = SWITCH_FULL_STOP.equals(args[argPos]))) { return null; } else { return args[argPos++]; } } protected String nextFile() { if (fullstop) argPos++; if (argPos >= args.length) { return null; } else { return args[argPos++]; } } protected void initWebXml() { try { if (webxmlLevel >= INC_WEBXML) { File fmapings = new File(webxmlFile); mapout = new FileWriter(fmapings); servletout = new CharArrayWriter(); mappingout = new CharArrayWriter(); } else { mapout = null; servletout = null; mappingout = null; } if (webxmlLevel >= ALL_WEBXML) { mapout.write(Localizer.getMessage("jspc.webxml.header")); mapout.flush(); } else if ((webxmlLevel>= INC_WEBXML) && !addWebXmlMappings) { mapout.write(Localizer.getMessage("jspc.webinc.header")); mapout.flush(); } } catch (IOException ioe) { mapout = null; servletout = null; mappingout = null; } } protected void completeWebXml() { if (mapout != null) { try { servletout.writeTo(mapout); mappingout.writeTo(mapout); if (webxmlLevel >= ALL_WEBXML) { mapout.write(Localizer.getMessage("jspc.webxml.footer")); } else if ((webxmlLevel >= INC_WEBXML) && !addWebXmlMappings) { mapout.write(Localizer.getMessage("jspc.webinc.footer")); } mapout.close(); } catch (IOException ioe) { // noting to do if it fails since we are done with it } } } protected void initServletContext() { try { context =new JspCServletContext (new PrintWriter(System.out), new URL("file:" + uriRoot.replace('\\','/') + '/')); tldLocationsCache = new TldLocationsCache(context, true); } catch (MalformedURLException me) { System.out.println("**" + me); } rctxt = new JspRuntimeContext(context, this); jspConfig = new JspConfig(context); tagPluginManager = new TagPluginManager(context); } /** * Initializes the classloader as/if needed for the given * compilation context. * * @param clctxt The compilation context * @throws IOException If an error occurs */ protected void initClassLoader(JspCompilationContext clctxt) throws IOException { classPath = getClassPath(); ClassLoader jspcLoader = getClass().getClassLoader(); if (jspcLoader instanceof AntClassLoader) { classPath += File.pathSeparator + ((AntClassLoader) jspcLoader).getClasspath(); } // Turn the classPath into URLs ArrayList<URL> urls = new ArrayList<URL>(); StringTokenizer tokenizer = new StringTokenizer(classPath, File.pathSeparator); while (tokenizer.hasMoreTokens()) { String path = tokenizer.nextToken(); try { File libFile = new File(path); urls.add(libFile.toURL()); } catch (IOException ioe) { // Failing a toCanonicalPath on a file that // exists() should be a JVM regression test, // therefore we have permission to freak uot throw new RuntimeException(ioe.toString()); } } File webappBase = new File(uriRoot); if (webappBase.exists()) { File classes = new File(webappBase, "/WEB-INF/classes"); try { if (classes.exists()) { classPath = classPath + File.pathSeparator + classes.getCanonicalPath(); urls.add(classes.getCanonicalFile().toURL()); } } catch (IOException ioe) { // failing a toCanonicalPath on a file that // exists() should be a JVM regression test, // therefore we have permission to freak out throw new RuntimeException(ioe.toString()); } File lib = new File(webappBase, "/WEB-INF/lib"); if (lib.exists() && lib.isDirectory()) { String[] libs = lib.list(); for (int i = 0; i < libs.length; i++) { if( libs[i].length() <5 ) continue; String ext=libs[i].substring( libs[i].length() - 4 ); if (! ".jar".equalsIgnoreCase(ext)) { if (".tld".equalsIgnoreCase(ext)) { log.warn("TLD files should not be placed in " + "/WEB-INF/lib"); } continue; } try { File libFile = new File(lib, libs[i]); classPath = classPath + File.pathSeparator + libFile.getAbsolutePath(); urls.add(libFile.getAbsoluteFile().toURL()); } catch (IOException ioe) { // failing a toCanonicalPath on a file that // exists() should be a JVM regression test, // therefore we have permission to freak out throw new RuntimeException(ioe.toString()); } } } } // What is this ?? urls.add(new File(clctxt.getRealPath("/")).getCanonicalFile().toURL()); URL urlsA[]=new URL[urls.size()]; urls.toArray(urlsA); loader = new URLClassLoader(urlsA, this.getClass().getClassLoader()); } /** * Find the WEB-INF dir by looking up in the directory tree. * This is used if no explicit docbase is set, but only files. * XXX Maybe we should require the docbase. */ protected void locateUriRoot( File f ) { String tUriBase = uriBase; if (tUriBase == null) { tUriBase = "/"; } try { if (f.exists()) { f = new File(f.getAbsolutePath()); while (f != null) { File g = new File(f, "WEB-INF"); if (g.exists() && g.isDirectory()) { uriRoot = f.getCanonicalPath(); uriBase = tUriBase; if (log.isInfoEnabled()) { log.info(Localizer.getMessage( "jspc.implicit.uriRoot", uriRoot)); } break; } if (f.exists() && f.isDirectory()) { tUriBase = "/" + f.getName() + "/" + tUriBase; } String fParent = f.getParent(); if (fParent == null) { break; } else { f = new File(fParent); } // If there is no acceptible candidate, uriRoot will // remain null to indicate to the CompilerContext to // use the current working/user dir. } if (uriRoot != null) { File froot = new File(uriRoot); uriRoot = froot.getCanonicalPath(); } } } catch (IOException ioe) { // since this is an optional default and a null value // for uriRoot has a non-error meaning, we can just // pass straight through } } /** * Resolves the relative or absolute pathname correctly * in both Ant and command-line situations. If Ant launched * us, we should use the basedir of the current project * to resolve relative paths. * * See Bugzilla 35571. * * @param s The file * @return The file resolved */ protected File resolveFile(final String s) { if(getProject() == null) { // Note FileUtils.getFileUtils replaces FileUtils.newFileUtils in Ant 1.6.3 return FileUtils.newFileUtils().resolveFile(null, s); } else { return FileUtils.newFileUtils().resolveFile(getProject().getBaseDir(), s); } } }
可能少了ant包,需要下载!
3.编译参数:
编译参数说明:
-compile 表示要编译生成的java文件
-d ./ 定义输出的路径为当前目录
-p netjava.cn :定义包名为netjava
-d classes :编译后存放目录
-javaEncoding GBK :编码为GBK
-webapp webapp:编译webapp目录下的jsp
执行命令:
java -cp jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;catalina-ant.jar;jasper-el.jar;jasper-jdt.jar;
tomcat-juli.jar;jsp-api.jar;ant.jar org.apache.jasper.JspC
4.编写一个测试jsp文件进行编译
首先,编写测试用jsp文件:netjava.jsp;
下lib(放了以上类库)的目录下,新建一个webapp目录,将netjava.jsp拷入;
执行完整的编译命令:
java -cp jasper.jar;servlet-api.jar;el-api.jar;catalina.jar;ant.jar;catalina-ant.jar;jasper-el.jar;
jasper-jdt.jar;tomcat-juli.jar;jsp-api.jar; org.apache.jasper.JspC -webapp webapp -uriroot
webapp -compile -webxml web.xml -d classes -javaEncoding GBK -p netjava.cn
结果:
生成web.xml文件和classes目录.
5.在tomcat的webapps下新建一个目录,netjava(不一定要同名)
在其下新建WEB-INF目录,将上面生成的web.xml和classes目录考入
6.OK,在IE里测试下!(根据web.xml中配置的servlet名)
一般是http://localhost:8080/netjava/netjava.jsp
7.打war包:
在netjava目录下执行:
jar -cvf netjavacompile.war -c WEB-INF\
将生成的war入到webapps下,服务器会自动加载
相关推荐
【标题】"Tomcat的JSP编译参数" 在Java Web开发中,Tomcat服务器扮演着重要的角色,尤其是对于处理JSP(JavaServer Pages)页面。JSP是一种动态网页技术,它允许开发者将HTML代码与Java代码混合编写,从而实现动态...
总的来说,将JSP编译打包成jar是一个将静态的JSP文件转换为可执行的Servlet代码,并利用构建工具Ant完成打包的过程,这样可以方便地在不支持JSP的环境中运行和部署。这个过程涉及到JSP、Servlet、Ant构建工具以及web...
当我们在服务器上运行一个JSP文件时,服务器会将其转换成一个Servlet(Java类),然后编译为.class文件,这个过程被称为JSP编译。下面我们将详细探讨这一过程以及如何将生成的Java类反编译为.class文件并打包到.jar...
预编译过程将JSP文件转换为Servlet源码,然后编译成.class文件,减少了运行时的解析和编译时间。 一、JSP预编译的重要性 JSP预编译的主要好处是提高应用响应速度。在没有预编译的情况下,JSP首次被请求时会经历...
【手工编译jsp】是一个关于Java Web开发中的特殊主题,主要涉及如何在没有使用Web容器(如Tomcat、Jetty等)的情况下,直接对JSP(JavaServer Pages)页面进行预编译为Java类的过程。这个过程对于理解JSP的工作原理...
**JSP预编译与打包成JAR**是Web应用开发中的一个重要环节,尤其是在大型项目中,为了提高应用性能和管理便捷性,开发者通常会采用这样的步骤。JSP(JavaServer Pages)是一种动态网页技术,它允许在服务器端生成HTML...
JSP编译过程.vsdx
将jsp批量转换为class文件. 运行命令 java -jar jspcp.jar "路径1" "路径2" 路径1:webapp路径,一定是WEB-INF目录的父目录 路径2:编译后的java和class文件存储路径 路径如果有空格,一定用""包裹
JSP编译后的JAVA文件
标题 "让WebSphere (WAS) 发布程序编译JSP为Java文件,Java文件位置" 暗示了在IBM WebSphere Application Server (WAS) 中如何配置以查看或控制JSP编译过程,以及生成的Java源文件的位置。在Web应用程序的开发和调试...
这将导致编译错误,因为字符串中的`%>`被视为未关闭的字符常量。为了避免这种情况,开发人员需要在字符串中转义 `%` 字符,如 `"%>`。 Servlet,另一方面,是一种服务器端的Java程序,它被设计用来扩展Web服务器的...
不是当预编译jsp时等待WLS启动,而是在服务器启动后运行此实用程序。它还检查jsp并告知哪些不能通过编译。 您可以在编辑jsp时不断运行此程序。本程序还关注受限制的页面 (路径),允许为其指定密码。目前针对基于...
第2章_JSP 编译指令汇编.pptx
在给定的场景中,用户通过一个网页上的JSP(Java Server Pages)来编辑Java源代码,然后这个代码被发送到服务器端,由Servlet处理动态编译和执行的过程。 首先,我们需要了解JSP的作用。JSP是Java Web开发的一种...
3. **打包成WAR文件**:将编译后的.class文件以及相关的Jsp文件等资源文件打包成WAR格式的归档文件。 **注意事项**:确保所有Java源代码已经正确编译,避免因未编译而直接打包导致部署失败。 ##### 3. 在Weblogic...
反编译`jspSmartUpload`组件的源码,对于开发者而言,有以下几个好处: 1. **理解内部机制**:通过查看源码,可以深入理解组件的工作原理,了解其内部如何处理文件上传的各种细节。 2. **自定义扩展**:如果标准...
7. **javassist.jar**:在某些情况下,如Tomcat的Jasper引擎,可能会用到javassist库来动态地修改字节码,这是JSP编译过程的一部分。 8. **javax.faces.*.jar**:对于使用JSF技术的项目,如`jsf-api.jar`和`jsf-...
**JSP自动编译机制详解** JavaServer Pages (JSP) 是一种动态网页技术,它允许开发者将HTML、CSS和JavaScript代码与Java代码混合编写,从而实现服务器端的业务逻辑处理。在JSP中,自动编译机制是其核心功能之一,...
介绍JSP页面的结构 JSP的编译指令、操作指令和代码 重点介绍JSP常用的六大基本对象: out对象、response对象、request对象、application对象、session对象和cookie对象。
2. **jsp-api.jar**:JSP API的实现,提供了处理JSP页面所需的各种接口和类,比如`javax.servlet.jsp.JspPage`、`javax.servlet.jsp.tagext.Tag`等,用于编译和执行JSP页面。 3. **el-api.jar**:Expression ...