spring - 扩展spring表单标签库属性

标签 spring forms spring-mvc jsp-tags

我正在开发的 Spring MVC 应用程序中使用 Spring 的表单标签库。我工作的公司已经根据某些标签的自定义属性的定义实现了一些全公司范围的政策。例如,默认情况下(尽管包含标准 JavaScript 文件)所有标签的值都会自动转换为大写。为了禁用此功能,可以通过以下方式使用自定义属性定义其标签:

<input type="text" uppercase="false" />

问题在于,将这些自定义属性添加到 spring:form 标记会导致运行时出错。我已将错误粘贴到下面。

org.apache.jasper.JasperException: /WEB-INF/jsp/reportCriteria.jsp(45,5) Attribute uppercase invalid for tag input according to TLD

我的问题是:有没有办法扩展 TLD 以允许这些属性,或者有没有其他方法将这些自定义属性添加到这些 spring:form 标记中?

最佳答案

好吧,两年后...我们开始吧!

如何创建我们自己的标签,使用 Spring MVC 3 中的新属性扩展经典标签

<小时/>

<强>1。创建您自己的taglib.tld

您需要创建自己的 TLD 文件。您将在此处添加要使用的新属性。最好的选择是复制/粘贴 spring-form.tld。您可以在 spring-mvc 包(org.springframework.web.servlet-.jar)中找到它。在 META-INF 文件夹中搜索。

可以直接将其放在 WEB-INF 中或子文件夹中。我把它放进/WEB-INF/tld .

现在在新 TLD 文件中搜索您要修改的标签。我修改了输入标签,所以我必须搜索:

  ...
  <tag>
  <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description>
  <name>input</name>
  <tag-class>org.domain.tags.CustomTags</tag-class>
  <body-content>empty</body-content>
  <attribute>
  ...

从 复制到 并将其粘贴到下面。将新标签的 更改为您自己的名字。我的是myInput。所以现在我们有这个:

  ...
  <tag>
  <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description>
  <name>input</name>
  <tag-class>org.springframework.web.servlet.tags.form.InputTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
  ...
  </tag>

  <tag>
  <description>Renders an HTML 'input' tag with type 'text' using the bound value.</description>
  <name>myInput</name>
  <tag-class>org.domain.tags.CustomTags</tag-class>
  <body-content>empty</body-content>
  <attribute>
  ...
  </tag>

摘要:现在我在这里有一个名为 taglib.tld 的新文件:/WEB-INF/tld/taglib.tld关注<tag-class>部分

在您自己的新标签中添加一个新属性(复制/粘贴另一个属性)调用render

<attribute>
  <description>Enables/Disables the field rendering</description>
  <name>render</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  <type>java.lang.Boolean</type>
</attribute>

现在我们已经创建了我们需要的 taglib 文件。让我们看看如何使用它。

<强>2。创建您自己的处理程序

现在我们将创建处理新属性(和经典属性)的类。我创建了 CustomTags.javaorg.domain.tags。我们先看一下代码并解释一下:

package org.domain.tags;

import javax.servlet.jsp.JspException;
import org.springframework.web.servlet.tags.form.InputTag;
import org.springframework.web.servlet.tags.form.TagWriter;

public class CustomTags extends InputTag {

private static final long serialVersionUID = 1L;
private boolean render;

public boolean isRender() {
  return render;
}

public void setRender(boolean render) {
  this.render = render;
}

protected int writeTagContent(TagWriter tagWriter) throws JspException {
  if(render){
    super.writeTagContent(tagWriter);
    return SKIP_BODY;
  }
  else
    return SKIP_BODY;
  }
}

当然,如果我们要向Spring框架的Input标签添加一些功能,我们必须扩展它以保留其余功能。正如您所看到的,我们刚刚添加了 render 私有(private)属性作为 bool 值(我们也在 taglib.tld 中添加了它)。

我们为此属性添加了 gettersetter 方法。

最后,我们重写了 writeTagContent 方法,以使 JSP 执行我们想要的操作。在本例中,如果 render 为 true,我们希望显示输入字段。否则该字段无法显示。这就是为什么我们调用父类的writeTagContent。

如果我们需要对标签行为进行一些更改,此方法是执行这些操作的正确位置。

<强>3。使用新标签。

现在我们只需要一个带有表单的 JSP 即可使用新标签。这很容易做到,所以我只在这里放代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix = "newtags" uri = "/WEB-INF/tld/taglib.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <title>Spring 3.0 MVC Series: Welcome World</title>
</head>
<body>
  <h1>User Data</h1>
  Please, fill the fields with your information:<br>
  <newtags:form name="userForm" id="userForm" modelAttribute="userForm" action="user.htm" method="POST">
    Name: <newtags:myInput type="text" name="textName" path="userName" render="true" size="50" /><newtags:errors path="userName" /><br>
    Surname: <newtags:myInput type="text" name="textSurname" path="userSurname" render="true" size="50" /><newtags:errors path="userSurname" /><br>
    Age: <newtags:myInput type="text" name="textAge" path="userAge" render="true" size="2" /><newtags:errors path="userAge" /><br>
    Example: <newtags:myInput type="text" name="textSurname" render="false" size="20" path="userSurname"/>
    <hr>
    <input type="submit" value="Next" />
  </newtags:form>
</body>
</html>

现在我们不再调用 springframework tld,而是调用我们自己的 TLD。正如您所看到的,唯一不会显示的字段是示例之一。

祝大家好运!

关于spring - 扩展spring表单标签库属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526409/

相关文章:

javascript - 在 RC6 中升级到 @angular/forms

javascript - 将 1 个表单附加到另一个表单 - 然后提交

spring-mvc - Spring 中的 Model.SetViewName

java - 导入无法解决错误

java - org.apache.jasper.JasperException : Unable to compile class for JSP encountered when using spring

spring - 运行 mvn spring-boot :build-image command in Spring Boot 2. 3.0 时如何设置 JVM 参数以生成 docker 镜像?

java - 仅当特定 header 存在时,Spring RepositoryRestResource 响应

java - spring抽象="true"是什么意思?

css - iOS 强制输入圆 Angular 和眩光

java - 如何在 Eclipse 中使用 pom.xml/Maven 初始化本地thoughtsite(App Engine示例)项目?