发布于2021-06-14 09:52 阅读(415) 评论(0) 点赞(3) 收藏(5)
SpringMVC提供了两套标签库,这两套标签库的TLD文件位于spring-webmvc-x.x.x.RELEASE.jar压缩包的/META-INF/路径下,文件名分别为:spring.tld和spring-form.tld。
- spring.tld定义的标签库:主要用于输出错误信息,设置主题和输出国际化。
- spring-form.tld定义的标签库:主要用于将表单域与model属性进行绑定。
form标签及以下普通表单域标签都位于spring-form.tld文件中,为了使用这些标签,需要先使用taaglib指令导入form标签库。例如:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
指令中的uri指定标签库的URI,该URI由标签库的TLD文件定义(由spring-form.tld文件定义),相当于标签库的唯一标识,因此不能更改。prefix指定标签库的短名前缀,该属性值可以随意改变,但一般建议与标签库的TLD文件中的<short-name.../>元素保持一致。
form标签用于生成HTML的<form.../>标签,在使用form标签时,可指定如下属性:
- cssClass:相当于指定HTML的class属性。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出内容执行HTML转义。
- methodParam:指定通过哪个参数来表示GET、POST之外的其他请求。默认值为_method,表明使用_method参数。
- modelAttribute:表明该表单域默认绑定哪个model属性,默认值为command。
此外,form标签还支持大量HTML的标准属性,比如enctype、method、onclick等,这些属性与HTML的<form.../>标签中同名的属性完全一样。
button标签用于生成HTML的type为submit、reset或button的<input.../>标签,在使用button标签时没有额外的属性可指定,它支持HTML的<input.../>标签的所有标准属性。
hidden标签用于生成HTML的type为hidden的<input.../>标签。hidden标签除了支持HTML的<input.../>标签的所有标准属性,还支持如下额外的属性:
- htmlEscape:指定是否对输出值进行HTML转义。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将表单域的path属性指定为name。
input标签用于生成HTML的type为text的<input.../>标签。input标签除支持HTML的<input.../>标签的所有标准属性外,还支持如下额外属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
password标签用于生成HTML的type为password的<input.../>标签。password标签除了支持HTML的<input.../>标签的所有标准属性,还支持如下额外属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
textarea标签用于生成HTML的<textarea.../>标签。textarea标签除了支持HTML的<input.../>标签的所有标准属性,还支持如下额外属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
这些表单域标签支持的属性大同小异,主要就是使用path属性来绑定model属性的属性。
@Controller public class BookController { // 依赖注入bookService组件 @Resource(name = "bookService") private BookService bookService; @GetMapping("/bookForm") public String bookForm(Book b,Model model) { b.setName("疯狂Java讲义"); b.setPrice(50); b.setDomain("crazyit.org"); b.setDescription("简单描述"); System.out.println(model.asMap()); return "bookForm"; } // @PostMapping指定该方法处理/addBook请求 @PostMapping("/addBook") public String add(Book book, Model model) throws Exception { bookService.addBook(book); model.addAttribute("tip", book.getName() + "图书添加成功!"); return "success"; } }
<div class="container"> <img src="${pageContext.request.contextPath}/imgs/logo.gif" class="rounded mx-auto d-block"><h4>添加图书</h4> <form:form method="post" action="addBook" modelAttribute="book"> <form:hidden id="domain" path="domain"/> <div class="form-group row"> <form:label path="name" class="col-sm-3 col-form-label">图书名:</form:label> <div class="col-sm-9"> <form:input type="text" id="name" path="name" class="form-control" placeholder="请输入图书名"/> </div> </div> <div class="form-group row"> <form:label path="price" class="col-sm-3 col-form-label">价格:</form:label> <div class="col-sm-9"> <form:input type="number" id="price" path="price" class="form-control" placeholder="请输入价格" /> <!-- ① --> </div> </div> <div class="form-group row"> <form:label path="author" class="col-sm-3 col-form-label">作者:</form:label> <div class="col-sm-9"> <form:input type="text" id="author" path="author" class="form-control" placeholder="请输入作者名"/> </div> </div> <div class="form-group row"> <form:label path="description" class="col-sm-3 col-form-label">描述信息:</form:label> <div class="col-sm-9"> <form:textarea type="text" id="description" path="description" class="form-control" placeholder="请输入描述信息"/> </div> </div> <div class="form-group row"> <div class="col-sm-6 text-right"> <form:button type="submit" class="btn btn-primary">添加</form:button> </div> <div class="col-sm-6"> <form:button type="reset" class="btn btn-danger">重设</form:button> </div> </div> </form:form> </div>
radiobutton标签用于生成HTML的type为radio的<input.../>标签。radiobutton标签除了支持HTML的<input.../>标签的所有标准属性外,还支持如下额外属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- label:指定该单选按钮的标签。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
当radiobuttons标签绑定的model属性的属性值与该标签的value属性值相等时,该单选按钮就会自动处于选中状态。
radiobuttons标签用于生成多个HTML的type为radio的<input.../>标签。radiobuttons标签除支持普通radiobutton标签的全部属性之外,还支持如下额外属性:
- delimiter:指定单选按钮之间的分隔符。
- element:指定用于包围每个单选按钮的HTML元素,默认是<span.../>元素。
- items:指定一个集合、Map或数组属性,每个元素生成一个单选按钮。
- itemLabel:指定集合元素或数组元素的属性名,该属性的值将作为单选按钮的label。
- itemValue:指定集合元素或数组元素的属性名,该属性的值将作为单选按钮的value值。
@Controller public class EmployeeController { @GetMapping("/employeeForm") public String employeeForm(@ModelAttribute("employee") Employee emp, Model model) { // 初始化employee属性 emp.setName("孙悟空"); emp.setDiploma("大专"); emp.setCity(1); HashMap citys = new HashMap(); citys.put(1,"花果山");citys.put(2,"福陵山");citys.put(3,"积雷山"); // 为model添加一个citys属性,该属性的值是一个Map model.addAttribute("citys", citys); return "employeeForm"; } @PostMapping("/addEmployee") public String addEmployee(Employee emp, Model model) { System.out.println("--添加员工:" + emp); model.addAttribute("tip", "添加员工成功"); return "success"; } }
<form:form method="post" action="addEmployee" modelAttribute="employee"> <div class="form-group row"> <form:label path="name" class="col-sm-3 col-form-label">员工名:</form:label> <div class="col-sm-9"> <form:input type="text" id="name" path="name" class="form-control" placeholder="请输入员工名"/> </div> </div> <div class="form-group row"> <form:label path="diploma" class="col-sm-3 col-form-label">学历:</form:label> <div class="col-sm-9"> <form:radiobutton path="diploma" value="大专" label="大专"/> <form:radiobutton path="diploma" value="本科" label="本科"/> <form:radiobutton path="diploma" value="硕士以上" label="硕士及以上"/> </div> </div> <div class="form-group row"> <form:label path="city" class="col-sm-3 col-form-label">居住城市:</form:label> <div class="col-sm-9"> <form:radiobuttons path="city" items="${citys}" class="form-check-input" element="div"/> </div> </div> <div class="form-group row"> <div class="col-sm-6 text-right"> <form:button type="submit" class="btn btn-primary">添加</form:button> </div> <div class="col-sm-6"> <form:button type="reset" class="btn btn-danger">重设</form:button> </div> </div> </form:form>
checkbox标签用于生成HTML的type为checkbox的<input../>标签。checkbox标签除支持HTML的<input.../>标签的所有标准属性外,还支持如下额外属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- label:指定该复选框的标签。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
当checkbox标签绑定的model属性的属性值与该标签的value属性值相等时,该复选框就会自动处于选中状态。
checkboxes标签用于生成多个HTML的type为checkbox的<input.../>标签。checkboxes标签除支持HTML的<input.../>标签的所有标准属性外,还支持如下额外属性:
- delimiter:指定单选按钮之间的分隔符。
- element:指定用于包围每个单选按钮的HTML元素,默认是<span.../>元素。
- items:指定一个集合、Map或数组属性,每个元素生成一个单选按钮。
- itemLabel:指定集合元素或数组元素的属性名,该属性的值将作为单选按钮的label。
- itemValue:指定集合元素或数组元素的属性名,该属性的值将作为单选按钮的value值。
@Controller public class FinanceController{ @GetMapping("/financeForm") public String financeForm(@ModelAttribute("finance") Finance finance, Model model){ // 初始化finance属性 finance.setName("牛魔王"); finance.setAssets(List.of("股票", "债券", "房产")); finance.setCountries(List.of("086", "001")); var countries = List.of(new Country("001", "美国"), new Country("086", "中国"), new Country("061", "澳大利亚")); // 为model添加一个countries属性,该属性的值是一个List<Country>对象 model.addAttribute("countries", countries); return "financeForm"; } @PostMapping("/addFinance") public String addFinance(Finance finance, Model model){ System.out.println("--添加财务信息:" + finance); model.addAttribute("tip", "添加财务成功"); return "success"; } }
<form:form method="post" action="addFinance" modelAttribute="finance"> <div class="form-group row"> <form:label path="name" class="col-sm-3 col-form-label">客户名:</form:label> <div class="col-sm-9"> <form:input type="text" id="name" path="name" class="form-control" placeholder="请输入客户名"/> </div> </div> <div class="form-group row"> <form:label path="assets" class="col-sm-3 col-form-label">资产组成:</form:label> <div class="col-sm-9"> <form:checkbox path="assets" value="股票" label="股票"/> <form:checkbox path="assets" value="基金" label="基金"/> <form:checkbox path="assets" value="债券" label="债券"/> <form:checkbox path="assets" value="股份" label="股份"/> <form:checkbox path="assets" value="房产" label="房产"/> </div> </div> <div class="form-group row"> <form:label path="countries" class="col-sm-3 col-form-label">居住国家:</form:label> <div class="col-sm-9"> <form:checkboxes path="countries" items="${countries}" element="div" itemValue="code" itemLabel="name" class="form-check-input"/> </div> </div> <div class="form-group row"> <div class="col-sm-6 text-right"> <form:button type="submit" class="btn btn-primary">添加</form:button> </div> <div class="col-sm-6"> <form:button type="reset" class="btn btn-danger">重设</form:button> </div> </div> </form:form>
select标签用于生成HTML的<select.../>标签,如果为该标签指定了items属性,该标签还能为HTML的<select.../>标签生成列表项。select标签除支持HTML的<select.../>标签的所有标准属性之外,还支持如下额外的属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
- path:指定将该标签绑定到model属性的哪个属性路径。比如希望将该表单域绑定到model中book属性的name属性,应该先将form标签的modelAttribute属性指定为book,再将该表单域的path属性指定为name。
- items:指定一个集合、Map或数组属性,每个元素生成一个列表项。
- itemLabel:指定集合元素或数组元素的属性名,该属性的值将作为列表项的label。
- itemValue:指定集合元素或数组元素的属性名,该属性的值将作为列表项的value值。
option标签用于为HTML的<select.../>标签生成单个列表项。option标签除支持HTML的<select.../>标签的所有标准属性外,还支持如下额外的属性:
- cssClass:相当于指定HTML的class属性。
- cssErrorClass:相当于指定HTML的class属性;当该表单域的数据校验出现错误时,该class属性将会作用于显示校验错误的元素。
- cssStyle:相当于指定HTML的style属性。
- htmlEscape:指定是否对输出值进行HTML转义。
options标签用于为HTML的<select.../>标签生成多个列表项。options标签除支持与option标签相同的属性之外,还支持如下额外的属性:
- items:指定一个集合、Map或数组属性,每个元素生成一个列表项。
- itemLabel:指定集合元素或数组元素的属性名,该属性的值将作为列表项的label。
- itemValue:指定集合元素或数组元素的属性名,该属性的值将作为列表项的value值。
@Controller public class VacationController{ @GetMapping("/vacationForm") public String vacationForm(@ModelAttribute("vacation") Vacation vacation, Model model){ // 初始化vacation属性 vacation.setName("猪八戒"); vacation.setTransport("3"); vacation.setCountries(List.of("086", "001")); var countries = List.of(new Country("001", "美国"), new Country("044", "英国"), new Country("061", "澳大利亚")); // 为model添加一个countries属性,该属性的值是一个List<Country>对象 model.addAttribute("countries", countries); // 为model添加一个transports属性,该属性的值是一个Map<String, String> model.addAttribute("transports", Map.of("1", "火车", "2", "飞机", "3", "邮轮")); return "vacationForm"; } @PostMapping("/addVacation") public String addVacation(Vacation vacation, Model model){ System.out.println("--添加度假信息:" + vacation); model.addAttribute("tip", "添加度假成功"); return "success"; } }
<form:form method="post" action="addVacation" modelAttribute="vacation"> <div class="form-group row"> <form:label path="name" class="col-sm-3 col-form-label">客户名:</form:label> <div class="col-sm-9"> <form:input type="text" id="name" path="name" class="form-control" placeholder="请输入客户名"/> </div> </div> <div class="form-group row"> <form:label path="transport" class="col-sm-3 col-form-label">交通方式:</form:label> <div class="col-sm-9"> <form:select id="transport" path="transport" class="custom-select" items="${transports}"/> </div> </div> <div class="form-group row"> <form:label path="countries" class="col-sm-3 col-form-label">意向国家</form:label> <div class="col-sm-9"> <form:select id="countries" path="countries" multiple="multiple" class="custom-select"> <form:option label="法国" value="034" /> <form:option label="德国" value="049" /> <optgroup label="英语国家"> <form:options items="${countries}" itemValue="code" itemLabel="name" /> </optgroup> </form:select> </div> </div> <div class="form-group row"> <div class="col-sm-6 text-right"> <form:button type="submit" class="btn btn-primary">添加</form:button> </div> <div class="col-sm-6"> <form:button type="reset" class="btn btn-danger">重设</form:button> </div> </div> </form:form>
为了使用spring.tld标签,需要先使用taglib指令导入标签库:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
上面指令中的uri指定标签库的URI,该URI由标签库的TLD文件定义(由spring.tld文件定义),相当于标签库的唯一标识,因此不能更改。prefix指定标签库的短名前缀,该属性值可随意改变,但一般建议与标签库的TLD文件中的<short-name.../>元素保持一致。
htmlEscape标签只支持一个defaultHtmlEscape属性,用于覆盖web.xml中defaultHtmlEscape参数的值;该标签设置的defaultHtmlEscape属性值仅对当前页面起作用。
如果想对页面中某一段内容执行转义,则可使用escapeBody标签,该标签支持如下两种属性:
- htmlEscape:指定是否对HTML代码执行转义。
- javaScriptEscape:指定是否对JS代码进行转义。
<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %> <!-- 导入Spring MVC的标签库 --> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" href="${pageContext.request.contextPath}/res/bootstrap-4.3.1/css/bootstrap.min.css"> <script src="${pageContext.request.contextPath}/res/jquery-3.4.1.min.js"> </script> <script src="${pageContext.request.contextPath}/res/bootstrap-4.3.1/js/bootstrap.min.js"> </script> <title> escapeBody标签 </title> </head> <body> <div class="container"> <div class="alert alert-primary"> <spring:escapeBody htmlEscape="true"> <ul> <li>疯狂Java讲义</li> </ul> </spring:escapeBody> </div> <div class="alert alert-primary"> <spring:escapeBody htmlEscape="true" javaScriptEscape="true"> <ul> <li>疯狂Java讲义</li> </ul> </spring:escapeBody> </div> </div> </body> </html>
<ul> <li>疯狂Java讲义</li> </ul> \n <ul>\n <li>疯狂Java讲义<\/li>\n <\/ul>\n上面程序中<spring:escapeBody.../>标签对它包含的一段HTML代码执行转义。由于值指定了htmlEscape="true",因此该标签只对HTML代码执行转义:主要就是对尖括号执行转义。
上面程序中<spring:escapeBody.../>标签对它包含的一段HTML代码执行转义。由于值指定了htmlEscape="true"和javaScriptEscape="true",这意味着该标签会同时对HTML代码和JS代码执行转义:不仅会对尖括号执行转义,还会对代码中的换行、空格等字符执行转义。
url标签用于构建一个URL,使用它可以非常方便地构建绝对地址,避免应用重构时出现引用资源丢失的问题。之前使用:
<link rel="stylesheet" href="${pageContext.request.contextPath}/res/bootstrap-4.3.1/css/bootstrap.min.css">
由于实际项目在开发过程中经常会发生重构,比如abc.jsp页面原来被放在引用的根路径下,那么它与被引用资源的相对路径是以根路径作为基路径的;一旦项目发生重构,如将abc.jsp页面移动到项目的/foo路径下,此时它与被引用资源的相对路径就以/foo路径为基路径——原来按相对路径引用的资源全部失效,这就意味着所有引用资源的代码都需要改写。因此,在实际项目中引入资源时都会避免使用相对路径,而是使用${pageContext.request.contextPath}来获取绝对路径。
url标签不仅代替了${pageContext.request.contextPath}的写法,而且还支持在URL中使用参数。url标签支持如下属性:
- value:指定要构建的URL。在value属性指定的URL中可以使用{placeholders}形式占位符。
- context:指定其他应用的context路径。如果不指定该属性,默认使用当前应用的context路径。
- var:如果指定该属性,则表明该标签生成的URL不在页面上输出,而是以var指定的变量名保存起来。
- scope:该属性需要与var属性结合使用,scope属性指定要将var指定的变量存入application、session、request或page范围内。
- htmlEscape:指定是否对HTML代码执行转义。
- javaScriptEscape:指定是否对JS代码执行转义。
如果url标签的value属性值中包含了占位符,则可使用param标签为这些占位符指定参数值。param标签可指定如下两个属性:
- name:指定参数名。
- value:指定参数值。
<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %> <!-- 导入Spring MVC的标签库 --> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" href="${pageContext.request.contextPath}/res/bootstrap-4.3.1/css/bootstrap.min.css"> <script src="${pageContext.request.contextPath}/res/jquery-3.4.1.min.js"> </script> <script src="${pageContext.request.contextPath}/res/bootstrap-4.3.1/js/bootstrap.min.js"> </script> <title> url标签 </title> </head> <body> <div class="container"> <div class="alert alert-primary"> <spring:url value="/owners/{name}"> <spring:param name="name" value="charbear"/> </spring:url> </div> <div class="alert alert-primary"> <spring:url value="/authors/{authorId}/books/{bookId}"> <spring:param name="authorId" value="crazyit.org"/> <spring:param name="bookId" value="2"/> </spring:url> </div> <div class="alert alert-primary"> <spring:url value="/owners/{name}" context="test"> <spring:param name="name" value="charbear"/> </spring:url> </div> <a href="<spring:url value='/authors/2'/>" class="btn btn-primary">查看作者</a> <a href="<spring:url value='/authors/2' context='other'/>" class="btn btn-primary">查看作者</a> </div> </body> </html>
- <spring:eval.../>标签:用于计算、输出表达式的值,如果不需要对表单时的值进行格式化,则世界使用JSP EL输出即可;但如果需要利用格式化器对表达式的值执行格式化,则应使用<spring:eval.../>标签。
- <spring:message.../>标签:用于输出国际化消息,它的code属性用于指定国际化消息的key。
- <spring:argument.../>标签:放在<spring:message.../>标签内部,用于为国际化消息中的占位符提供参考值。
还有一些如:bind、nestedPath、transform等标签,早期可能还偶尔遇到,现在基本很少使用了。
作者:skdk
链接:http://www.javaheidong.com/blog/article/222608/f99d7606ddc758c24d80/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!