Хорошо, 2 года спустя ... вот и мы!
КАК СОЗДАТЬ СВОЮ СОБСТВЕННУЮ ТЕГОВУ, РАСШИРЯЮЩУЮ КЛАССИЧЕСКИЙ ОДИН С НОВЫМИ АТРИБУТАМИ В 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.java en el paquete org.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;
}
}
Конечно, если мы собираемся добавить некоторые функции в тэг Input платформы Spring, мы должны расширить его, чтобы сохранить остальные функции. Как видите, мы только что добавили приватный атрибут render как логическое (в taglib.tld мы также поместили его).
Мы добавили в методы getter и setter методы для этого атрибута.
Наконец, мы перезаписали метод 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. Как вы можете видеть, единственное поле, которое не будет отображаться, это Пример one.
Удачи всем!