Thans, Kin-Man! - Mark
On Tue, 2002-08-20 at 11:50, [EMAIL PROTECTED] wrote: > kinman 2002/08/20 08:50:23 > > Modified: jasper2/src/share/org/apache/jasper JspC.java > jasper2/src/share/org/apache/jasper/compiler Generator.java > ImplicitTagLibraryInfo.java Parser.java > ParserController.java TagFileProcessor.java > jasper2/src/share/org/apache/jasper/resources > messages.properties > Log: > - Submitted by Mark Roth: > > - Implemented the value attribute of jsp:doBody for classic > tag handlers. > - Stubbed out JspC with getJspConfig() so it compiles. > - Added null check for addInclude() to handle the case where there > are no preludes or codas. > - Now accepts /WEB-INF/tags as well as /WEB-INF/tags/ for tag file > default directory. > - ParserController now uses path name to determine if the given > element is a tag file instead of searching for tag directive. > - In a tag file, an attribute directive with a fragment attribute > must not allow a rtexprvalue attribute, and must fix its value > to "true". Fixed implementation to comply with spec. > - Fixed preamble and postamble generator for Tag Files. Was not > generating declarations, tag handler pools, methods buffer, > helper fragment, etc. Generator now shares code between servlet > and tag handler pre and post ambles. > - Even though spec is not clear that they're required, > added implicit objects to doTag() so they are available in > tag files. > > Revision Changes Path > 1.13 +13 -3 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspC.java > > Index: JspC.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspC.java,v > retrieving revision 1.12 > retrieving revision 1.13 > diff -u -r1.12 -r1.13 > --- JspC.java 26 Jun 2002 16:50:38 -0000 1.12 > +++ JspC.java 20 Aug 2002 15:50:22 -0000 1.13 > @@ -75,6 +75,7 @@ > > import org.apache.jasper.logging.Logger; > import org.apache.jasper.logging.JasperLogger; > +import org.apache.jasper.compiler.JspConfig; > > /** > * Shell for the jspc compiler. Handles all options associated with the > @@ -912,6 +913,15 @@ > > Constants.jasperLog.setVerbosityLevel(verbosityLevel); > } > + > + /** > + * Obtain JSP configuration informantion specified in web.xml. > + */ > + public JspConfig getJspConfig() { > + // XXX - Stubbed out so Jasper compiles. > + initServletContext(); > + return new JspConfig( context ); > + } > > } > > > > > 1.72 +240 -97 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java > > Index: Generator.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v > retrieving revision 1.71 > retrieving revision 1.72 > diff -u -r1.71 -r1.72 > --- Generator.java 20 Aug 2002 01:42:38 -0000 1.71 > +++ Generator.java 20 Aug 2002 15:50:22 -0000 1.72 > @@ -170,6 +170,7 @@ > > out.println(); > page.visit(new DeclarationVisitor()); > + out.println(); > } > > /** > @@ -329,23 +330,25 @@ > } > > /** > - * Generates the beginning of the static portion of the servelet. > + * Generate preamble package name > + * (shared by servlet and tag handler preamble generation) > */ > - private void generatePreamble(Node.Nodes page) throws JasperException { > - > - String servletPackageName = ctxt.getServletPackageName(); > - String servletClassName = ctxt.getServletClassName(); > - String serviceMethodName = Constants.SERVICE_METHOD_NAME; > - > - // First the package name: > - > - if (! "".equals(servletPackageName) && servletPackageName != null) { > - out.printil("package " + servletPackageName + ";"); > + private void genPreamblePackage( String packageName ) > + throws JasperException > + { > + if (! "".equals(packageName) && packageName != null) { > + out.printil("package " + packageName + ";"); > out.println(); > } > - > - // Generate imports > - > + } > + > + /** > + * Generate preamble imports > + * (shared by servlet and tag handler preamble generation) > + */ > + private void genPreambleImports() > + throws JasperException > + { > Iterator iter = pageInfo.getImports().iterator(); > while (iter.hasNext()) { > out.printin("import "); > @@ -353,31 +356,21 @@ > out.println(";"); > } > out.println(); > + } > > - // Generate class declaration > - > - out.printin("public class "); > - out.print (servletClassName); > - out.print (" extends "); > - out.print (pageInfo.getExtends()); > - if (!pageInfo.isThreadSafe()) { > - out.print("implements SingleThreadModel"); > - } > - out.println(" {"); > - out.pushIndent(); > - > - // Class body begins here > - > - generateDeclarations(page); > - out.println(); > - > - // Static initializations here > - > + /** > + * Generation of static initializers in preamble. > + * For example, include list, el function map, prefix map. > + * (shared by servlet and tag handler preamble generation) > + */ > + private void genPreambleStaticInitializers() > + throws JasperException > + { > // Static data for getIncludes() > out.printil("private static java.util.Vector _jspx_includes;"); > out.println(); > List includes = pageInfo.getIncludes(); > - iter = includes.iterator(); > + Iterator iter = includes.iterator(); > if( !includes.isEmpty() ) { > out.printil("static {"); > out.pushIndent(); > @@ -397,13 +390,16 @@ > // Static data for EL function and prefix maps: > generateELFunctionMap(); > generatePrefixMap(); > + } > > - // Class variable declarations > - > - /* > - * Declare tag handler pools (tags of the same type and with the same > - * attribute set share the same tag handler pool) > - */ > + /** > + * Declare tag handler pools (tags of the same type and with the same > + * attribute set share the same tag handler pool) > + * (shared by servlet and tag handler preamble generation) > + */ > + private void genPreambleClassVariableDeclarations( String className ) > + throws JasperException > + { > if (ctxt.getOptions().isPoolingEnabled() > && !tagHandlerPoolNames.isEmpty()) { > for (int i=0; i<tagHandlerPoolNames.size(); i++) { > @@ -416,11 +412,17 @@ > // Constructor > if (ctxt.getOptions().isPoolingEnabled() > && !tagHandlerPoolNames.isEmpty()) { > - generateServletConstructor(servletClassName); > + generateConstructor(className); > } > - > - // Methods here > + } > > + /** > + * Declare general-purpose methods > + * (shared by servlet and tag handler preamble generation) > + */ > + private void genPreambleMethods() > + throws JasperException > + { > // Method used to get compile time include file dependencies > out.printil("public java.util.List getIncludes() {"); > out.pushIndent(); > @@ -433,6 +435,45 @@ > && !tagHandlerPoolNames.isEmpty()) { > generateDestroy(); > } > + } > + > + /** > + * Generates the beginning of the static portion of the servelet. > + */ > + private void generatePreamble(Node.Nodes page) throws JasperException { > + > + String servletPackageName = ctxt.getServletPackageName(); > + String servletClassName = ctxt.getServletClassName(); > + String serviceMethodName = Constants.SERVICE_METHOD_NAME; > + > + // First the package name: > + genPreamblePackage( servletPackageName ); > + > + // Generate imports > + genPreambleImports(); > + > + // Generate class declaration > + out.printin("public class "); > + out.print (servletClassName); > + out.print (" extends "); > + out.print (pageInfo.getExtends()); > + if (!pageInfo.isThreadSafe()) { > + out.print("implements SingleThreadModel"); > + } > + out.println(" {"); > + out.pushIndent(); > + > + // Class body begins here > + generateDeclarations(page); > + > + // Static initializations here > + genPreambleStaticInitializers(); > + > + // Class variable declarations > + genPreambleClassVariableDeclarations( servletClassName ); > + > + // Methods here > + genPreambleMethods(); > > // Now the service method > out.printin("public void "); > @@ -668,10 +709,11 @@ > } > > /* > - * Generates the servlet constructor. > + * Generates the constructor. > + * (shared by servlet and tag handler preamble generation) > */ > - private void generateServletConstructor(String servletClassName) { > - out.printil("public " + servletClassName + "() {"); > + private void generateConstructor(String className) { > + out.printil("public " + className + "() {"); > out.pushIndent(); > for (int i=0; i<tagHandlerPoolNames.size(); i++) { > out.printin((String) tagHandlerPoolNames.elementAt(i)); > @@ -1699,11 +1741,11 @@ > } > > public void visit(Node.JspBody n) throws JasperException { > + Node.JspAttribute value = n.getValue(); > if (isSimpleTagHandler) { > out.printin(simpleTagHandlerVar); > out.print(".setJspBody("); > > - Node.JspAttribute value = n.getValue(); > if (value != null) { > out.print(attributeValue(value, false, JspFragment.class, > "null" )); > @@ -1712,7 +1754,63 @@ > } > out.println(");"); > } else { > - visitBody(n); > + Node parent = n.getParent(); > + if( (parent instanceof Node.CustomTag) && (value != null) ) { > + Node.CustomTag customTag = (Node.CustomTag)parent; > + > + // Classic tag handler invoked with <jsp:body value="..."> > + // Generate a tag body that evaluates the given > + // fragment. > + > + // First, generate a Map with all the AT_BEGIN and > + // NESTED variables so the body can access them. > + VariableInfo[] varInfos = customTag.getVariableInfos(); > + TagVariableInfo[] tagVarInfos = > + customTag.getTagVariableInfos(); > + > + String var = JspUtil.nextTemporaryVariableName(); > + out.printil( "java.util.HashMap " + var + > + " = new java.util.HashMap();" ); > + > + if( varInfos != null ) { > + for( int i = 0; i < varInfos.length; i++ ) { > + if( (varInfos[i].getScope() == > + VariableInfo.AT_BEGIN) || > + (varInfos[i].getScope() == > + VariableInfo.NESTED) ) > + { > + out.printil( var + ".put( \"" + > + varInfos[i].getVarName() + "\", " + > + varInfos[i].getVarName() + " );" ); > + } > + } > + } > + > + if( tagVarInfos != null ) { > + for( int i = 0; i < tagVarInfos.length; i++ ) { > + if( (tagVarInfos[i].getScope() == > + VariableInfo.AT_BEGIN) || > + (tagVarInfos[i].getScope() == > + VariableInfo.NESTED) ) > + { > + out.printin( var + ".put( \"" ); > + String name = tagVarInfos[i].getNameGiven(); > + if( name == null ) { > + name = customTag.getTagData(). > + getAttributeString( > + tagVarInfos[i].getNameFromAttribute()); > + } > + out.println( name + "\", " + name + " );" ); > + } > + } > + } > + > + out.printil("(" + > + attributeValue(value, false, JspFragment.class, > + "null" ) + ").invoke( out, " + var + " );" ); > + } else { > + visitBody(n); > + } > } > } > > @@ -2675,6 +2773,29 @@ > } > > /** > + * Common part of postamble, shared by both servlets and tag files. > + */ > + private void genCommonPostamble() { > + // Append any methods that were generated > + out.print(methodsBuffer.toString()); > + > + // Append the helper class > + if( fragmentHelperClass.isUsed() ) { > + fragmentHelperClass.generatePostamble(); > + out.printMultiLn(fragmentHelperClass.toString()); > + } > + > + // generate class definition for JspxState > + if (maxTagNesting > 0) { > + generateJspState(); > + } > + > + // Close the class definition > + out.popIndent(); > + out.printil("}"); > + } > + > + /** > * Generates the ending part of the static portion of the servlet. > */ > private void generatePostamble(Node.Nodes page) { > @@ -2703,23 +2824,8 @@ > out.popIndent(); > out.printil("}"); > > - // Append any methods that were generated > - out.print(methodsBuffer.toString()); > - > - // Append the helper class > - if( fragmentHelperClass.isUsed() ) { > - fragmentHelperClass.generatePostamble(); > - out.printMultiLn(fragmentHelperClass.toString()); > - } > - > - // generate class definition for JspxState > - if (maxTagNesting > 0) { > - generateJspState(); > - } > - > - // Close the class definition > - out.popIndent(); > - out.printil("}"); > + // Generated methods, helper classes, etc. > + genCommonPostamble(); > } > > /** > @@ -2751,17 +2857,17 @@ > > Generator gen = new Generator(out, compiler); > > + if (gen.ctxt.getOptions().isPoolingEnabled()) { > + gen.compileTagHandlerPoolList(page); > + } > if (gen.ctxt.isTagFile()) { > TagInfo tagInfo = gen.ctxt.getTagInfo(); > - gen.generateTagHandlerPreamble(tagInfo); > + gen.generateTagHandlerPreamble(tagInfo, page); > page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, > gen.methodsBuffer, null, > tagInfo)); > gen.generateTagHandlerPostamble(); > } else { > - if (gen.ctxt.getOptions().isPoolingEnabled()) { > - gen.compileTagHandlerPoolList(page); > - } > gen.generatePreamble(page); > gen.fragmentHelperClass.generatePreamble(); > page.visit(gen.new GenerateVisitor(gen.ctxt.isTagFile(), out, > @@ -2774,28 +2880,20 @@ > /* > * XXX > */ > - private void generateTagHandlerPreamble(TagInfo tagInfo) > - throws JasperException { > + private void generateTagHandlerPreamble(TagInfo tagInfo, Node.Nodes tag ) > + throws JasperException > + { > > // Generate package declaration > String className = tagInfo.getTagClassName(); > if (className.indexOf('.') != -1) { > String pkgName > = className.substring(0, className.lastIndexOf(".")); > - out.printin("package "); > - out.print(pkgName); > - out.println(";"); > - out.println(); > + genPreamblePackage( pkgName ); > } > > // Generate imports > - Iterator iter = pageInfo.getImports().iterator(); > - while (iter.hasNext()) { > - out.printin("import "); > - out.print ((String)iter.next()); > - out.println(";"); > - } > - out.println(); > + genPreambleImports(); > > // Generate class declaration > out.printin("public class "); > @@ -2808,19 +2906,45 @@ > out.pushIndent(); > > // Class body begins here > + generateDeclarations(tag); > > - // Static data for EL function and prefix maps: > - generateELFunctionMap(); > - generatePrefixMap(); > + // Static initializations here > + genPreambleStaticInitializers(); > > + // Class variable declarations > + genPreambleClassVariableDeclarations( tagInfo.getTagName() ); > + > + // Tag-handler specific declarations: > generateTagHandlerDeclarations(tagInfo); > > if (tagInfo.hasDynamicAttributes()) > generateSetDynamicAttribute(); > > + // Methods here > + genPreambleMethods(); > + > + // Now the doTag() method > out.printil("public void doTag() throws javax.servlet.jsp.JspException {"); > out.pushIndent(); > out.printil("PageContext pageContext = new >JspContextWrapper(getJspContext());"); > + > + // Declare implicit objects. > + // XXX - Note that the current JSP 2.0 PFD > + // spec is unclear about whether these are required > + // XXX - Optimization: Check scriptlets and expressions for the > + // use of any of these. They're not likely to be used. If they're > + // not used, get rid of them. > + out.printil( "javax.servlet.ServletRequest request = " + > + "pageContext.getRequest();" ); > + out.printil( "javax.servlet.ServletResponse response = " + > + "pageContext.getResponse();" ); > + out.printil( "javax.servlet.http.HttpSession session = " + > + "pageContext.getSession();" ); > + out.printil( "javax.servlet.ServletContext application = " + > + "pageContext.getServletContext();" ); > + out.printil("javax.servlet.ServletConfig config = " + > + "pageContext.getServletConfig();"); > + > // Declare parameter map for fragment/body invocation > out.printil("java.util.Map _jspx_params = null;"); > > @@ -2830,21 +2954,40 @@ > > out.printil("javax.servlet.jsp.JspWriter out = pageContext.getOut();"); > generatePageScopedVariables(tagInfo); > + > + // Number of tag object that need to be popped > + // XXX TODO: use a better criteria > + maxTagNesting = pageInfo.getMaxTagNesting(); > + > + declareTemporaryScriptingVars(tag); > + out.println(); > + > out.printil("try {"); > out.pushIndent(); > } > > private void generateTagHandlerPostamble() { > out.popIndent(); > - out.printil("} catch (java.io.IOException ioe) {"); > - out.pushIndent(); > - out.printil("throw new javax.servlet.jsp.JspException(ioe);"); > - out.popIndent(); > - out.printil("}"); > - out.popIndent(); > - out.printil("}"); > - out.popIndent(); > - out.printil("}"); > + //out.printil("} catch (java.io.IOException ioe) {"); > + //out.pushIndent(); > + //out.printil("throw new javax.servlet.jsp.JspException(ioe);"); > + //out.popIndent(); > + //out.printil("}"); > + > + // Have to catch Throwable because a classic tag handler > + // helper method is declared to throw Throwable. > + out.printil( "} catch( Throwable t ) {" ); > + out.pushIndent(); > + out.printil("throw new javax.servlet.jsp.JspException(t);" ); > + out.popIndent(); > + out.printil( "}" ); > + > + // Close the doTag method > + out.popIndent(); > + out.printil("}"); > + > + // Generated methods, helper classes, etc. > + genCommonPostamble(); > } > > /** > > > > 1.7 +7 -5 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java > > Index: ImplicitTagLibraryInfo.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java,v > retrieving revision 1.6 > retrieving revision 1.7 > diff -u -r1.6 -r1.7 > --- ImplicitTagLibraryInfo.java 19 Aug 2002 23:06:01 -0000 1.6 > +++ ImplicitTagLibraryInfo.java 20 Aug 2002 15:50:22 -0000 1.7 > @@ -76,7 +76,7 @@ > */ > public class ImplicitTagLibraryInfo extends TagLibraryInfo { > > - private static final String WEB_INF_TAGS = "/WEB-INF/tags/"; > + private static final String WEB_INF_TAGS = "/WEB-INF/tags"; > private static final String TAG_FILE_SUFFIX = ".tag"; > private static final String TAGS_SHORTNAME = "tags"; > private static final String TLIB_VERSION = "1.0"; > @@ -101,7 +101,9 @@ > > // Determine the value of the <short-name> subelement of the > // "imaginary" <taglib> element > - if (tagdir.equals(WEB_INF_TAGS)) { > + if (tagdir.equals(WEB_INF_TAGS) || > + tagdir.equals( WEB_INF_TAGS + "/" ) ) > + { > shortname = TAGS_SHORTNAME; > } else { > shortname = tagdir.substring(WEB_INF_TAGS.length()); > > > > 1.23 +16 -14 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java > > Index: Parser.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java,v > retrieving revision 1.22 > retrieving revision 1.23 > diff -u -r1.22 -r1.23 > --- Parser.java 20 Aug 2002 03:52:18 -0000 1.22 > +++ Parser.java 20 Aug 2002 15:50:22 -0000 1.23 > @@ -372,17 +372,19 @@ > * and include-coda of jsp-config element in web.xml > */ > private void addInclude(Node parent, List files) throws JasperException { > - Iterator iter = files.iterator(); > - while (iter.hasNext()) { > - String file = (String) iter.next(); > - AttributesImpl attrs = new AttributesImpl(); > - attrs.addAttribute("", "file", "file", "CDATA", file); > + if( files != null ) { > + Iterator iter = files.iterator(); > + while (iter.hasNext()) { > + String file = (String) iter.next(); > + AttributesImpl attrs = new AttributesImpl(); > + attrs.addAttribute("", "file", "file", "CDATA", file); > > - // Create a dummy Include directive node > - Node includeNode = new Node.IncludeDirective(attrs, reader.mark(), > - parent); > - processIncludeDirective(file, includeNode); > - } > + // Create a dummy Include directive node > + Node includeNode = new Node.IncludeDirective(attrs, > + reader.mark(), parent); > + processIncludeDirective(file, includeNode); > + } > + } > } > > /* > > > > 1.12 +8 -5 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java > > Index: ParserController.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java,v > retrieving revision 1.11 > retrieving revision 1.12 > diff -u -r1.11 -r1.12 > --- ParserController.java 20 Aug 2002 03:52:18 -0000 1.11 > +++ ParserController.java 20 Aug 2002 15:50:22 -0000 1.12 > @@ -278,12 +278,15 @@ > // FIXME: We assume xml parser will take care of > // encoding for page in XML syntax. Correct? > if (!isXml) { > - jspReader.reset(startMark); > - while (jspReader.skipUntil("<%@") != null) { > + // Note: this currently assumes there is no XML syntax for tag > + // files (as of PFD of the JSP 2.0 spec there is an XML view, > + // but no XML syntax). > + isTagFile = file.startsWith( "/WEB-INF/tags" ) || > + file.startsWith( "/META-INF/tags" ); > + jspReader.reset(startMark); > + while (jspReader.skipUntil("<%@") != null) { > jspReader.skipSpaces(); > - boolean tIsTagFile = jspReader.matches("tag "); > - if (tIsTagFile || jspReader.matches("page")) { > - isTagFile = tIsTagFile; > + if (jspReader.matches( "tag " ) || jspReader.matches("page")) { > jspReader.skipSpaces(); > Attributes attrs = Parser.parseAttributes(this, jspReader); > String attribute = "pageEncoding"; > > > > 1.14 +12 -4 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java > > Index: TagFileProcessor.java > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java,v > retrieving revision 1.13 > retrieving revision 1.14 > diff -u -r1.13 -r1.14 > --- TagFileProcessor.java 19 Aug 2002 23:06:01 -0000 1.13 > +++ TagFileProcessor.java 20 Aug 2002 15:50:22 -0000 1.14 > @@ -181,15 +181,23 @@ > String attrName = n.getAttributeValue("name"); > boolean required = JspUtil.booleanValue( > n.getAttributeValue("required")); > - boolean rtexprvalue = JspUtil.booleanValue( > - n.getAttributeValue("rtexprvalue")); > + String rtexprvalueString = n.getAttributeValue("rtexprvalue"); > + boolean rtexprvalue = JspUtil.booleanValue( rtexprvalueString ); > boolean fragment = JspUtil.booleanValue( > n.getAttributeValue("fragment")); > String type = n.getAttributeValue("type"); > if (fragment) { > fragmentAttributesMap.put(attrName, n); > + // type is fixed to "JspFragment" and a translation error > + // must occur if specified. > if (type != null) { > err.jspError("jsp.error.fragmentwithtype"); > + } > + // rtexprvalue is fixed to "true" and a translation error > + // must occur if specified. > + rtexprvalue = true; > + if( rtexprvalueString != null ) { > + err.jspError("jsp.error.frgmentwithrtexprvalue" ); > } > } else { > if (type == null) > > > > 1.25 +3 -2 >jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties > > Index: messages.properties > =================================================================== > RCS file: >/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v > retrieving revision 1.24 > retrieving revision 1.25 > diff -u -r1.24 -r1.25 > --- messages.properties 20 Aug 2002 03:52:18 -0000 1.24 > +++ messages.properties 20 Aug 2002 15:50:23 -0000 1.25 > @@ -281,6 +281,7 @@ > jsp.error.attribute.noquote=quote symbol expected > jsp.error.attribute.unterminated=attribute for {0} is not properly terminated > jsp.error.missing.tagInfo=TagInfo object for {0} is missing from TLD > -jsp.error.fragmentwithtype=Both 'fragment' and 'type' attributes specified in tag >directive > +jsp.error.fragmentwithtype=Cannot specify both 'fragment' and 'type' attributes. >If 'fragment' is present, 'type' is fixed as 'javax.servlet.jsp.tagext.JspFragment' > +jsp.error.fragmentwithrtexprvalue=Cannot specify both 'fragment' and >'rtexprvalue' attributes. If 'fragment' is present, 'rtexprvalue' is fixed as 'true' > jsp.error.fragmentWithDeclareOrScope=Both 'fragment' and 'declare' or 'scope' >attributes specified in variable directive > jsp.warning.bad.urlpattern.propertygroup=Bad value {0} in the url-pattern >subelement in web.xml > > > > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>