📄 tagutils.java
字号:
ActionServlet servlet = (ActionServlet) pageContext.getServletContext().getAttribute(Globals.ACTION_SERVLET_KEY);
String actionIdPath = RequestUtils.actionIdURL(action, moduleConfig, servlet);
if (actionIdPath != null) {
action = actionIdPath;
url.append(request.getContextPath());
url.append(actionIdPath);
} else {
url.append(instance.getActionMappingURL(action, module,
pageContext, false));
}
} else /* if (page != null) */
{
url.append(request.getContextPath());
url.append(this.pageURL(request, page, moduleConfig));
}
// Add anchor if requested (replacing any existing anchor)
if (anchor != null) {
String temp = url.toString();
int hash = temp.indexOf('#');
if (hash >= 0) {
url.setLength(hash);
}
url.append('#');
url.append(this.encodeURL(anchor, charEncoding));
}
// Add dynamic parameters if requested
if ((params != null) && (params.size() > 0)) {
// Save any existing anchor
String temp = url.toString();
int hash = temp.indexOf('#');
if (hash >= 0) {
anchor = temp.substring(hash + 1);
url.setLength(hash);
temp = url.toString();
} else {
anchor = null;
}
// Define the parameter separator
String separator = null;
if (redirect) {
separator = "&";
} else if (encodeSeparator) {
separator = "&";
} else {
separator = "&";
}
// Add the required request parameters
boolean question = temp.indexOf('?') >= 0;
Iterator keys = params.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
Object value = params.get(key);
if (value == null) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key, charEncoding));
url.append('='); // Interpret null as "no value"
} else if (value instanceof String) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key, charEncoding));
url.append('=');
url.append(this.encodeURL((String) value, charEncoding));
} else if (value instanceof String[]) {
String[] values = (String[]) value;
for (int i = 0; i < values.length; i++) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key, charEncoding));
url.append('=');
url.append(this.encodeURL(values[i], charEncoding));
}
} else /* Convert other objects to a string */
{
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key, charEncoding));
url.append('=');
url.append(this.encodeURL(value.toString(), charEncoding));
}
}
// Re-add the saved anchor (if any)
if (anchor != null) {
url.append('#');
url.append(this.encodeURL(anchor, charEncoding));
}
}
// Perform URL rewriting to include our session ID (if any)
// but only if url is not an external URL
if ((href == null) && (pageContext.getSession() != null)) {
HttpServletResponse response =
(HttpServletResponse) pageContext.getResponse();
if (redirect) {
return (response.encodeRedirectURL(url.toString()));
}
return (response.encodeURL(url.toString()));
}
return (url.toString());
}
/**
* URLencodes a string assuming the character encoding is UTF-8.
*
* @param url
* @return String The encoded url in UTF-8
*/
public String encodeURL(String url) {
return encodeURL(url, "UTF-8");
}
/**
* Use the new URLEncoder.encode() method from Java 1.4 if available, else
* use the old deprecated version. This method uses reflection to find
* the appropriate method; if the reflection operations throw exceptions,
* this will return the url encoded with the old URLEncoder.encode()
* method.
*
* @param enc The character encoding the urlencode is performed on.
* @return String The encoded url.
*/
public String encodeURL(String url, String enc) {
return ResponseUtils.encodeURL(url, enc);
}
/**
* Filter the specified string for characters that are senstive to HTML
* interpreters, returning the string with these characters replaced by
* the corresponding character entities.
*
* @param value The string to be filtered and returned
*/
public String filter(String value) {
return ResponseUtils.filter(value);
}
/**
* Return the form action converted into an action mapping path. The
* value of the <code>action</code> property is manipulated as follows in
* computing the name of the requested mapping:
*
* <ul>
*
* <li>Any filename extension is removed (on the theory that extension
* mapping is being used to select the controller servlet).</li>
*
* <li>If the resulting value does not start with a slash, then a slash is
* prepended.</li>
*
* </ul>
*/
public String getActionMappingName(String action) {
String value = action;
int question = action.indexOf("?");
if (question >= 0) {
value = value.substring(0, question);
}
int pound = value.indexOf("#");
if (pound >= 0) {
value = value.substring(0, pound);
}
int slash = value.lastIndexOf("/");
int period = value.lastIndexOf(".");
if ((period >= 0) && (period > slash)) {
value = value.substring(0, period);
}
return value.startsWith("/") ? value : ("/" + value);
}
/**
* Return the form action converted into a server-relative URL.
*/
public String getActionMappingURL(String action, PageContext pageContext) {
return getActionMappingURL(action, null, pageContext, false);
}
/**
* Return the form action converted into a server-relative URL.
*/
public String getActionMappingURL(String action, String module,
PageContext pageContext, boolean contextRelative) {
HttpServletRequest request =
(HttpServletRequest) pageContext.getRequest();
String contextPath = request.getContextPath();
StringBuffer value = new StringBuffer();
// Avoid setting two slashes at the beginning of an action:
// the length of contextPath should be more than 1
// in case of non-root context, otherwise length==1 (the slash)
if (contextPath.length() > 1) {
value.append(contextPath);
}
ModuleConfig moduleConfig = getModuleConfig(module, pageContext);
if ((moduleConfig != null) && (!contextRelative)) {
value.append(moduleConfig.getPrefix());
}
// Use our servlet mapping, if one is specified
String servletMapping =
(String) pageContext.getAttribute(Globals.SERVLET_KEY,
PageContext.APPLICATION_SCOPE);
if (servletMapping != null) {
String queryString = null;
int question = action.indexOf("?");
if (question >= 0) {
queryString = action.substring(question);
}
String actionMapping = getActionMappingName(action);
if (servletMapping.startsWith("*.")) {
value.append(actionMapping);
value.append(servletMapping.substring(1));
} else if (servletMapping.endsWith("/*")) {
value.append(servletMapping.substring(0,
servletMapping.length() - 2));
value.append(actionMapping);
} else if (servletMapping.equals("/")) {
value.append(actionMapping);
}
if (queryString != null) {
value.append(queryString);
}
}
// Otherwise, assume extension mapping is in use and extension is
// already included in the action property
else {
if (!action.startsWith("/")) {
value.append("/");
}
value.append(action);
}
return value.toString();
}
/**
* Retrieves the value from request scope and if it isn't already an
* <code>ActionMessages</code>, some classes are converted to one.
*
* @param pageContext The PageContext for the current page
* @param paramName Key for parameter value
* @return ActionErrors in page context.
* @throws JspException
*/
public ActionMessages getActionMessages(PageContext pageContext,
String paramName) throws JspException {
ActionMessages am = new ActionMessages();
Object value = pageContext.findAttribute(paramName);
if (value != null) {
try {
if (value instanceof String) {
am.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage((String) value));
} else if (value instanceof String[]) {
String[] keys = (String[]) value;
for (int i = 0; i < keys.length; i++) {
am.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage(keys[i]));
}
} else if (value instanceof ActionErrors) {
ActionMessages m = (ActionMessages) value;
am.add(m);
} else if (value instanceof ActionMessages) {
am = (ActionMessages) value;
} else {
throw new JspException(messages.getMessage(
"actionMessages.errors", value.getClass().getName()));
}
} catch (JspException e) {
throw e;
} catch (Exception e) {
log.warn("Unable to retieve ActionMessage for paramName : "
+ paramName, e);
}
}
return am;
}
/**
* Return the default ModuleConfig object if it exists, null if
* otherwise.
*
* @param pageContext The page context.
* @return the ModuleConfig object
*/
public ModuleConfig getModuleConfig(PageContext pageContext) {
return getModuleConfig(null, pageContext);
}
/**
* Return the specified ModuleConfig object for the given prefix if it
* exists, otherwise a NullPointerException will be thrown.
*
* @param module The module prefix
* @param pageContext The page context.
* @return the ModuleConfig object
* @throws NullPointerException Thrown when module cannot be found
*/
public ModuleConfig getModuleConfig(String module, PageContext pageContext) {
ModuleConfig config =
ModuleUtils.getInstance().getModuleConfig(module,
(HttpServletRequest) pageContext.getRequest(),
pageContext.getServletContext());
// ModuleConfig not found
if (config == null) {
throw new NullPointerException("Module '" + module + "' not found.");
}
return config;
}
/**
* Converts the scope name into its corresponding PageContext constant
* value.
*
* @param scopeName Can be "page", "request", "session", or "application"
* in any case.
* @return The constant representing the scope (ie. PageContext.REQUEST_SCOPE).
* @throws JspException if the scopeName is not a valid name.
*/
public int getScope(String scopeName)
throws JspException {
Integer scope = (Integer) scopes.get(scopeName.toLowerCase());
if (scope == null) {
throw new JspException(messages.getMessage("lookup.scope", scope));
}
return scope.intValue();
}
/**
* Look up and return current user locale, based on the specified
* parameters.
*
* @param pageContext The PageContext associated with this request
* @param locale Name of the session attribute for our user's Locale.
* If this is <code>null</code>, the default locale key
* is used for the lookup.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -