📄 jspdocumentparser.java
字号:
nonTaglibAttrs,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
current);
} else if (localName.equals(DOBODY_ACTION)) {
if (!isTagFile) {
throw new SAXParseException(
Localizer.getMessage(
"jsp.error.action.isnottagfile",
localName),
locator);
}
node =
new Node.DoBodyAction(
qName,
nonTaglibAttrs,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
current);
} else if (localName.equals(ELEMENT_ACTION)) {
node =
new Node.JspElement(
qName,
nonTaglibAttrs,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
current);
} else if (localName.equals(FALLBACK_ACTION)) {
node =
new Node.FallBackAction(
qName,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
current);
} else {
throw new SAXParseException(
Localizer.getMessage(
"jsp.error.xml.badStandardAction",
localName),
locator);
}
return node;
}
/*
* Checks if the XML element with the given tag name is a custom action,
* and returns the corresponding Node object.
*/
private Node parseCustomAction(
String qName,
String localName,
String uri,
Attributes nonTaglibAttrs,
Attributes nonTaglibXmlnsAttrs,
Attributes taglibAttrs,
Mark start,
Node parent)
throws SAXException {
// Check if this is a user-defined (custom) tag
TagLibraryInfo tagLibInfo = pageInfo.getTaglib(uri);
if (tagLibInfo == null) {
return null;
}
TagInfo tagInfo = tagLibInfo.getTag(localName);
TagFileInfo tagFileInfo = tagLibInfo.getTagFile(localName);
if (tagInfo == null && tagFileInfo == null) {
throw new SAXException(
Localizer.getMessage("jsp.error.xml.bad_tag", localName, uri));
}
Class tagHandlerClass = null;
if (tagInfo != null) {
String handlerClassName = tagInfo.getTagClassName();
try {
tagHandlerClass =
ctxt.getClassLoader().loadClass(handlerClassName);
} catch (Exception e) {
throw new SAXException(
Localizer.getMessage("jsp.error.loadclass.taghandler",
handlerClassName,
qName),
e);
}
}
String prefix = "";
int colon = qName.indexOf(':');
if (colon != -1) {
prefix = qName.substring(0, colon);
}
Node.CustomTag ret = null;
if (tagInfo != null) {
ret =
new Node.CustomTag(
qName,
prefix,
localName,
uri,
nonTaglibAttrs,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
parent,
tagInfo,
tagHandlerClass);
} else {
ret =
new Node.CustomTag(
qName,
prefix,
localName,
uri,
nonTaglibAttrs,
nonTaglibXmlnsAttrs,
taglibAttrs,
start,
parent,
tagFileInfo);
}
return ret;
}
/*
* Creates the tag library associated with the given uri namespace, and
* returns it.
*
* @param prefix The prefix of the xmlns attribute
* @param uri The uri namespace (value of the xmlns attribute)
*
* @return The tag library associated with the given uri namespace
*/
private TagLibraryInfo getTaglibInfo(String prefix, String uri)
throws JasperException {
TagLibraryInfo result = null;
if (uri.startsWith(URN_JSPTAGDIR)) {
// uri (of the form "urn:jsptagdir:path") references tag file dir
String tagdir = uri.substring(URN_JSPTAGDIR.length());
result =
new ImplicitTagLibraryInfo(
ctxt,
parserController,
pageInfo,
prefix,
tagdir,
err);
} else {
// uri references TLD file
boolean isPlainUri = false;
if (uri.startsWith(URN_JSPTLD)) {
// uri is of the form "urn:jsptld:path"
uri = uri.substring(URN_JSPTLD.length());
} else {
isPlainUri = true;
}
String[] location = ctxt.getTldLocation(uri);
if (location != null || !isPlainUri) {
if (ctxt.getOptions().isCaching()) {
result = (TagLibraryInfoImpl) ctxt.getOptions().getCache().get(uri);
}
if (result == null) {
/*
* If the uri value is a plain uri, a translation error must
* not be generated if the uri is not found in the taglib map.
* Instead, any actions in the namespace defined by the uri
* value must be treated as uninterpreted.
*/
result =
new TagLibraryInfoImpl(
ctxt,
parserController,
pageInfo,
prefix,
uri,
location,
err);
if (ctxt.getOptions().isCaching()) {
ctxt.getOptions().getCache().put(uri, result);
}
}
}
}
return result;
}
/*
* Ensures that the given body only contains nodes that are instances of
* TemplateText.
*
* This check is performed only for the body of a scripting (that is:
* declaration, scriptlet, or expression) element, after the end tag of a
* scripting element has been reached.
*/
private void checkScriptingBody(Node.ScriptingElement scriptingElem)
throws SAXException {
Node.Nodes body = scriptingElem.getBody();
if (body != null) {
int size = body.size();
for (int i = 0; i < size; i++) {
Node n = body.getNode(i);
if (!(n instanceof Node.TemplateText)) {
String elemType = SCRIPTLET_ACTION;
if (scriptingElem instanceof Node.Declaration)
elemType = DECLARATION_ACTION;
if (scriptingElem instanceof Node.Expression)
elemType = EXPRESSION_ACTION;
String msg =
Localizer.getMessage(
"jsp.error.parse.xml.scripting.invalid.body",
elemType);
throw new SAXException(msg);
}
}
}
}
/*
* Parses the given file included via an include directive.
*
* @param fname The path to the included resource, as specified by the
* 'file' attribute of the include directive
* @param parent The Node representing the include directive
*/
private void processIncludeDirective(String fname, Node parent)
throws SAXException {
if (fname == null) {
return;
}
try {
parserController.parse(fname, parent, null);
} catch (FileNotFoundException fnfe) {
throw new SAXParseException(
Localizer.getMessage("jsp.error.file.not.found", fname),
locator,
fnfe);
} catch (Exception e) {
throw new SAXException(e);
}
}
/*
* Checks an element's given URI, qname, and attributes to see if any
* of them hijack the 'jsp' prefix, that is, bind it to a namespace other
* than http://java.sun.com/JSP/Page.
*
* @param uri The element's URI
* @param qName The element's qname
* @param attrs The element's attributes
*/
private void checkPrefixes(String uri, String qName, Attributes attrs) {
checkPrefix(uri, qName);
int len = attrs.getLength();
for (int i = 0; i < len; i++) {
checkPrefix(attrs.getURI(i), attrs.getQName(i));
}
}
/*
* Checks the given URI and qname to see if they hijack the 'jsp' prefix,
* which would be the case if qName contained the 'jsp' prefix and
* uri was different from http://java.sun.com/JSP/Page.
*
* @param uri The URI to check
* @param qName The qname to check
*/
private void checkPrefix(String uri, String qName) {
int index = qName.indexOf(':');
if (index != -1) {
String prefix = qName.substring(0, index);
pageInfo.addPrefix(prefix);
if ("jsp".equals(prefix) && !JSP_URI.equals(uri)) {
pageInfo.setIsJspPrefixHijacked(true);
}
}
}
/*
* Gets SAXParser.
*
* @param validating Indicates whether the requested SAXParser should
* be validating
* @param jspDocParser The JSP document parser
*
* @return The SAXParser
*/
private static SAXParser getSAXParser(
boolean validating,
JspDocumentParser jspDocParser)
throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
// Preserve xmlns attributes
factory.setFeature(
"http://xml.org/sax/features/namespace-prefixes",
true);
factory.setValidating(validating);
//factory.setFeature(
// "http://xml.org/sax/features/validation",
// validating);
// Configure the parser
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setProperty(LEXICAL_HANDLER_PROPERTY, jspDocParser);
xmlReader.setErrorHandler(jspDocParser);
return saxParser;
}
/*
* Exception indicating that a DOCTYPE declaration is present, but
* validation is turned off.
*/
private static class EnableDTDValidationException
extends SAXParseException {
EnableDTDValidationException(String message, Locator loc) {
super(message, loc);
}
}
private static String getBodyType(Node.CustomTag custom) {
if (custom.getTagInfo() != null) {
return custom.getTagInfo().getBodyContent();
}
return custom.getTagFileInfo().getTagInfo().getBodyContent();
}
private boolean isTagDependent(Node n) {
if (n instanceof Node.CustomTag) {
String bodyType = getBodyType((Node.CustomTag) n);
return
TagInfo.BODY_CONTENT_TAG_DEPENDENT.equalsIgnoreCase(bodyType);
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -