This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new 4d7085b  Remove most Jasper system property configuration
4d7085b is described below

commit 4d7085bdb4d0d8d330e158de84cd3ab183fbf369
Author: remm <r...@apache.org>
AuthorDate: Tue Mar 31 15:25:14 2020 +0200

    Remove most Jasper system property configuration
    
    Replaced with corresponding options, initialized from init parameters.
    As these were rarely used, I wonder if it is required to add them in
    jspc.
    Update documentation.
---
 java/org/apache/jasper/Constants.java              |  58 -------
 java/org/apache/jasper/EmbeddedServletOptions.java | 188 +++++++++++++++++++++
 java/org/apache/jasper/JspCompilationContext.java  |   8 +-
 java/org/apache/jasper/Options.java                | 104 ++++++++++++
 java/org/apache/jasper/compiler/Compiler.java      |   2 +-
 java/org/apache/jasper/compiler/Generator.java     |  59 +++----
 .../apache/jasper/compiler/JspDocumentParser.java  |   3 +-
 .../apache/jasper/compiler/JspRuntimeContext.java  |   6 +-
 java/org/apache/jasper/compiler/JspUtil.java       |  12 +-
 java/org/apache/jasper/compiler/Node.java          |   8 +-
 java/org/apache/jasper/compiler/PageInfo.java      |  10 +-
 java/org/apache/jasper/compiler/Parser.java        |  12 +-
 .../apache/jasper/compiler/TagFileProcessor.java   |   6 +-
 .../jasper/resources/LocalStrings.properties       |   4 +
 java/org/apache/jasper/runtime/TagHandlerPool.java |   6 +-
 java/org/apache/jasper/servlet/JasperLoader.java   |   8 +-
 java/org/apache/jasper/servlet/JspServlet.java     |   7 +-
 java/org/apache/jasper/tagplugins/jstl/Util.java   |  26 ---
 test/org/apache/jasper/compiler/TestParser.java    |   2 +-
 test/webapp/WEB-INF/web.xml                        |   8 +
 test/webapp/bug49nnn/bug49297NoSpaceStrict.jsp     |  23 +++
 webapps/docs/changelog.xml                         |   4 +
 webapps/docs/config/systemprops.xml                | 113 -------------
 webapps/docs/jasper-howto.xml                      |  68 ++++++++
 24 files changed, 471 insertions(+), 274 deletions(-)

