You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/02/28 21:18:05 UTC

svn commit: r1784818 - in /tomcat/trunk: java/javax/servlet/ java/org/apache/catalina/core/ java/org/apache/jasper/servlet/ test/org/apache/tomcat/unittest/

Author: markt
Date: Tue Feb 28 21:18:04 2017
New Revision: 1784818

URL: http://svn.apache.org/viewvc?rev=1784818&view=rev
Log:
Servlet 4.0
Implement dynamic registration of JSP files as servlets

Modified:
    tomcat/trunk/java/javax/servlet/ServletContext.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContextFacade.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
    tomcat/trunk/test/org/apache/tomcat/unittest/TesterServletContext.java

Modified: tomcat/trunk/java/javax/servlet/ServletContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletContext.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/ServletContext.java (original)
+++ tomcat/trunk/java/javax/servlet/ServletContext.java Tue Feb 28 21:18:04 2017
@@ -613,6 +613,20 @@ public interface ServletContext {
             Class<? extends Servlet> servletClass);
 
     /**
+     *
+     * @param jspName   The servlet name under which this JSP file should be
+     *                  registered
+     * @param jspFile   The path, relative to the web application root, for the
+     *                  JSP file to be used for this servlet
+     *
+     * @return  a {@link javax.servlet.ServletRegistration.Dynamic} object
+     *          that can be used to further configure the servlet
+     *
+     * @since Servlet 4.0
+     */
+    public ServletRegistration.Dynamic addJspFile(String jspName, String jspFile);
+
+    /**
      * TODO SERVLET3 - Add comments
      * @param <T> TODO
      * @param c   TODO

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Tue Feb 28 21:18:04 2017
@@ -46,6 +46,7 @@ import javax.servlet.ServletContextAttri
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.ServletRequestAttributeListener;
 import javax.servlet.ServletRequestListener;
 import javax.servlet.SessionCookieConfig;
@@ -829,25 +830,61 @@ public class ApplicationContext implemen
 
     @Override
     public ServletRegistration.Dynamic addServlet(String servletName, String className) {
-        return addServlet(servletName, className, null);
+        return addServlet(servletName, className, null, null);
     }
 
 
     @Override
     public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet) {
-        return addServlet(servletName, null, servlet);
+        return addServlet(servletName, null, servlet, null);
     }
 
 
     @Override
     public ServletRegistration.Dynamic addServlet(String servletName,
             Class<? extends Servlet> servletClass) {
-        return addServlet(servletName, servletClass.getName(), null);
+        return addServlet(servletName, servletClass.getName(), null, null);
     }
 
 
-    private ServletRegistration.Dynamic addServlet(String servletName,
-            String servletClass, Servlet servlet) throws IllegalStateException {
+    @Override
+    public Dynamic addJspFile(String jspName, String jspFile) {
+
+        // jspName is validated in addServlet()
+        if (jspFile == null || !jspFile.startsWith("/")) {
+            throw new IllegalArgumentException(
+                    sm.getString("applicationContext.addJspFile.iae", jspFile));
+        }
+
+        String jspServletClassName = null;
+        Map<String,String> jspFileInitParams = new HashMap<>();
+
+        Wrapper jspServlet = (Wrapper) context.findChild("jsp");
+
+        if (jspServlet == null) {
+            // No JSP servlet currently defined.
+            // Use default JSP Servlet class name
+            jspServletClassName = Constants.JSP_SERVLET_CLASS;
+        } else {
+            // JSP Servlet defined.
+            // Use same JSP Servlet class name
+            jspServletClassName = jspServlet.getServletClass();
+            // Use same init parameters
+            String[] params = jspServlet.findInitParameters();
+            for (String param : params) {
+                jspFileInitParams.put(param, jspServlet.findInitParameter(param));
+            }
+        }
+
+        // Add init parameter to specify JSP file
+        jspFileInitParams.put("jspFile", jspFile);
+
+        return addServlet(jspName, jspServletClassName, null, jspFileInitParams);
+    }
+
+
+    private ServletRegistration.Dynamic addServlet(String servletName, String servletClass,
+            Servlet servlet, Map<String,String> initParams) throws IllegalStateException {
 
         if (servletName == null || servletName.equals("")) {
             throw new IllegalArgumentException(sm.getString(
@@ -887,6 +924,12 @@ public class ApplicationContext implemen
             wrapper.setServlet(servlet);
         }
 
+        if (initParams != null) {
+            for (Map.Entry<String, String> initParam: initParams.entrySet()) {
+                wrapper.addInitParameter(initParam.getKey(), initParam.getValue());
+            }
+        }
+
         return context.dynamicServletAdded(wrapper);
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContextFacade.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContextFacade.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContextFacade.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContextFacade.java Tue Feb 28 21:18:04 2017
@@ -41,6 +41,7 @@ import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.SessionCookieConfig;
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.descriptor.JspConfigDescriptor;
@@ -536,6 +537,17 @@ public class ApplicationContextFacade im
         }
     }
 
+
+    @Override
+    public Dynamic addJspFile(String jspName, String jspFile) {
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            return (ServletRegistration.Dynamic) doPrivileged("addJspFile",
+                    new Object[]{jspName, jspFile});
+        } else {
+            return context.addJspFile(jspName, jspFile);
+        }
+    }
+
 
     @Override
     @SuppressWarnings("unchecked") // doPrivileged() returns the correct type

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Tue Feb 28 21:18:04 2017
@@ -14,6 +14,7 @@
 # limitations under the License.
 
 applicationContext.addFilter.ise=Filters cannot be added to context {0} as the context has been initialised
+applicationContext.addJspFile.iae=The JSP file [{0}] is not valid
 applicationContext.addListener.iae.cnfe=Unable to create an instance of type [{0}]
 applicationContext.addListener.iae.init=Unable to add an instance of type [{0}] as a listener
 applicationContext.addListener.iae.wrongType=The type specified [{0}] is not one of the expected listener types

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Feb 28 21:18:04 2017
@@ -6567,6 +6567,12 @@ public class StandardContext extends Con
         }
 
         @Override
+        public Dynamic addJspFile(String jspName, String jspFile) {
+            throw new UnsupportedOperationException(
+                    sm.getString("noPluggabilityServletContext.notAllowed"));
+        }
+
+        @Override
         public <T extends Servlet> T createServlet(Class<T> c)
                 throws ServletException {
             throw new UnsupportedOperationException(

Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java (original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java Tue Feb 28 21:18:04 2017
@@ -588,6 +588,12 @@ public class JspCServletContext implemen
 
 
     @Override
+    public javax.servlet.ServletRegistration.Dynamic addJspFile(String jspName, String jspFile) {
+        return null;
+    }
+
+
+    @Override
     public <T extends Filter> T createFilter(Class<T> c)
             throws ServletException {
         return null;

Modified: tomcat/trunk/test/org/apache/tomcat/unittest/TesterServletContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/unittest/TesterServletContext.java?rev=1784818&r1=1784817&r2=1784818&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/unittest/TesterServletContext.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/unittest/TesterServletContext.java Tue Feb 28 21:18:04 2017
@@ -227,6 +227,11 @@ public class TesterServletContext implem
     }
 
     @Override
+    public Dynamic addJspFile(String jspName, String jspFile) {
+        throw new RuntimeException("Not implemented");
+    }
+
+    @Override
     public <T extends Servlet> T createServlet(Class<T> c)
             throws ServletException {
         throw new RuntimeException("Not implemented");



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