Создайте пользовательскую библиотеку тегов, которая расширяет библиотеку тегов Spring
Я хочу создать пользовательскую библиотеку тегов, которая должна расширить существующую Весна библиотека тегов MVC 3.0. Я хочу сделать это, потому что я хочу мой JSP код должен быть независимым от любой структуры.
Это означает, если я хочу изменить с весны на распорок тогда мне не нужно ничего менять на страницах JSP. Я просто меняю свою настроенную библиотеку тегов, которая расширит библиотеку тегов Struts, и все работает нормально.
4 ответов
вы не можете расширить всю библиотеку, но вы можете расширить все теги из библиотеки и создать для них новый дескриптор, а затем использовать свои собственные теги вместо Весна те.
например, идем в файл с именем spring-form.tld
. Вы увидите дескрипторы тегов, которые содержат описание атрибутов и имя класса тегов.
Итак, чтобы иметь свою собственную библиотеку тегов, вы должны создать:
- my-lib.tld (укажите [uri для a библиотека])
- расширить все теги, которые вам нужны
- поместите дескрипторы в my-lib.tld
- использовать URI в моем-lib.tld вместо весенних
просто поиск Google для "пользовательских тегов jsp". Или взгляните на пользовательские теги JSP.
например, возьмите два класса для тега [form] из распорок и Весна:
- org.апаш.подпорки.библиотека тегов.формат html.FormTag
- org.springframework.сеть.сервлет.метить.форма.FormTag.
вам придется создать что-то вроде:
package org.my.example.tags;
import javax.servlet.jsp.JspException;
import org.springframework.web.servlet.tags.form.FormTag;
import org.springframework.web.servlet.tags.form.TagWriter;
/**
*/
public class SpringFormTag extends FormTag {
private static final String FOCUS_ATTRIBUTE = "focus";
private String focus;
public void setFocus(String focus) {
this.focus = focus;
}
public String getFocus() {
return focus;
}
@Override
protected void writeDefaultAttributes(TagWriter tagWriter) throws JspException {
writeOptionalAttribute(tagWriter, FOCUS_ATTRIBUTE, getFocus());
super.writeDefaultAttributes(tagWriter);
}
}
я публикую только код для тега формы spring.
файл my-lib.tld:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My tag library</description>
<tlib-version>3.0</tlib-version>
<short-name>html</short-name>
<uri>http://test.com/test.tld</uri>
<tag>
<name>form</name>
<tag-class>org.my.example.tags.SpringFormTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>action</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>acceptCharset</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>dir</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>disabled</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
<attribute>
<name>enctype</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>focus</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>focusIndex</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>lang</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>method</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>onreset</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>onsubmit</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>readonly</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
<attribute>
<name>scriptLanguage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
<attribute>
<name>style</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>styleId</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>target</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Вам также придется поставить .файл tld в каталог META-INF файла JAR. Файл JAR с этим taglibrary должен быть просто файлом JAR, включенным в ваш войны file, иначе taglibraries не будут обнаружены.
а затем включите свой taglib в файл JSP:
<%@ taglib prefix="html" uri="http://test.com/test.tld" %>
и использовать его:
<html:form action="asd" focus="1">
<div><input type="text"></div>
<div><input type="submit"></div>
</html:form>
Вам также придется создать такую библиотеку для стоек, Если вы хотите переключаться между ними.
единственное, что вам нужно будет помнить при этом, что Весна и распорки имеют немного разные определения тегов, поэтому распорки имеют "фокус", а весна-нет. Я думаю, что может быть больше различий.
вам нужно будет сделать свой тег, чтобы иметь все атрибуты от Spring и от Struts, если вы действительно хотите переключиться с одного на другой. Но я не думаю, что это стоит усилий.
Я на самом деле сделал что-то похожее на то, что вы просите. У нас есть ряд проектов, которые должны иметь одинаковый дизайн, удобство и простоту обслуживания. Поскольку мы используем Spring MVC, некоторые из моих тегов являются обертками вокруг тегов spring form. Например тег "input":
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.tags.form.InputTag;
public class InputText extends AbstractInputTag {
private String maxlength;
@Override
public void initInput() throws Exception {
InputTag input = new InputTag();
if ( StringUtils.isNotEmpty( maxlength ) ) {
input.setMaxlength( maxlength );
}
setInput( input );
}
public void setMaxlength( String maxlength ) {
this.maxlength = maxlength;
}
}
он простирается от абстрактного тега, который добавляет метку к входу, а также заботится о кодах ошибок:
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.tags.form.AbstractHtmlInputElementTag;
import org.springframework.web.servlet.tags.form.ErrorsTag;
public abstract class AbstractInputTag extends AbstractTag {
private String path;
private String code;
private String labelWidth = "35%";
private String valueWidth = "";
private AbstractHtmlInputElementTag input;
@Override
public int doStart() throws Exception {
TaglibUtils.assertHasAncestorOfType( this, Form.class );
initInput();
TaglibUtils.doLabel( pageContext, getId(), code, labelWidth );
setParent( input );
input.setPageContext( pageContext );
input.setCssErrorClass( "zsa-validationerror-input" );
input.setPath( path );
input.setId( getId() );
if( !StringUtils.isEmpty( valueWidth ) ) {
input.setCssStyle( "width: " + valueWidth );
}
pageContext.getOut().print( "<div>" );
input.doStartTag();
return EVAL_BODY_INCLUDE;
}
@Override
public int doEnd() throws Exception {
input.doEndTag();
input.release();
pageContext.getOut().print( "</div>" );
ErrorsTag errorsTag = new ErrorsTag();
errorsTag.setParent( this );
errorsTag.setPageContext( pageContext );
errorsTag.setPath( path );
errorsTag.doStartTag();
JspWriter out = pageContext.pushBody();
out.print( "<span class=\"zsa-validationerror-flag\"></span>" );
errorsTag.setBodyContent( ( BodyContent )out );
errorsTag.doInitBody();
errorsTag.doAfterBody();
errorsTag.doEndTag();
out = pageContext.popBody();
errorsTag.release();
return EVAL_PAGE;
}
public abstract void initInput() throws Exception;
}
перед моими формами выглядело что-то вроде это:
<portlet:actionURL var="coreSearch" portletMode="view" windowState="NORMAL"></portlet:actionURL>
<form:form commandName="searchContext" id="searchComplex" action="${coreSearch}" method="POST">
<div class="rightDivPart" style="width: 50%; padding-left: 50px">
<label class="label" for="tin">TIN: </label>
<form:input cssErrorClass="inputErrorClass" path="tin" cssClass="medium"/>
...
после создания тегов обертки они теперь выглядят так:
<ics:form id="searchComplex" commandName="searchContext" action="searchComplex" type="action">
<ics:panel id="searchComplex">
<ics:inputText id="mrn" path="mrnCriteria.mrn"/>
</ics:panel>
</ics:form>
теперь мои JSP-s являются moslty без JavaScript, Css, JQuery и других тегов. В очень большом проекте я думаю, что это стоит инвестиций из-за простоты обслуживания.
вы можете инкапсулировать свое поведение в файлы тега. Это будет своего рода композиция при применении к библиотеке тегов spring или любой другой библиотеке тегов.
используйте теги JSTL. JSTL означает, что ваш JSPs будет более общим, используемым любой технологией Java web MVC, которая использует JSP.