- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我静态导入了我的 Utility
类:
<%@ page import="static com.groupgti.webclient.util.MappingUtils.*" %>
我在这个类中有一些常量:
public static final String HTM = ".htm";
public static final String SECURE_REQUEST_MAPPING = "/secure/";
public static final String CANDIDATE_DETAILS_DATA_FORM_MAPPING = "assessments/candidate-details-data";
我有一个 Spring MVC 表单:
<form:form cssClass="springForm"
action="${pageContext.servletContext.contextPath}<%=SECURE_REQUEST_MAPPING + CANDIDATE_DETAILS_DATA_FORM_MAPPING + HTM%>"
commandName="assessments/candidate-details-request">
</form:form>
为什么当我这样使用时:
<a href="${pageContext.servletContext.contextPath}<%=SECURE_REQUEST_MAPPING + CANDIDATE_DETAILS_DATA_FORM_MAPPING + HTM%>">
some text
</a>
href
的值属性已正确生成,并且采用 Spring 形式 action
属性的 HTML 代码是这样的:/webclient<%=SECURE_REQUEST_MAPPING + CANDIDATE_DETAILS_DATA_FORM_MAPPING + HTM%>
.这些常量的值未显示。为什么会这样?我应该怎么做才能让它发挥作用?
最佳答案
由于在工作中不允许在 JSP 中内联 Java,因此我使用自定义标记在 JSP 中“导入”静态最终类字段。它使用 Spring Framework 的 utils 和通用支持从废弃的 Jakarta“非标准”自定义标记库 API 稍微修改了 UseConstantsTag
。 (目前我什至找不到原始代码;这里是 original API documentation。)
此标记基本上将所有静态最终字段(通过反射)公开为 Map
,可以在 JSP 中轻松使用。 <强> Take a look at full code in this gist ,本质是:
/**
* Tag that exposes all of the public constants in a class as a map stored in
* a scoped attribute. The scope may be specified, but defaults to page scope.
* <p/>
* Based on abandoned project taglibs-unstandard, specifically
* {@code org.apache.taglibs.unstandard.UseConstantsTag}. Uses Spring's TagUtils
* and ClassUtils instead of utils bundled in taglibs-unstandard, plus it
* supports generics.
*
* @see http://jakarta.apache.org/taglibs/unstandard
*/
public class UseConstantsTag extends TagSupport {
private static final long serialVersionUID = 1L;
/**
* The fully qualified name of the Java class for which constants are to be
* exposed.
*/
private String className;
/**
* The scope in which the exposed map will be stored.
*/
private String scope = TagUtils.SCOPE_PAGE;
/**
* The name of the scoped attribute in which the constants will be stored.
*/
private String var;
/**
* Construct an instance of this class.
*/
public UseConstantsTag() {
}
/**
* Retrieve the name of the class for which constants are to be exposed.
*
* @return The fully qualified class name.
*/
public String getClassName() {
return className;
}
/**
* Set the name of the class for which constants are to be exposed.
*
* @param className The fully qualified class name.
*/
public void setClassName(final String className) {
this.className = className;
}
/**
* Retrieve the scope in which the exposed map will be stored.
*
* @return The name of the scope.
*/
public String getScope() {
return scope;
}
/**
* Set the scope in which the exposed map will be stored.
*
* @param scope The name of the scope.
*/
public void setScope(final String scope) {
Assert.notNull(scope, "Scope cannot be null");
this.scope = scope;
}
/**
* Retrieve the variable name in which the exposed map will be stored.
*
* @return The name of the variable.
*/
public String getVar() {
return var;
}
/**
* Set the variable name in which the exposed map will be stored.
*
* @param var The name of the variable.
*/
public void setVar(final String var) {
this.var = var;
}
/**
* Expose the constants for a class as a scoped attribute.
*
* @return A constant that identifies what the container should do next.
*
* @throws JspException if a fatal error occurs.
*/
@Override
public int doStartTag() throws JspException {
if (className != null && var != null) {
Map<String, Object> constants;
try {
constants = ClassReflectionUtils.getClassConstants(className);
} catch (final ClassNotFoundException e) {
throw new JspTagException("Class not found: " + className, e);
} catch (final IllegalArgumentException e) {
throw new JspTagException("Illegal argument: " + className, e);
} catch (final IllegalAccessException e) {
throw new JspTagException("Illegal access: " + className, e);
}
if (!constants.isEmpty()) {
pageContext.setAttribute(var, constants, TagUtils.getScope(scope));
}
}
return SKIP_BODY;
}
/**
* Free up any resources being used by this tag handler.
*/
@Override
public void release() {
super.release();
className = null;
scope = null;
var = null;
}
}
和
/**
* Utility class for working with Class instances.
*/
final class ClassReflectionUtils {
/**
* Private constructor to prevent instantiation of this class.
*/
private ClassReflectionUtils() {
}
/**
* Creates and returns a map of the names of public static final constants to
* their values, for the specified class.
*
* @param className The fully qualified name of the class for which the
* constants should be determined
*
* @return {@code Map<String, Object>} from constant names to values
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static Map<String, Object> getClassConstants(final String className)
throws ClassNotFoundException, IllegalArgumentException,
IllegalAccessException {
final Map<String, Object> constants = new HashMap<String, Object>();
final Class<?> clazz = ClassUtils.forName(className,
ClassUtils.getDefaultClassLoader());
for (final Field field : clazz.getFields()) {
final int modifiers = field.getModifiers();
if (Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers)
&& Modifier.isFinal(modifiers)) {
// null as argument because it's ignored when field is static
final Object value = field.get(null);
if (value != null) {
constants.put(field.getName(), value);
}
}
}
return constants;
}
}
标签定义:
<tag>
<name>useConstants</name>
<tag-class>com.github.xaerxess.UseConstantsTag</tag-class>
<body-content>empty</body-content>
<display-name>useConstants</display-name>
<description>
Exposes all of the public constants in a class as a map stored in
a scoped attribute. The scope may be specified, but defaults to page
scope.
</description>
<variable>
<name-from-attribute>var</name-from-attribute>
<variable-class>java.lang.Object</variable-class>
<declare>true</declare>
<scope>AT_BEGIN</scope>
<description>The name of the attribute into which the map will be stored.</description>
</variable>
<attribute>
<name>var</name>
<required>yes</required>
<rtexprvalue>no</rtexprvalue>
<description>Name of the scoped attribute into which the map will be stored.</description>
</attribute>
<attribute>
<name>className</name>
<required>yes</required>
<rtexprvalue>no</rtexprvalue>
<description>Fully qualified name of the class from which constants will be extracted.</description>
</attribute>
<attribute>
<name>scope</name>
<required>no</required>
<rtexprvalue>no</rtexprvalue>
<description>Scope into which to store the map. Default is page scope.</description>
</attribute>
<example>
To expose all of the constants in the Integer class:
<![CDATA[<un:useConstants var="const" className="java.lang.Integer" />]]>
</example>
</tag>
像这样使用它:
<custom:useConstants var="MappingUtils"
className="com.groupgti.webclient.util.MappingUtils" scope="application" />
然后:
<p>My const: ${MappingUtils.SECURE_REQUEST_MAPPING}</p>
关于java - 静态常量的值不显示在 Spring MVC 表单操作元素中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619878/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!