diff --git a/java/org/apache/jasper/Constants.java 
b/java/org/apache/jasper/Constants.java
index 43730f6..fd7c1fe 100644
--- a/java/org/apache/jasper/Constants.java
+++ b/java/org/apache/jasper/Constants.java
@@ -33,20 +33,6 @@ public class Constants {
     public static final String SPEC_VERSION = "3.0";
 
     /**
-     * The base class of the generated servlets.
-     */
-    public static final String JSP_SERVLET_BASE =
-        System.getProperty("org.apache.jasper.Constants.JSP_SERVLET_BASE", 
"org.apache.jasper.runtime.HttpJspBase");
-
-    /**
-     * _jspService is the name of the method that is called by
-     * HttpJspBase.service(). This is where most of the code generated
-     * from JSPs go.
-     */
-    public static final String SERVICE_METHOD_NAME =
-        System.getProperty("org.apache.jasper.Constants.SERVICE_METHOD_NAME", 
"_jspService");
-
-    /**
      * These classes/packages are automatically imported by the
      * generated code.
      */
@@ -59,14 +45,6 @@ public class Constants {
         Collections.unmodifiableList(Arrays.asList(PRIVATE_STANDARD_IMPORTS));
 
     /**
-     * ServletContext attribute for classpath. This is tomcat specific.
-     * Other servlet engines may choose to support this attribute if they
-     * want to have this JSP engine running on them.
-     */
-    public static final String SERVLET_CLASSPATH =
-        System.getProperty("org.apache.jasper.Constants.SERVLET_CLASSPATH", 
"org.apache.catalina.jsp_classpath");
-
-    /**
      * Default size of the JSP buffer.
      */
     public static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
@@ -82,25 +60,6 @@ public class Constants {
     public static final int MAX_POOL_SIZE = 5;
 
     /**
-     * The query parameter that causes the JSP engine to just
-     * pregenerated the servlet but not invoke it.
-     */
-    public static final String PRECOMPILE =
-        System.getProperty("org.apache.jasper.Constants.PRECOMPILE", 
"jsp_precompile");
-
-    /**
-     * The default package name for compiled jsp pages.
-     */
-    public static final String JSP_PACKAGE_NAME =
-        System.getProperty("org.apache.jasper.Constants.JSP_PACKAGE_NAME", 
"org.apache.jsp");
-
-    /**
-     * The default package name for tag handlers generated from tag files
-     */
-    public static final String TAG_FILE_PACKAGE_NAME =
-        
System.getProperty("org.apache.jasper.Constants.TAG_FILE_PACKAGE_NAME", 
"org.apache.jsp.tag");
-
-    /**
      * Default URLs to download the plugin for Netscape and IE.
      */
     public static final String NS_PLUGIN_URL =
@@ -110,28 +69,11 @@ public class Constants {
         
"http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2-win.cab#Version=1,2,2,0";;
 
     /**
-     * Prefix to use for generated temporary variable names
-     */
-    public static final String TEMP_VARIABLE_NAME_PREFIX =
-        
System.getProperty("org.apache.jasper.Constants.TEMP_VARIABLE_NAME_PREFIX", 
"_jspx_temp");
-
-    /**
      * Has security been turned on?
      */
     public static final boolean IS_SECURITY_ENABLED =
         (System.getSecurityManager() != null);
 
-    public static final boolean USE_INSTANCE_MANAGER_FOR_TAGS =
-        
Boolean.parseBoolean(System.getProperty("org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS",
 "false"));
-
-    /**
-     * The name of the path parameter used to pass the session identifier
-     * back and forth with the client.
-     */
-    public static final String SESSION_PARAMETER_NAME =
-        System.getProperty("org.apache.catalina.SESSION_PARAMETER_NAME",
-                "jsessionid");
-
     /**
      * Name of the system property containing
      * the tomcat product installation path
diff --git a/java/org/apache/jasper/EmbeddedServletOptions.java 
b/java/org/apache/jasper/EmbeddedServletOptions.java
index bab6ae3..e0198c6 100644
--- a/java/org/apache/jasper/EmbeddedServletOptions.java
+++ b/java/org/apache/jasper/EmbeddedServletOptions.java
@@ -211,6 +211,32 @@ public final class EmbeddedServletOptions implements 
Options {
      */
     private boolean quoteAttributeEL = true;
 
+    private String variableForExpressionFactory = "_el_expressionfactory";
+
+    private String variableForInstanceManager = "_jsp_instancemanager";
+
+    private boolean poolTagsWithExtends = false;
+
+    private boolean strictGetProperty = true;
+
+    private boolean strictWhitespace = true;
+
+    private String jspServletBase = "org.apache.jasper.runtime.HttpJspBase";
+
+    private String serviceMethodName = "_jspService";
+
+    private String servletClasspathAttribute = 
"org.apache.catalina.jsp_classpath";
+
+    private String jspPrecompilationQueryParameter = "jsp_precompile";
+
+    private String generatedJspPackageName = "org.apache.jsp";
+
+    private String generatedTagFilePackageName = "org.apache.jsp.tag";
+
+    private String tempVariableNamePrefix = "_jspx_temp";
+
+    private boolean useInstanceManagerForTags = false;
+
     public String getProperty(String name ) {
         return settings.getProperty( name );
     }
@@ -465,6 +491,71 @@ public final class EmbeddedServletOptions implements 
Options {
         return strictQuoteEscaping;
     }
 
+    @Override
+    public String getVariableForExpressionFactory() {
+        return variableForExpressionFactory;
+    }
+
+    @Override
+    public String getVariableForInstanceManager() {
+        return variableForInstanceManager;
+    }
+
+    @Override
+    public boolean getPoolTagsWithExtends() {
+        return poolTagsWithExtends;
+    }
+
+    @Override
+    public boolean getStrictGetProperty() {
+        return strictGetProperty;
+    }
+
+    @Override
+    public boolean getStrictWhitespace() {
+        return strictWhitespace;
+    }
+
+    @Override
+    public String getJspServletBase() {
+        return jspServletBase;
+    }
+
+    @Override
+    public String getServiceMethodName() {
+        return serviceMethodName;
+    }
+
+    @Override
+    public String getServletClasspathAttribute() {
+        return servletClasspathAttribute;
+    }
+
+    @Override
+    public String getJspPrecompilationQueryParameter() {
+        return jspPrecompilationQueryParameter;
+    }
+
+    @Override
+    public String getGeneratedJspPackageName() {
+        return generatedJspPackageName;
+    }
+
+    @Override
+    public String getGeneratedTagFilePackageName() {
+        return generatedTagFilePackageName;
+    }
+
+    @Override
+    public String getTempVariableNamePrefix() {
+        return tempVariableNamePrefix;
+    }
+
+    @Override
+    public boolean getUseInstanceManagerForTags() {
+        return useInstanceManagerForTags;
+    }
+
     /**
      * Create an EmbeddedServletOptions object using data available from
      * ServletConfig and ServletContext.
@@ -791,6 +882,103 @@ public final class EmbeddedServletOptions implements 
Options {
             }
         }
 
+        String variableForExpressionFactory = 
config.getInitParameter("variableForExpressionFactory");
+        if (variableForExpressionFactory != null) {
+            this.variableForExpressionFactory = variableForExpressionFactory;
+        }
+
+        String variableForInstanceManager = 
config.getInitParameter("variableForInstanceManager");
+        if (variableForInstanceManager != null) {
+            this.variableForInstanceManager = variableForInstanceManager;
+        }
+
+        String poolTagsWithExtends = 
config.getInitParameter("poolTagsWithExtends");
+        if (poolTagsWithExtends != null) {
+            if (poolTagsWithExtends.equalsIgnoreCase("true")) {
+                this.poolTagsWithExtends = true;
+            } else if (poolTagsWithExtends.equalsIgnoreCase("false")) {
+                this.poolTagsWithExtends = false;
+            } else {
+                if (log.isWarnEnabled()) {
+                    
log.warn(Localizer.getMessage("jsp.warning.poolTagsWithExtends"));
+                }
+            }
+        }
+
+        String strictGetProperty = 
config.getInitParameter("strictGetProperty");
+        if (strictGetProperty != null) {
+            if (strictGetProperty.equalsIgnoreCase("true")) {
+                this.strictGetProperty = true;
+            } else if (strictGetProperty.equalsIgnoreCase("false")) {
+                this.strictGetProperty = false;
+            } else {
+                if (log.isWarnEnabled()) {
+                    
log.warn(Localizer.getMessage("jsp.warning.strictGetProperty"));
+                }
+            }
+        }
+
+        String strictWhitespace = config.getInitParameter("strictWhitespace");
+        if (strictWhitespace != null) {
+            if (strictWhitespace.equalsIgnoreCase("true")) {
+                this.strictWhitespace = true;
+            } else if (strictWhitespace.equalsIgnoreCase("false")) {
+                this.strictWhitespace = false;
+            } else {
+                if (log.isWarnEnabled()) {
+                    
log.warn(Localizer.getMessage("jsp.warning.strictWhitespace"));
+                }
+            }
+        }
+
+        String jspServletBase = config.getInitParameter("jspServletBase");
+        if (jspServletBase != null) {
+            this.jspServletBase = jspServletBase;
+        }
+
+        String serviceMethodName = 
config.getInitParameter("serviceMethodName");
+        if (serviceMethodName != null) {
+            this.serviceMethodName = serviceMethodName;
+        }
+
+        String servletClasspathAttribute = 
config.getInitParameter("servletClasspathAttribute");
+        if (servletClasspathAttribute != null) {
+            this.servletClasspathAttribute = servletClasspathAttribute;
+        }
+
+        String jspPrecompilationQueryParameter = 
config.getInitParameter("jspPrecompilationQueryParameter");
+        if (jspPrecompilationQueryParameter != null) {
+            this.jspPrecompilationQueryParameter = 
jspPrecompilationQueryParameter;
+        }
+
+        String generatedJspPackageName = 
config.getInitParameter("generatedJspPackageName");
+        if (generatedJspPackageName != null) {
+            this.generatedJspPackageName = generatedJspPackageName;
+        }
+
+        String generatedTagFilePackageName = 
config.getInitParameter("generatedTagFilePackageName");
+        if (generatedTagFilePackageName != null) {
+            this.generatedTagFilePackageName = generatedTagFilePackageName;
+        }
+
+        String tempVariableNamePrefix = 
config.getInitParameter("tempVariableNamePrefix");
+        if (tempVariableNamePrefix != null) {
+            this.tempVariableNamePrefix = tempVariableNamePrefix;
+        }
+
+        String useInstanceManagerForTags = 
config.getInitParameter("useInstanceManagerForTags");
+        if (useInstanceManagerForTags != null) {
+            if (useInstanceManagerForTags.equalsIgnoreCase("true")) {
+                this.useInstanceManagerForTags = true;
+            } else if (useInstanceManagerForTags.equalsIgnoreCase("false")) {
+                this.useInstanceManagerForTags = false;
+            } else {
+                if (log.isWarnEnabled()) {
+                    
log.warn(Localizer.getMessage("jsp.warning.useInstanceManagerForTags"));
+                }
+            }
+        }
+
         // Setup the global Tag Libraries location cache for this
         // web-application.
         tldCache = TldCache.getInstance(context);
diff --git a/java/org/apache/jasper/JspCompilationContext.java 
b/java/org/apache/jasper/JspCompilationContext.java
index 97579fd..69a61b4 100644
--- a/java/org/apache/jasper/JspCompilationContext.java
+++ b/java/org/apache/jasper/JspCompilationContext.java
@@ -130,7 +130,7 @@ public class JspCompilationContext {
         this.baseURI = baseURI;
 
         this.rctxt = rctxt;
-        this.basePackageName = Constants.JSP_PACKAGE_NAME;
+        this.basePackageName = options.getGeneratedJspPackageName();
 
         this.tagInfo = tagInfo;
         this.tagJar = tagJar;
@@ -178,10 +178,8 @@ public class JspCompilationContext {
 
     public ClassLoader getJspLoader() {
         if( jspLoader == null ) {
-            jspLoader = new JasperLoader
-                    (new URL[] {baseUrl},
-                            getClassLoader(),
-                            rctxt.getPermissionCollection());
+            jspLoader = new JasperLoader(new URL[] {baseUrl}, getClassLoader(),
+                    basePackageName, rctxt.getPermissionCollection());
         }
         return jspLoader;
     }
diff --git a/java/org/apache/jasper/Options.java 
b/java/org/apache/jasper/Options.java
index c433afc..4b100aa 100644
--- a/java/org/apache/jasper/Options.java
+++ b/java/org/apache/jasper/Options.java
@@ -256,4 +256,108 @@ public interface Options {
      *         the quoting rules in JSP.1.6 applied to the expression.
      */
     public boolean getQuoteAttributeEL();
+
+    /**
+     * @return the name of the variable that will be used in the generated
+     * JSP code for the expression factory
+     */
+    public default String getVariableForExpressionFactory() {
+        return "_el_expressionfactory";
+    }
+
+    /**
+     * @return the name of the variable that will be used in the generated
+     * JSP code for the instance manager
+     */
+    public default String getVariableForInstanceManager() {
+        return "_jsp_instancemanager";
+    }
+
+    /**
+     * @return {@code true} if tag pooling is disabled with page that uses
+     * extends.
+     */
+    public default boolean getPoolTagsWithExtends() {
+        return false;
+    }
+
+    /**
+     * @return {@code true} if the requirement to have the object
+     * used in jsp:getProperty action to be previously "introduced"
+     * to the JSP processor (see JSP.5.3) is enforced.
+     */
+    public default boolean getStrictGetProperty() {
+        return true;
+    }
+
+    /**
+     * @return {@code true} if the strict white space rules are
+     * applied.
+     */
+    public default boolean getStrictWhitespace() {
+        return true;
+    }
+
+    /**
+     * @return the default base class for generated JSP Servlets
+     */
+    public default String getJspServletBase() {
+        return "org.apache.jasper.runtime.HttpJspBase";
+    }
+
+    /**
+     * _jspService is the name of the method that is called by
+     * HttpJspBase.service(). This is where most of the code generated
+     * from JSPs go.
+     * @return the method name
+     */
+    public default String getServiceMethodName() {
+        return "_jspService";
+    }
+
+    /**
+     * @return ServletContext attribute for classpath. This is tomcat specific.
+     * Other servlet engines may choose to support this attribute if they
+     * want to have this JSP engine running on them.
+     */
+    public default String getServletClasspathAttribute() {
+        return "org.apache.catalina.jsp_classpath";
+    }
+
+    /**
+     * @return The query parameter that causes the JSP engine to just
+     * pregenerated the servlet but not invoke it.
+     */
+    public default String getJspPrecompilationQueryParameter() {
+        return "jsp_precompile";
+    }
+
+    /**
+     * @return The default package name for compiled jsp pages.
+     */
+    public default String getGeneratedJspPackageName() {
+        return "org.apache.jsp";
+    }
+
+    /**
+     * @return The default package name for tag handlers generated from tag 
files.
+     */
+    public default String getGeneratedTagFilePackageName() {
+        return "org.apache.jsp.tag";
+    }
+
+    /**
+     * @return Prefix to use for generated temporary variable names
+     */
+    public default String getTempVariableNamePrefix() {
+        return "_jspx_temp";
+    }
+
+    /**
+     * @return {@code true} if the container instance manager will be used
+     * to create the bean instances
+     */
+    public default boolean getUseInstanceManagerForTags() {
+        return false;
+    }
 }
diff --git a/java/org/apache/jasper/compiler/Compiler.java 
b/java/org/apache/jasper/compiler/Compiler.java
index 81c9fc1..2d5cda8 100644
--- a/java/org/apache/jasper/compiler/Compiler.java
+++ b/java/org/apache/jasper/compiler/Compiler.java
@@ -117,7 +117,7 @@ public abstract class Compiler {
 
         // Setup page info area
         pageInfo = new PageInfo(new BeanRepository(ctxt.getClassLoader(),
-                errDispatcher), ctxt.getJspFile(), ctxt.isTagFile());
+                errDispatcher), ctxt);
 
         JspConfig jspConfig = options.getJspConfig();
         JspConfig.JspProperty jspProperty = jspConfig.findJspProperty(ctxt
diff --git a/java/org/apache/jasper/compiler/Generator.java 
b/java/org/apache/jasper/compiler/Generator.java
index 50f8767..e2e95a9 100644
--- a/java/org/apache/jasper/compiler/Generator.java
+++ b/java/org/apache/jasper/compiler/Generator.java
@@ -81,22 +81,6 @@ class Generator {
 
     private static final Class<?>[] OBJECT_CLASS = { Object.class };
 
-    private static final String VAR_EXPRESSIONFACTORY =
-        
System.getProperty("org.apache.jasper.compiler.Generator.VAR_EXPRESSIONFACTORY",
 "_el_expressionfactory");
-    private static final String VAR_INSTANCEMANAGER =
-        
System.getProperty("org.apache.jasper.compiler.Generator.VAR_INSTANCEMANAGER", 
"_jsp_instancemanager");
-    private static final boolean POOL_TAGS_WITH_EXTENDS =
-        
Boolean.getBoolean("org.apache.jasper.compiler.Generator.POOL_TAGS_WITH_EXTENDS");
-
-    /* System property that controls if the requirement to have the object
-     * used in jsp:getProperty action to be previously "introduced"
-     * to the JSP processor (see JSP.5.3) is enforced.
-     */
-    private static final boolean STRICT_GET_PROPERTY = Boolean.parseBoolean(
-            System.getProperty(
-                    "org.apache.jasper.compiler.Generator.STRICT_GET_PROPERTY",
-                    "true"));
-
     private final ServletWriter out;
 
     private final ArrayList<GenBuffer> methodsBuffered;
@@ -435,16 +419,16 @@ class Generator {
         out.pushIndent();
         if (!ctxt.isTagFile()) {
             out.printin("if (");
-            out.print(VAR_EXPRESSIONFACTORY);
+            out.print(ctxt.getOptions().getVariableForExpressionFactory());
             out.println(" == null) {");
             out.pushIndent();
             out.printil("synchronized (this) {");
             out.pushIndent();
             out.printin("if (");
-            out.print(VAR_EXPRESSIONFACTORY);
+            out.print(ctxt.getOptions().getVariableForExpressionFactory());
             out.println(" == null) {");
             out.pushIndent();
-            out.printin(VAR_EXPRESSIONFACTORY);
+            out.printin(ctxt.getOptions().getVariableForExpressionFactory());
             out.println(" = 
_jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();");
             out.popIndent();
             out.printil("}");
@@ -454,7 +438,7 @@ class Generator {
             out.printil("}");
         }
         out.printin("return ");
-        out.print(VAR_EXPRESSIONFACTORY);
+        out.print(ctxt.getOptions().getVariableForExpressionFactory());
         out.println(";");
         out.popIndent();
         out.printil("}");
@@ -465,16 +449,16 @@ class Generator {
         out.pushIndent();
         if (!ctxt.isTagFile()) {
             out.printin("if (");
-            out.print(VAR_INSTANCEMANAGER);
+            out.print(ctxt.getOptions().getVariableForInstanceManager());
             out.println(" == null) {");
             out.pushIndent();
             out.printil("synchronized (this) {");
             out.pushIndent();
             out.printin("if (");
-            out.print(VAR_INSTANCEMANAGER);
+            out.print(ctxt.getOptions().getVariableForInstanceManager());
             out.println(" == null) {");
             out.pushIndent();
-            out.printin(VAR_INSTANCEMANAGER);
+            out.printin(ctxt.getOptions().getVariableForInstanceManager());
             out.println(" = 
org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());");
             out.popIndent();
             out.printil("}");
@@ -484,7 +468,7 @@ class Generator {
             out.printil("}");
         }
         out.printin("return ");
-        out.print(VAR_INSTANCEMANAGER);
+        out.print(ctxt.getOptions().getVariableForInstanceManager());
         out.println(";");
         out.popIndent();
         out.printil("}");
@@ -524,9 +508,9 @@ class Generator {
         // Tag files can't (easily) use lazy init for these so initialise them
         // here.
         if (ctxt.isTagFile()) {
-            out.printin(VAR_EXPRESSIONFACTORY);
+            out.printin(ctxt.getOptions().getVariableForExpressionFactory());
             out.println(" = 
_jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory();");
-            out.printin(VAR_INSTANCEMANAGER);
+            out.printin(ctxt.getOptions().getVariableForInstanceManager());
             out.println(" = 
org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(config);");
         }
 
@@ -679,10 +663,10 @@ class Generator {
             out.println();
         }
         out.printin("private volatile jakarta.el.ExpressionFactory ");
-        out.print(VAR_EXPRESSIONFACTORY);
+        out.print(ctxt.getOptions().getVariableForExpressionFactory());
         out.println(";");
         out.printin("private volatile org.apache.tomcat.InstanceManager ");
-        out.print(VAR_INSTANCEMANAGER);
+        out.print(ctxt.getOptions().getVariableForInstanceManager());
         out.println(";");
         out.println();
     }
@@ -727,7 +711,7 @@ class Generator {
 
         String servletPackageName = ctxt.getServletPackageName();
         String servletClassName = ctxt.getServletClassName();
-        String serviceMethodName = Constants.SERVICE_METHOD_NAME;
+        String serviceMethodName = ctxt.getOptions().getServiceMethodName();
 
         // First the package name:
         genPreamblePackage(servletPackageName);
@@ -939,15 +923,18 @@ class Generator {
 
         private HashMap<String,String> textMap;
 
+        private final boolean useInstanceManagerForTags;
 
         public GenerateVisitor(boolean isTagFile, ServletWriter out,
                 ArrayList<GenBuffer> methodsBuffered,
-                FragmentHelperClass fragmentHelperClass) {
+                FragmentHelperClass fragmentHelperClass,
+                boolean useInstanceManagerForTags) {
 
             this.isTagFile = isTagFile;
             this.out = out;
             this.methodsBuffered = methodsBuffered;
             this.fragmentHelperClass = fragmentHelperClass;
+            this.useInstanceManagerForTags = useInstanceManagerForTags;
             methodNesting = 0;
             handlerInfos = new Hashtable<>();
             tagVarNumbers = new Hashtable<>();
@@ -1232,7 +1219,7 @@ class Generator {
                         + ")_jspx_page_context.findAttribute("
                         + "\""
                         + name + "\"))." + methodName + "())));");
-            } else if (!STRICT_GET_PROPERTY || varInfoNames.contains(name)) {
+            } else if (!ctxt.getOptions().getStrictGetProperty() || 
varInfoNames.contains(name)) {
                 // The object is a custom action with an associated
                 // VariableInfo entry for this name.
                 // Get the class name and then introspect at runtime.
@@ -2492,7 +2479,7 @@ class Generator {
             out.print(" ");
             out.print(tagHandlerVar);
             out.print(" = ");
-            if (Constants.USE_INSTANCE_MANAGER_FOR_TAGS) {
+            if (useInstanceManagerForTags) {
                 out.print("(");
                 out.print(tagHandlerClassName);
                 out.print(")");
@@ -3618,7 +3605,7 @@ class Generator {
          * clarify whether containers can override init() and destroy(). For
          * now, we just disable tag pooling for pages that use "extends".
          */
-        if (pageInfo.getExtends(false) == null || POOL_TAGS_WITH_EXTENDS) {
+        if (pageInfo.getExtends(false) == null || 
ctxt.getOptions().getPoolTagsWithExtends()) {
             isPoolingEnabled = ctxt.getOptions().isPoolingEnabled();
         } else {
             isPoolingEnabled = false;
@@ -3667,14 +3654,16 @@ class Generator {
             gen.generateXmlProlog(page);
             gen.fragmentHelperClass.generatePreamble();
             page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out,
-                    gen.methodsBuffered, gen.fragmentHelperClass));
+                    gen.methodsBuffered, gen.fragmentHelperClass,
+                    gen.ctxt.getOptions().getUseInstanceManagerForTags()));
             gen.generateTagHandlerPostamble(tagInfo);
         } else {
             gen.generatePreamble(page);
             gen.generateXmlProlog(page);
             gen.fragmentHelperClass.generatePreamble();
             page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out,
-                    gen.methodsBuffered, gen.fragmentHelperClass));
+                    gen.methodsBuffered, gen.fragmentHelperClass,
+                    gen.ctxt.getOptions().getUseInstanceManagerForTags()));
             gen.generatePostamble();
         }
     }
diff --git a/java/org/apache/jasper/compiler/JspDocumentParser.java 
b/java/org/apache/jasper/compiler/JspDocumentParser.java
index 938ebe3..74408f5 100644
--- a/java/org/apache/jasper/compiler/JspDocumentParser.java
+++ b/java/org/apache/jasper/compiler/JspDocumentParser.java
@@ -168,7 +168,8 @@ class JspDocumentParser
         try {
 
             // Create dummy root and initialize it with given page encodings
-            Node.Root dummyRoot = new Node.Root(null, parent, true);
+            Node.Root dummyRoot = new Node.Root(null, parent, true,
+                    
pc.getJspCompilationContext().getOptions().getTempVariableNamePrefix());
             dummyRoot.setPageEncoding(pageEnc);
             dummyRoot.setJspConfigPageEncoding(jspConfigPageEnc);
             dummyRoot.setIsEncodingSpecifiedInProlog(
diff --git a/java/org/apache/jasper/compiler/JspRuntimeContext.java 
b/java/org/apache/jasper/compiler/JspRuntimeContext.java
index 02f5c0c..cacd78f 100644
--- a/java/org/apache/jasper/compiler/JspRuntimeContext.java
+++ b/java/org/apache/jasper/compiler/JspRuntimeContext.java
@@ -440,6 +440,10 @@ public final class JspRuntimeContext {
     }
 
 
+    public Options getOptions() {
+        return options;
+    }
+
     // -------------------------------------------------------- Private Methods
 
     /**
@@ -473,7 +477,7 @@ public final class JspRuntimeContext {
 
         cpath.append(options.getScratchDir() + File.pathSeparator);
 
-        String cp = (String) context.getAttribute(Constants.SERVLET_CLASSPATH);
+        String cp = (String) 
context.getAttribute(options.getServletClasspathAttribute());
         if (cp == null || cp.equals("")) {
             cp = options.getClassPath();
         }
diff --git a/java/org/apache/jasper/compiler/JspUtil.java 
b/java/org/apache/jasper/compiler/JspUtil.java
index b0be277..63ba1d3 100644
--- a/java/org/apache/jasper/compiler/JspUtil.java
+++ b/java/org/apache/jasper/compiler/JspUtil.java
@@ -24,7 +24,6 @@ import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 
-import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.JspCompilationContext;
 import org.apache.tomcat.Jar;
@@ -672,6 +671,7 @@ public class JspUtil {
      * the given tag file path.
      *
      * @param path Tag file path
+     * @param packageName The package name
      * @param urn The tag identifier
      * @param err Error dispatcher
      *
@@ -679,7 +679,7 @@ public class JspUtil {
      *         the given tag file path
      * @throws JasperException Failed to generate a class name for the tag
      */
-    public static String getTagHandlerClassName(String path, String urn,
+    public static String getTagHandlerClassName(String path, String 
packageName, String urn,
             ErrorDispatcher err) throws JasperException {
 
 
@@ -704,12 +704,12 @@ public class JspUtil {
 
         index = path.indexOf(WEB_INF_TAGS);
         if (index != -1) {
-            className = Constants.TAG_FILE_PACKAGE_NAME + ".web.";
+            className = packageName + ".web.";
             begin = index + WEB_INF_TAGS.length();
         } else {
             index = path.indexOf(META_INF_TAGS);
             if (index != -1) {
-                className = getClassNameBase(urn);
+                className = getClassNameBase(packageName, urn);
                 begin = index + META_INF_TAGS.length();
             } else {
                 err.jspError("jsp.error.tagfile.illegalPath", path);
@@ -721,9 +721,9 @@ public class JspUtil {
         return className;
     }
 
-    private static String getClassNameBase(String urn) {
+    private static String getClassNameBase(String packageName, String urn) {
         StringBuilder base =
-                new StringBuilder(Constants.TAG_FILE_PACKAGE_NAME + ".meta.");
+                new StringBuilder(packageName + ".meta.");
         if (urn != null) {
             base.append(makeJavaPackage(urn));
             base.append('.');
diff --git a/java/org/apache/jasper/compiler/Node.java 
b/java/org/apache/jasper/compiler/Node.java
index 836bb99..6f70e38 100644
--- a/java/org/apache/jasper/compiler/Node.java
+++ b/java/org/apache/jasper/compiler/Node.java
@@ -36,7 +36,6 @@ import jakarta.servlet.jsp.tagext.TagVariableInfo;
 import jakarta.servlet.jsp.tagext.TryCatchFinally;
 import jakarta.servlet.jsp.tagext.VariableInfo;
 
-import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.compiler.tagplugin.TagPluginContext;
 import org.xml.sax.Attributes;
@@ -412,6 +411,8 @@ abstract class Node implements TagConstants {
 
         private final boolean isXmlSyntax;
 
+        private final String variablePrefix;
+
         // Source encoding of the page containing this Root
         private String pageEnc;
 
@@ -452,9 +453,10 @@ abstract class Node implements TagConstants {
         /*
          * Constructor.
          */
-        Root(Mark start, Node parent, boolean isXmlSyntax) {
+        Root(Mark start, Node parent, boolean isXmlSyntax, String 
variablePrefix) {
             super(start, parent);
             this.isXmlSyntax = isXmlSyntax;
+            this.variablePrefix = variablePrefix;
             this.qName = JSP_ROOT_ACTION;
             this.localName = ROOT_ACTION;
 
@@ -529,7 +531,7 @@ abstract class Node implements TagConstants {
          */
         public String nextTemporaryVariableName() {
             if (parentRoot == null) {
-                return Constants.TEMP_VARIABLE_NAME_PREFIX + 
(tempSequenceNumber++);
+                return variablePrefix + (tempSequenceNumber++);
             } else {
                 return parentRoot.nextTemporaryVariableName();
             }
diff --git a/java/org/apache/jasper/compiler/PageInfo.java 
b/java/org/apache/jasper/compiler/PageInfo.java
index e4a745a..02c8d78 100644
--- a/java/org/apache/jasper/compiler/PageInfo.java
+++ b/java/org/apache/jasper/compiler/PageInfo.java
@@ -30,6 +30,7 @@ import jakarta.servlet.jsp.tagext.TagLibraryInfo;
 
 import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
+import org.apache.jasper.JspCompilationContext;
 
 /**
  * A repository for various info about the translation unit under compilation.
@@ -51,7 +52,7 @@ class PageInfo {
     private final String jspFile;
     private static final String defaultLanguage = "java";
     private String language;
-    private final String defaultExtends = Constants.JSP_SERVLET_BASE;
+    private final String defaultExtends;
     private String xtends;
     private String contentType = null;
     private String session;
@@ -101,9 +102,10 @@ class PageInfo {
 
     private final boolean isTagFile;
 
-    PageInfo(BeanRepository beanRepository, String jspFile, boolean isTagFile) 
{
-        this.isTagFile = isTagFile;
-        this.jspFile = jspFile;
+    PageInfo(BeanRepository beanRepository, JspCompilationContext ctxt) {
+        isTagFile = ctxt.isTagFile();
+        jspFile = ctxt.getJspFile();
+        defaultExtends = ctxt.getOptions().getJspServletBase();
         this.beanRepository = beanRepository;
         this.varInfoNames = new HashSet<>();
         this.taglibsMap = new HashMap<>();
diff --git a/java/org/apache/jasper/compiler/Parser.java 
b/java/org/apache/jasper/compiler/Parser.java
index f4fa086..4750561 100644
--- a/java/org/apache/jasper/compiler/Parser.java
+++ b/java/org/apache/jasper/compiler/Parser.java
@@ -76,13 +76,6 @@ class Parser implements TagConstants {
     private static final String JAVAX_BODY_CONTENT_TEMPLATE_TEXT =
         "JAVAX_BODY_CONTENT_TEMPLATE_TEXT";
 
-    /* System property that controls if the strict white space rules are
-     * applied.
-     */
-    private static final boolean STRICT_WHITESPACE = Boolean.parseBoolean(
-            System.getProperty(
-                    "org.apache.jasper.compiler.Parser.STRICT_WHITESPACE",
-                    "true"));
     /**
      * The constructor
      */
@@ -126,7 +119,8 @@ class Parser implements TagConstants {
 
         Parser parser = new Parser(pc, reader, isTagFile, directivesOnly, jar);
 
-        Node.Root root = new Node.Root(reader.mark(), parent, false);
+        Node.Root root = new Node.Root(reader.mark(), parent, false,
+                
pc.getJspCompilationContext().getOptions().getTempVariableNamePrefix());
         root.setPageEncoding(pageEnc);
         root.setJspConfigPageEncoding(jspConfigPageEnc);
         root.setIsDefaultPageEncoding(isDefaultPageEncoding);
@@ -166,7 +160,7 @@ class Parser implements TagConstants {
 
         try {
             while (parseAttribute(attrs)) {
-                if (ws == 0 && STRICT_WHITESPACE) {
+                if (ws == 0 && ctxt.getOptions().getStrictWhitespace()) {
                     err.jspError(reader.mark(),
                             "jsp.error.attribute.nowhitespace");
                 }
diff --git a/java/org/apache/jasper/compiler/TagFileProcessor.java 
b/java/org/apache/jasper/compiler/TagFileProcessor.java
index c91b2aa..28cffd4 100644
--- a/java/org/apache/jasper/compiler/TagFileProcessor.java
+++ b/java/org/apache/jasper/compiler/TagFileProcessor.java
@@ -348,7 +348,7 @@ class TagFileProcessor {
                     nameFromAttribute, className, declare, scope));
         }
 
-        public TagInfo getTagInfo() throws JasperException {
+        public TagInfo getTagInfo(String packageName) throws JasperException {
 
             if (name == null) {
                 // XXX Get it from tag file name
@@ -359,7 +359,7 @@ class TagFileProcessor {
             }
 
             String tagClassName = JspUtil.getTagHandlerClassName(
-                    path, tagLibInfo.getReliableURN(), err);
+                    path, packageName, tagLibInfo.getReliableURN(), err);
 
             TagVariableInfo[] tagVariableInfos = new 
TagVariableInfo[variableVector
                     .size()];
@@ -506,7 +506,7 @@ class TagFileProcessor {
         page.visit(tagFileVisitor);
         tagFileVisitor.postCheck();
 
-        return tagFileVisitor.getTagInfo();
+        return 
tagFileVisitor.getTagInfo(pc.getJspCompilationContext().getOptions().getGeneratedTagFilePackageName());
     }
 
     /**
diff --git a/java/org/apache/jasper/resources/LocalStrings.properties 
b/java/org/apache/jasper/resources/LocalStrings.properties
index 2443f05..dedb9cb 100644
--- a/java/org/apache/jasper/resources/LocalStrings.properties
+++ b/java/org/apache/jasper/resources/LocalStrings.properties
@@ -293,8 +293,11 @@ jsp.warning.maxLoadedJsps=Warning: Invalid value for the 
initParam maxLoadedJsps
 jsp.warning.modificationTestInterval=Warning: Invalid value for the initParam 
modificationTestInterval. Will use the default value of "4" seconds
 jsp.warning.noJarScanner=Warning: No org.apache.tomcat.JarScanner set in 
ServletContext. Falling back to default JarScanner implementation.
 jsp.warning.quoteAttributeEL=Warning: Invalid value for the initParam 
quoteAttributeEL. Will use the default value of "false"
+jsp.warning.poolTagsWithExtends=Warning: Invalid value for the initParam 
poolTagsWithExtends. Will use the default value of "false"
 jsp.warning.recompileOnFail=Warning: Invalid value for the initParam 
recompileOnFail. Will use the default value of "false"
+jsp.warning.strictGetProperty=Warning: Invalid value for the initParam 
strictGetProperty. Will use the default value of "true"
 jsp.warning.strictQuoteEscaping=Warning: Invalid value for the initParam 
strictQuoteEscaping. Will use the default value of "true"
+jsp.warning.strictWhitespace=Warning: Invalid value for the initParam 
strictWhitespace. Will use the default value of "true"
 jsp.warning.suppressSmap=Warning: Invalid value for the initParam 
suppressSmap. Will use the default value of "false"
 jsp.warning.tagPreDestroy=Error processing preDestroy on tag instance of [{0}]
 jsp.warning.tagRelease=Error processing release on tag instance of [{0}]
@@ -302,6 +305,7 @@ jsp.warning.unknown.sourceVM=Unknown source VM [{0}] ignored
 jsp.warning.unknown.targetVM=Unknown target VM [{0}] ignored
 jsp.warning.unsupported.sourceVM=Unsupported source VM [{0}] requested, using 
[{1}]
 jsp.warning.unsupported.targetVM=Unsupported target VM [{0}] requested, using 
[{1}]
+jsp.warning.useInstanceManagerForTags=Warning: Invalid value for the initParam 
useInstanceManagerForTags. Will use the default value of "false"
 jsp.warning.xpoweredBy=Warning: Invalid value for the initParam xpoweredBy. 
Will use the default value of "false"
 
 jspc.delete.fail=Failed to delete file [{0}]
diff --git a/java/org/apache/jasper/runtime/TagHandlerPool.java 
b/java/org/apache/jasper/runtime/TagHandlerPool.java
index 0b03870..5ef15d6 100644
--- a/java/org/apache/jasper/runtime/TagHandlerPool.java
+++ b/java/org/apache/jasper/runtime/TagHandlerPool.java
@@ -35,10 +35,12 @@ public class TagHandlerPool {
 
     public static final String OPTION_TAGPOOL = "tagpoolClassName";
     public static final String OPTION_MAXSIZE = "tagpoolMaxSize";
+    public static final String OPTION_USEIMFORTAGS = 
"useInstanceManagerForTags";
 
     // index of next available tag handler
     private int current;
     protected InstanceManager instanceManager = null;
+    protected boolean useInstanceManagerForTags;
 
     public static TagHandlerPool getTagHandlerPool(ServletConfig config) {
         TagHandlerPool result = null;
@@ -73,6 +75,8 @@ public class TagHandlerPool {
         if (maxSize < 0) {
             maxSize = Constants.MAX_POOL_SIZE;
         }
+        String useInstanceManagerForTagsValue = getOption(config, 
OPTION_USEIMFORTAGS, "false");
+        useInstanceManagerForTags = 
Boolean.valueOf(useInstanceManagerForTagsValue).booleanValue();
         this.handlers = new Tag[maxSize];
         this.current = -1;
         instanceManager = InstanceManagerFactory.getInstanceManager(config);
@@ -108,7 +112,7 @@ public class TagHandlerPool {
         // Out of sync block - there is no need for other threads to
         // wait for us to construct a tag for this thread.
         try {
-            if (Constants.USE_INSTANCE_MANAGER_FOR_TAGS) {
+            if (useInstanceManagerForTags) {
                 return (Tag) instanceManager.newInstance(
                         handlerClass.getName(), handlerClass.getClassLoader());
             } else {
diff --git a/java/org/apache/jasper/servlet/JasperLoader.java 
b/java/org/apache/jasper/servlet/JasperLoader.java
index 4f37939..2a4b997 100644
--- a/java/org/apache/jasper/servlet/JasperLoader.java
+++ b/java/org/apache/jasper/servlet/JasperLoader.java
@@ -24,8 +24,6 @@ import java.net.URLClassLoader;
 import java.security.CodeSource;
 import java.security.PermissionCollection;
 
-import org.apache.jasper.Constants;
-
 /**
  * Class loader for loading servlet class files (corresponding to JSP files)
  * and tag handler class files (corresponding to tag files).
@@ -37,12 +35,14 @@ public class JasperLoader extends URLClassLoader {
 
     private final PermissionCollection permissionCollection;
     private final SecurityManager securityManager;
+    private final String packageName;
 
     public JasperLoader(URL[] urls, ClassLoader parent,
-                        PermissionCollection permissionCollection) {
+            String packageName, PermissionCollection permissionCollection) {
         super(urls, parent);
         this.permissionCollection = permissionCollection;
         this.securityManager = System.getSecurityManager();
+        this.packageName = packageName;
     }
 
     /**
@@ -116,7 +116,7 @@ public class JasperLoader extends URLClassLoader {
             }
         }
 
-        if( !name.startsWith(Constants.JSP_PACKAGE_NAME + '.') ) {
+        if( !name.startsWith(packageName + '.') ) {
             // Class is not in org.apache.jsp, therefore, have our
             // parent load it
             clazz = getParent().loadClass(name);
diff --git a/java/org/apache/jasper/servlet/JspServlet.java 
b/java/org/apache/jasper/servlet/JspServlet.java
index 0fe5ca6..1ee0630 100644
--- a/java/org/apache/jasper/servlet/JspServlet.java
+++ b/java/org/apache/jasper/servlet/JspServlet.java
@@ -234,16 +234,17 @@ public class JspServlet extends HttpServlet implements 
PeriodicEventListener {
      */
     boolean preCompile(HttpServletRequest request) throws ServletException {
 
+        String precompileParameter = 
rctxt.getOptions().getJspPrecompilationQueryParameter();
         String queryString = request.getQueryString();
         if (queryString == null) {
             return false;
         }
-        int start = queryString.indexOf(Constants.PRECOMPILE);
+        int start = queryString.indexOf(precompileParameter);
         if (start < 0) {
             return false;
         }
         queryString =
-            queryString.substring(start + Constants.PRECOMPILE.length());
+            queryString.substring(start + precompileParameter.length());
         if (queryString.length() == 0) {
             return true;             // ?jsp_precompile
         }
@@ -270,7 +271,7 @@ public class JspServlet extends HttpServlet implements 
PeriodicEventListener {
             return true;             // ?jsp_precompile=false
         } else {
             throw new 
ServletException(Localizer.getMessage("jsp.error.precompilation.parameter",
-                    Constants.PRECOMPILE, value));
+                    precompileParameter, value));
         }
 
     }
diff --git a/java/org/apache/jasper/tagplugins/jstl/Util.java 
b/java/org/apache/jasper/tagplugins/jstl/Util.java
index d14ae67..8715e96 100644
--- a/java/org/apache/jasper/tagplugins/jstl/Util.java
+++ b/java/org/apache/jasper/tagplugins/jstl/Util.java
@@ -34,7 +34,6 @@ import jakarta.servlet.jsp.JspException;
 import jakarta.servlet.jsp.JspTagException;
 import jakarta.servlet.jsp.PageContext;
 
-import org.apache.jasper.Constants;
 import org.apache.jasper.compiler.Localizer;
 
 /**
@@ -150,31 +149,6 @@ public class Util {
     }
 
     /**
-     * Strips a servlet session ID from <code>url</code>.  The session ID
-     * is encoded as a URL "path parameter" beginning with "jsessionid=".
-     * We thus remove anything we find between ";jsessionid=" (inclusive)
-     * and either EOS or a subsequent ';' (exclusive).
-     *
-     * taken from org.apache.taglibs.standard.tag.common.core.ImportSupport
-     * @param url The URL
-     * @return the URL without a user submitted session id parameter
-     */
-    public static String stripSession(String url) {
-        StringBuilder u = new StringBuilder(url);
-        int sessionStart;
-        while ((sessionStart = u.toString().indexOf(";" + 
Constants.SESSION_PARAMETER_NAME + "=")) != -1) {
-            int sessionEnd = u.toString().indexOf(';', sessionStart + 1);
-            if (sessionEnd == -1)
-                sessionEnd = u.toString().indexOf('?', sessionStart + 1);
-            if (sessionEnd == -1) // still
-                sessionEnd = u.length();
-            u.delete(sessionStart, sessionEnd);
-        }
-        return u.toString();
-    }
-
-
-    /**
      * Performs the following substring replacements
      * (to facilitate output to XML/HTML pages):
      *
diff --git a/test/org/apache/jasper/compiler/TestParser.java 
b/test/org/apache/jasper/compiler/TestParser.java
index c9035be..1e682f0 100644
--- a/test/org/apache/jasper/compiler/TestParser.java
+++ b/test/org/apache/jasper/compiler/TestParser.java
@@ -97,7 +97,7 @@ public class TestParser extends TomcatBaseTest {
         getTomcatInstanceTestWebapp(false, true);
 
         int sc = getUrl("http://localhost:"; + getPort() +
-                "/test/bug49nnn/bug49297NoSpace.jsp", new ByteChunk(), null);
+                "/test/bug49nnn/bug49297NoSpaceStrict.jsp", new ByteChunk(), 
null);
 
         Assert.assertEquals(500, sc);
     }
diff --git a/test/webapp/WEB-INF/web.xml b/test/webapp/WEB-INF/web.xml
index 5797ee1..4a7aa78 100644
--- a/test/webapp/WEB-INF/web.xml
+++ b/test/webapp/WEB-INF/web.xml
@@ -67,6 +67,14 @@
     <dispatcher>INCLUDE</dispatcher>
   </filter-mapping>
   <servlet>
+    <servlet-name>bug49297NoSpace</servlet-name>
+    <jsp-file>/bug49nnn/bug49297NoSpace.jsp</jsp-file>
+      <init-param>
+        <param-name>strictWhitespace</param-name>
+        <param-value>false</param-value>
+      </init-param>
+  </servlet>
+  <servlet>
     <servlet-name>Bug49922Forward</servlet-name>
     <servlet-class>
       org.apache.catalina.core.TestStandardContext$Bug49922ForwardServlet
diff --git a/test/webapp/bug49nnn/bug49297NoSpaceStrict.jsp 
b/test/webapp/bug49nnn/bug49297NoSpaceStrict.jsp
new file mode 100644
index 0000000..5a857c3
--- /dev/null
+++ b/test/webapp/bug49nnn/bug49297NoSpaceStrict.jsp
@@ -0,0 +1,23 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
+<html>
+  <head><title>Bug 49297 whitespace test case</title></head>
+  <body>
+    <tags:echo echo="Hello World"dummy="ignored"/>
+  </body>
+</html>
\ No newline at end of file
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index f98667e..26756f6 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -164,6 +164,10 @@
         does not support these values, a warning will be logged and the latest
         supported version will used. (markt)
       </add>
+      <update>
+        Remove many rarely used Jasper system property configuration,
+        replaced by a new set of init parameters. (remm)
+      </update>
     </changelog>
   </subsection>
   <subsection name="Web applications">
diff --git a/webapps/docs/config/systemprops.xml 
b/webapps/docs/config/systemprops.xml
index 0a216b6..b5b7c55 100644
--- a/webapps/docs/config/systemprops.xml
+++ b/webapps/docs/config/systemprops.xml
@@ -116,50 +116,6 @@
 <section name="Jasper">
   <properties>
 
-    <property name="org.apache.jasper.compiler. 
Generator.POOL_TAGS_WITH_EXTENDS">
-      <p>By default, JSPs that use their own base class via the extends
-      attribute of the page directive, will have Tag pooling disabled since
-      Jasper cannot guarantee that the necessary initialisation will have taken
-      place. This can have a negative impact on performance. Providing the
-      alternative base class calls _jspInit() from Servlet.init(), setting  
this
-      property to <code>true</code> will enable pooling with an alternative 
base
-      class. If the alternative base class does not call _jspInit() and this
-      property is <code>true</code>, NPEs will occur when attempting to use
-      tags.</p>
-      <p>If not specified, the default value of <code>false</code> will be 
used.
-      </p>
-    </property>
-
-    <property name="org.apache.jasper.compiler. Generator.STRICT_GET_PROPERTY">
-      <p>If <code>true</code>, the requirement to have the object referenced in
-      <code>jsp:getProperty</code> action to be previously "introduced"
-      to the JSP processor, as specified in the chapter JSP.5.3 of JSP 2.0 and
-      later specifications, is enforced.</p>
-      <p>If not specified, the specification compliant default of
-      <code>true</code> will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.compiler. 
Generator.VAR_EXPRESSIONFACTORY">
-      <p>The name of the variable to use for the expression language expression
-      factory.</p>
-      <p>If not specified, the default value of 
<code>_el_expressionfactory</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.compiler. Generator.VAR_INSTANCEMANAGER">
-      <p>The name of the variable to use for the instance manager factory.</p>
-      <p>If not specified, the default value of 
<code>_jsp_instancemanager</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.compiler. Parser.STRICT_WHITESPACE">
-      <p>If <code>false</code> the requirements for whitespace before an
-      attribute name will be relaxed so that the lack of whitespace will not
-      cause an error.</p>
-      <p>If not specified, the specification compliant default of
-      <code>true</code> will be used.</p>
-    </property>
-
     <property name="org.apache.jasper.runtime. BodyContentImpl.BUFFER_SIZE">
       <p>The size (in characters) to use when creating a tag buffer.</p>
       <p>If not specified, the default value of
@@ -185,75 +141,6 @@
       <p>If not specified, the default value of <code>8</code> will be 
used.</p>
     </property>
 
-    <property name="org.apache.jasper.Constants. JSP_SERVLET_BASE">
-      <p>The base class of the Servlets generated from the JSPs.</p>
-      <p>If not specified, the default value of
-      <code>org.apache.jasper.runtime.HttpJspBase</code> will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. SERVICE_METHOD_NAME">
-      <p>The name of the service method called by the base class.</p>
-      <p>If not specified, the default value of <code>_jspService</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. SERVLET_CLASSPATH">
-      <p>The name of the ServletContext attribute that provides the classpath
-      for the JSP.</p>
-      <p>If not specified, the default value of
-      <code>org.apache.catalina.jsp_classpath</code> will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. JSP_FILE">
-      <p>The name of the request attribute for <code>&lt;jsp-file&gt;</code>
-      element of a servlet definition. If present on a request, this overrides
-      the value returned by <code>request.getServletPath()</code> to select the
-      JSP page to be executed.</p>
-      <p>If not specified, the default value of
-      <code>org.apache.catalina.jsp_file</code> will be used.</p>
-      <p><strong>Deprecated:</strong> This will be removed in Tomcat 9.0.x
-      onwards. It is replaced by the use of the jspFile servlet initialisation
-      parameter</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. PRECOMPILE">
-      <p>The name of the query parameter that causes the JSP engine to just
-      pregenerate the servlet but not invoke it.</p>
-      <p>If not specified, the default value of <code>jsp_precompile</code>
-      will be used, as defined by JSP specification (JSP.11.4.2).</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. JSP_PACKAGE_NAME">
-      <p>The default package name for compiled JSPs.</p>
-      <p>If not specified, the default value of <code>org.apache.jsp</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. TAG_FILE_PACKAGE_NAME">
-      <p>The default package name for tag handlers generated from tag 
files.</p>
-      <p>If not specified, the default value of <code>org.apache.jsp.tag</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. ALT_DD_ATTR">
-      <p>The servlet context attribute under which the alternate deployment
-      descriptor for this web application is stored.</p>
-      <p>If not specified, the default value of
-      <code>org.apache.catalina.deploy.alt_dd</code> will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. TEMP_VARIABLE_NAME_PREFIX">
-      <p>Prefix to use for generated temporary variable names.</p>
-      <p>If not specified, the default value of <code>_jspx_temp</code>
-      will be used.</p>
-    </property>
-
-    <property name="org.apache.jasper.Constants. 
USE_INSTANCE_MANAGER_FOR_TAGS">
-      <p>If <code>true</code>, the instance manager is used to obtain tag
-      handler instances.</p>
-      <p>If not specified, the default value of <code>false</code> will be 
used.</p>
-    </property>
-
   </properties>
 
 </section>
diff --git a/webapps/docs/jasper-howto.xml b/webapps/docs/jasper-howto.xml
index 2c8616e..0a91cd0 100644
--- a/webapps/docs/jasper-howto.xml
+++ b/webapps/docs/jasper-howto.xml
@@ -211,6 +211,74 @@ characters be strictly applied? <code>true</code> or 
<code>false</code>, default
 on a JSP page, should the rules for quoting of attributes described in JSP.1.6
 be applied to the expression? <code>true</code> or <code>false</code>, default
 <code>true</code>.</li>
+
+<li><strong>variableForExpressionFactory</strong> - The name of the variable
+ to use for the expression language expression factory. If not specified, the
+  default value of <code>_el_expressionfactory</code> will be used.</li>
+
+<li><strong>variableForInstanceManager</strong> - The name of the variable
+ to use for the instance manager factory. If not specified, the default value
+ of <code>_jsp_instancemanager</code> will be used.</li>
+
+<li><strong>poolTagsWithExtends</strong> - By default, JSPs that use
+ their own base class via the extends
+ attribute of the page directive, will have Tag pooling disabled since
+ Jasper cannot guarantee that the necessary initialisation will have taken
+ place. This can have a negative impact on performance. Providing the
+ alternative base class calls _jspInit() from Servlet.init(), setting  this
+ property to <code>true</code> will enable pooling with an alternative base
+ class. If the alternative base class does not call _jspInit() and this
+ property is <code>true</code>, NPEs will occur when attempting to use
+ tags. <code>true</code> or <code>false</code>, default
+ <code>false</code>.</li>
+
+<li><strong>strictGetProperty</strong> - If <code>true</code>, the requirement
+ to have the object referenced in
+ <code>jsp:getProperty</code> action to be previously "introduced"
+ to the JSP processor, as specified in the chapter JSP.5.3 of JSP 2.0 and
+ later specifications, is enforced. <code>true</code> or <code>false</code>, 
default
+ <code>true</code>.</li>
+
+<li><strong>strictWhitespace</strong> - If <code>false</code> the requirements
+ for whitespace before an
+ attribute name will be relaxed so that the lack of whitespace will not
+ cause an error. <code>true</code> or <code>false</code>, default
+ <code>true</code>.</li>
+
+<li><strong>jspServletBase</strong> - The base class of the Servlets generated
+ from the JSPs.If not specified, the default value of
+ <code>org.apache.jasper.runtime.HttpJspBase</code> will be used.</li>
+
+<li><strong>serviceMethodName</strong> - The name of the service method
+ called by the base class. If not specified, the default value of
+ <code>_jspService</code> will be used.</li>
+
+<li><strong>servletClasspathAttribute</strong> - The name of the ServletContext
+ attribute that provides the classpath for the JSP. If not specified, the 
default
+ value of <code>org.apache.catalina.jsp_classpath</code> will be used.</li>
+
+<li><strong>jspPrecompilationQueryParameter</strong> - The name of the query
+ parameter that causes the JSP engine to just pregenerate the servlet but
+ not invoke it. If not specified, the default value of
+ <code>jsp_precompile</code> will be used, as defined by JSP specification
+ (JSP.11.4.2).</li>
+
+<li><strong>generatedJspPackageName</strong> - The default package name
+ for compiled JSPs. If not specified, the default value of
+ <code>org.apache.jsp</code> will be used.</li>
+
+<li><strong>generatedTagFilePackageName</strong> - The default package name
+ for tag handlers generated from tag files. If not specified, the default
+ value of <code>org.apache.jsp.tag</code> will be used.</li>
+
+<li><strong>tempVariableNamePrefix</strong> - Prefix to use for generated
+ temporary variable names. If not specified, the default value of
+ <code>_jspx_temp</code> will be used.</li>
+
+<li><strong>useInstanceManagerForTags</strong> - If <code>true</code>,
+ the instance manager is used to obtain tag handler instances.
+ <code>true</code> or <code>false</code>, default <code>false</code>.</li>
+
 </ul>
 
 <p>The Java compiler from Eclipse JDT in included as the default compiler. It 
is


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to