Bootstrap with Spring MVC
ä»ãããªãããGWä¸ã«Bootstrapã«ãã£ã¨è§¦ãããä¸ã®ä¸ã®æ½®æµã«å°ãä¹ããããªï¼
èªåã®ç¥èã§ã¯ããjQuery Mobileãã§ç¥èãæ¢ã¾ã£ã¦ããããããä½æ¥ã«åãæãããã¨ãããã©ãjQuery Mobileã¯ä½¿ãã¤ããããã
ãã£ããæ¬ãè²·ã£ããã©ãæå³ãªãã£ãã
çµå±ãCSS Frameworkã¨ãã¦ãBootstrapããHTML Kick startããåè£ã«æãã¦ãä»åã¯äººæ°ã®ããBootstrapãæ¡ç¨ãã¦ã¿ã¾ããã
使ç¨ããBoostrapã®ãã¼ã¸ã§ã³ã¯ã3.1.1ãã§ãã
Bootstrapã使ã£ã¦ã¿ãææ³
æ©è½ãå¤ããjQuery UIã®æ©è½ãã»ã¼ãããããBootstrapåä½ã§ãã¨ã足ãã¦ä¾¿å©ã ã¨æãã¾ãã
ãã ãããã¼ã¸ã§ã³ãã¨ã«è¨è¿°æ¹æ³ãç°ãªã£ã¦ããããããã«è»¢ãã£ã¦ããæ å ±ããã®ã¾ã¾éµåã¿ã«ããã¨ããã¶ã¤ã³ããããçºçãã¾ãã
ãã®ç¹ããHTML Kick startãã¯é常ã«ã·ã³ãã«ã§ãç¿å¾ãããããã
ãã ããåçãªåä½ãããããå ´åã¯ãä»ã®ã©ã¤ãã©ãªã使ã£ããããå¿
è¦ãããã¾ãã
ãBootstrapããHTML Kick startãããå ¬å¼ãã¼ã¸ã®ããã¥ã¡ã³ãã ãã§ååã§ãç¿å¾ãåæ¥ãããã°ã§ãã¾ããã
使ãã ããªãã°ã30åã¡ãã£ã¨ã§ãããªãã®ãã®ãä½ãã¾ãã
Spring MVCã§Bootsrapãå©ç¨ããå ´åã®åé¡ç¹
Bootstrapã§ãã©ã¼ã ã®ã³ã³ããã¼ã©ã§ã¨ã©ã¼ç¶æ ã®ãã¶ã¤ã³ã表ç¾ããããã«ã¯ãinputã¿ã°ãã¡ãã»ã¼ã¸ãdivã§å²ãå¿ è¦ãããã¾ãã
ãã®ãããå²ãdivã¿ã°ã®classå±æ§ã«ããã¦ãå ¥åé ç®ãã¨ã«ã¨ã©ã¼ããããå¤å®ããå¿ è¦ããããé常ã«JSPãªã©ãæ±ããªã£ã¦ãã¾ãã¾ãã
ããã«ãå ¥åé ç®ã大éã«ããã¨ããã®åæ°åãå¤å®å¦çãå¿ è¦ã«ãªãã¾ãã
<%================= æ¹ååã®ELå¼ãJSTLã使ç¨ããå ´å ================%> <%-- ãã©ã¼ã ã«å¯¾ãã¦ã¨ã©ã¼ããããå¤å®ããçµæãå¤æ°ã«æ ¼ç´ãã --%> <spring:hasBindErrors name="searchCondtiionCommand"> <c:if test="${errors.getFieldErrorCount('keyword') > 0}"> <c:set var="hasErrorKeyword" value="true"/> </c:if> </spring:hasBindErrors> <form:form modelAttribute="searchCondtiionCommand" action="..." method="POST"> <!-- divã®classå±æ§ã«ã¨ã©ã¼ãå¤å®ããå°ç¨ã®å¤ãè¨å®ãã --> <div class="form-fontrol${hasErrorKeyword ?' has-error has-feedback':''}"> <form:label path="keyword" class="control-label" >ãã¼ã¯ã¼ã</form:label> <form:input id="keyword" path="keyword" class="form-control" placeholder="search" maxlength="100"/> <!-- ã¢ã¤ã³ã³ãè¨å®ããéã«ãã¨ã©ã¼ããããå¤å®ããå¿ è¦ããã --> <c:if test="${hasErrorKeyword}"> <span class="glyphicon glyphicon-remove form-control-feedback"></span> </c:if> <form:errors path="keyword" cssClass="help-block with-errors"/> </div> <button type="submit" name="search" class="btn btn-primary"> <span class="glyphicon glyphicon-search"></span> <spring:message code="label.search"/> </button> </form:form>
解決ç
解決çã¨ãã¦ãã«ã¹ã¿ã ã¿ã°ãèªä½ãã¾ãã
Spring MVCã®ã«ã¹ã¿ã ã¿ã°ã¨åæ§ã«ãå±æ§ãpathãã§å
¥åé
ç®ãæå®ããè²ã
ã¨å¤å®ãã§ããããã«ãã¾ãã
- <form2:element>ã¨ããã«ã¹ã¿ã ã¿ã°ã§ãæå®ããå ¥åé ç®ã«ã¨ã©ã¼ããããå¤å®ããã¨ã©ã¼ãããå ´åãå°ç¨ã®classå±æ§ãåºåã§ããããã«ããã
- <form2:hasErrors>ã¨ããã«ã¹ã¿ã ã¿ã°ã§ãæå®ããå ¥åé ç®ã«ã¨ã©ã¼ããããå¤å®ããã¨ã©ã¼ãããå ´åããã®ã¿ã°ã®ä¸èº«ãè©ä¾¡ããã
<%================= æ¹åå¾ã®èªä½ã®ã«ã¹ã¿ã ã¿ã°ã使ç¨ããå ´å ================%> <%@ taglib uri="http://spring-webmvc/modules/tags/form2" prefix="form2" %> <form:form modelAttribute="searchCondtiionCommand" action="..." method="POST"> <!-- divã®classå±æ§ã«ã¨ã©ã¼ãå¤å®ããå°ç¨ã®å¤ãè¨å®ãã--> <form2:element path="keyword" element="div" cssClass="form-group" cssErrorClass="form-group has-error has-feedback"> <form:label path="keyword" class="control-label" >ãã¼ã¯ã¼ã</form:label> <form:input id="keyword" path="keyword" class="form-control" placeholder="search" maxlength="100"/> <!-- ã¢ã¤ã³ã³ãè¨å®ããéã«ãã¨ã©ã¼ããããå¤å®ããå¿ è¦ããã --> <form2:hasErrors path="keyword"> <span class="glyphicon glyphicon-remove form-control-feedback"></span> </form2:hasErrors> <%-- ã¢ã¤ã³ã³ã¯âã®æ¹æ³ã§ãåºåå¯è½ãã¨ã©ã¼æã®ã¿åºåããã <form2:element path="keyword" element="span" cssClass="glyphicon glyphicon-remove form-control-feedback" outIfError="true" /> --%> <form:errors path="keyword" cssClass="help-block with-errors"/> </form2:element><!-- /form-group --> <button type="submit" name="search" class="btn btn-primary"> <span class="glyphicon glyphicon-search"></span> <spring:message code="label.search"/> </button> </form:form>
ã«ã¹ã¿ã ã¿ã°<form2:element>
SpringMVCã®ã«ã¹ã¿ã ã¿ã°ç¨ã®æ½è±¡ã¯ã©ã¹ãorg.springframework.web.servlet.tags.form.AbstractHtmlElementTagãã使ç¨ãã¾ãã
ãã®ã¯ã©ã¹ã¯ãHTMLãåºåããããã®æ½è±¡ã¯ã©ã¹ã§ãã
ã¾ãããAbstractDataBoundFormElementTagããç¶æ¿ãã¦ãããå ¥åé ç®ãã¨ã®å±æ§ãpathãã§é¢é£ä»ããããå¤ãå¦çããããã®ã¡ã½ãããããã£ã¦ãã¾ãã
SpringMVCã®ã«ã¹ã¿ã ã¿ã°ã®å ±éå±æ§ãpathããcssClassããcssErrorClassããªã©ã®å¦çã¯ãæ½è±¡ã¯ã©ã¹ãªãã§äºãå®è£ ããã¦ãããããå®ç¾©ã¯å¿ è¦ããã¾ããã
import javax.servlet.jsp.JspException; import org.springframework.util.StringUtils; import org.springframework.web.servlet.tags.form.AbstractHtmlElementTag; import org.springframework.web.servlet.tags.form.TagWriter; /** * ã«ã¹ã¿ã ã¿ã°<form2:element>ã®å®ä½ã¯ã©ã¹ã */ @SuppressWarnings("serial") public class ElementTag extends AbstractHtmlElementTag { /** * ã«ã¹ã¿ã ã¿ã°ã®å±æ§ãelementãã®å¤ã * ã»åºåããã¿ã°åãä¿æãã * ã»ãã ããå±æ§ãelementErrorããæå®ããã¦ããã°ãã®å¤ãå©ç¨ããã */ private String element; /** * ã«ã¹ã¿ã ã¿ã°ã®å±æ§ãelementErrorãã®å¤ã * ã»ã¨ã©ã¼æã«åºåããã¿ã°åãä¿æãã */ private String elementError; /** * ã«ã¹ã¿ã ã¿ã°ã®å±æ§ãoutIfErrorãã®å¤ã * ã»ã¨ã©ã¼æã«ããåºåããªããã©ããã®ãã©ã°ã */ private boolean outIfError; private TagWriter tagWriter; @Override protected int writeTagContent(final TagWriter tagWriter) throws JspException { this.tagWriter = tagWriter; if(outIfError && !getBindStatus().isError()) { // ã¨ã©ã¼æã®ã¿ã«ããåºåããªãå ´åãå¦çãçµäºã return EVAL_BODY_INCLUDE; } if(getBindStatus().isError()) { if(StringUtils.hasLength(getElementError())) { tagWriter.startTag(getElementError()); } else { tagWriter.startTag(getElement()); } } else { tagWriter.startTag(getElement()); } // å±æ§ã®è¨å® writeDefaultAttributes(tagWriter); // éå§ã¿ã°ã®åºå tagWriter.forceBlock(); return EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { if(outIfError && !getBindStatus().isError()) { // ã¨ã©ã¼æã®ã¿ã«ããåºåããªãå ´åãå¦çãçµäºã return EVAL_PAGE; } // çµäºã¿ã°ã®åºå this.tagWriter.endTag(); return EVAL_PAGE; } @Override protected String getName() throws JspException { // This also suppresses the 'id' attribute (which is okay for a <label/>) return null; } @Override protected String resolveId() throws JspException { Object id = evaluate("id", getId()); if (id != null) { return super.resolveId(); } return null; } public String getElement() { return element; } public void setElement(String element) { this.element = element; } public String getElementError() { return elementError; } public void setElementError(String elementError) { this.elementError = elementError; } public boolean isOutIfError() { return outIfError; } public void setOutIfError(boolean outIfError) { this.outIfError = outIfError; } }
<!-- 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>Spring Framework JSP Form Tag Library for Another</description> <tlib-version>1.0</tlib-version> <short-name>form2</short-name> <uri>http://spring-webmvc/modules/tags/form2</uri> <tag> <description>Renders field errors in an HTML custom tag.</description> <name>element</name> <tag-class>sample.web.tags.ElementTag</tag-class> <body-content>JSP</body-content> <attribute> <description>HTML tag</description> <name>element</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description>HTML error tag</description> <name>elementError</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description>output tag, when has error. default false.</description> <name>outIfError</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description>Path to errors object for data binding</description> <name>path</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description>HTML Standard Attribute</description> <name>id</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> ã»ã»ã»ä»¥éã¯ãHTMLã®å±æ§ã®å®ç¾©ãªã®ã§çç¥ã ä»ã®Springç¨ã®ã«ã¹ã¿ã ã¿ã°ã®å®ç¾©ãåç §ã <tag> </taglib>
ã«ã¹ã¿ã ã¿ã°<form2:hasError>
SpringMVCã®ã«ã¹ã¿ã ã¿ã°ç¨ã®æ½è±¡ã¯ã©ã¹ãorg.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTagãã使ç¨ãã¾ãã
å
¥åé
ç®ãã¨ã®å±æ§ãpathãã§é¢é£ä»ããããå¤ãå¦çããããã®ã¡ã½ãããããã£ã¦ãã¾ãã
ã¨ã©ã¼ããããã©ããã®å¤å®ã ãã®ãããé常ã«ã·ã³ãã«ã§ãã
import javax.servlet.jsp.JspException; import org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag; import org.springframework.web.servlet.tags.form.TagWriter; /** * ã«ã¹ã¿ã ã¿ã°<form2:hasErrors>ã®å®ä½ã¯ã©ã¹ã */ @SuppressWarnings("serial") public class HasErrorsTag extends AbstractDataBoundFormElementTag { @Override protected int writeTagContent(final TagWriter tagWriter) throws JspException { if(getBindStatus().isError()) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } @Override public int doEndTag() { return EVAL_PAGE; } }
<!-- 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>Spring Framework JSP Form Tag Library for Another</description> <tlib-version>1.0</tlib-version> <short-name>form2</short-name> <uri>http://spring-webmvc/modules/tags/form2</uri> <tag> <description>Provides Errors instance in case of field errors.</description> <name>hasErrors</name> <tag-class>sample.web.tags.HasErrorsTag</tag-class> <body-content>JSP</body-content> <attribute> <description>Path to errors object for data binding</description> <name>path</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>