Spring2.0版本开始后,提供了一组功能强大的标签用来在JSP和SpringWebMVC中处理表单元素 ,可以用来访问控制器处理命令对象和绑定数据;
        以下是表单标签库中的所有标签;
form
input
password
hidden
textarea
checkbox
checkboxes
radiobutton
radiobuttons
select
option
options
errors
        其实这些标签库就是SpringMVC将我们的日常表单标签给封装了起来而已。所以只要记住他们的用法即可;对了,在使用这些封装后的标签的时候,你要先在jsp页面的第一行声明一下taglib指令:
<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>

          form和input标签的使用;上代码;

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form method = "post" action = "register">
<table>
<tr>
<td>姓名:</td>
<td><form:input path = "username"></td>
</tr>
<tr>
<td>性别:</td>
<td><form:input path = "sex"/></td>
</tr>
<tr>
<td>年龄:</td>
<td><form:input path = "age"/></td>
</tr>
</table>
</form:form>

   而在控制器这边,则只需要将user里面的属性设置好了之后放到modelAttribute模型容器中就可以了,其中要记得放入默认的容器command中

@Controller
public class UserController{
@RequestMapping(value = "/registerForm",method = RequestMethod.POST)
public String registerForm(Model model){
User user = new User("jack","男",28);
model.addAttribute("command",user);
return "registerForm";
}
}

  

这里我解释一下,<form:input path = "age"/>这个就是我说的封装之后的形态了,在jsp中会自动被渲染成<input id = "username" name = "username“ type = "text" value = "jack"/>能被封装成这样,还是挺不错的;
        那如果我不想使用默认的ModelAttribute容器那怎么办呢?你可以自己去定义一个容器的;其实也就是取个名字而已;
<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "register">
<table>
<tr>
<td>姓名:</td>
<td><form:input path = "username"></td>
</tr>
<tr>
<td>性别:</td>
<td><form:input path = "sex"/></td>
</tr>
<tr>
<td>年龄:</td>
<td><form:input path = "age"/></td>
</tr>
</table>
</form:form>

  在form表单标签中加一个modelAttribute = "user";就可以了;接下来是控制器的改变;

@RequestMapping(value = "/registerForm2",method = RequestMethod.GET)
public String registerForm2(Model model){
User user = new User("jack","男",28);
model.addAttribute("user",user);
return "registerForm2";
}

    接下来的几个标签都是正常操作,只是封装了path属性而已;

<form:password path = "password"/>
<form:hidden path = "id"/>
<form:textarea path = "remark" rows = "5" cols = "20"/>

  

       接下来的将是骚操作的开始;注意了:
        checkbox标签:这个标签要注意的点在于两个地方,你的全部选项和选中选项;
        这是第一种方式:将你的全部选项在JSP页面中全部列出来,选中选项进行封装,是为下策;

@Controller
public class UserController{
@RequestMapping(value = "/checkboxForm",method = RequestMethod.GET)
public String registerForm(Model model){
User user = new User();
user.setReader(true);
List<String> list = new ArrayList<String>();
list.add("JAVAEE");
list.add("Spring");
user.setCourses(list);
model.addAttribute("user",user);
return "checkboxForm";
}
}

        在这个控制器中,通过List容器来封装选中选项,而全部选项则是直接列出来JSP页面中

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "checkboxForm">
<table>
<tr>
<td>选择课程</td>
<td>
<form:checkbox path = "courses" value = "JAVAEE" label = "JAVAEE"/>
<form:checkbox path = "courses" value = "Mybatis" label = "MyBatis"/>
<form:checkbox path = "courses" value = "Spring" label = "Spring"/>
</td>
</tr>
</table>
</form:form>

  

        接下来是checkboxes标签的使用,这里呢,有三种方法,一种比一种好;
            1,用List容器,将全部选项和选中选项都封装起来;这样的话,跟上一个的区别在于,在JSP页面中,用item = "${courseList}"来替代掉一个个列出来;

@RequestMapping(value = "/checkboxesForm",method = RequestMethod.GET)
public String registerForm(Model model){
User user = new User();
List<String> list = new ArrayList<String>();
list.add("JAVAEE");
list.add("Spring");
user.setCourses(list);
List<String> courseList = new ArrayList<String>();
courseList.add("JAVAEE");
courseList.add("MyBatis");
courseList.add("Spring");
model.addAttribute("user",user);
model.addAttribute("courseList",courseList);
return "checkboxesForm";
}

          看到没有,将全部选项和选中选项全部进行封装,都放在modelAttribute容器中;

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "checkboxesForm">
<table>
<tr>
<td>选择课程:</td>
<td>
<form:checkboxes items = "${courseList}" path = "courses"/>
</td>
</tr>
</table>
</form:form>

  

        用一个items = ${...}即可了;
        2,前面我们说了,将两个都封装了起来,但是我们这样的话,就相当于你要写两次了,要是你的选项很长那可怎么办?下面是骚操作的开始;
        我们用另一种容器来封装试试,那就Map<String,String>容器,前一个Spring用数字来表示,后一个String才是真正的全部选项,这样的话,我们的选中选项可以直接用数字来表示了;上代码;

@RequesetMapping(value = "/checkboxesForm2",method = RequestMethod.GET)
public String registerForm2(Model model){
User user = new User();
List<String> list = new ArrayList<String>();
list.add("1");
list.add("3");
user.setCourses(list);
Map<String,String> courseMap = new HashMap<String, String>();
courseMap.put("1","JAVAEE");
courseMap.put("2","MyBatis");
courseMap.put("3","Spring");
model.addAttribute("user",user);
model.addAttribute("courseMap",courseMap);
return "checkboxesForm2";
}

          用Map容器封装,而JSP页面没有变化的;

<form:form modelAttribute = "user" method = "post" action = "checkboxesForm2">
<table>
<tr>
<td>选择课程:</td>
<td>
<form:checkboxes items = "${courseMap}" path = "courses"/>
</td>
</tr>
</table>
</form:form>

          好了,理论上这已经是最好的了,但是我们知道,这些选项到真正的企业开发中都是用到了数据库的,而谈到数据库,我们当然就想到了ORM数据库框架,而这些框架都是用对象来映射对应的数据库数据的,那我们能不能将这些选项(不管是全部还是选中)先封装在一个对象中,然后再把这一个个的对象封装到list模型里面呢?这才是真正的骚操作啊。。。。

@RequestMapping(value = "/checkboxesForms",method = requestMethod.GET)
public String registerForm3(Model model){
Employee employee = new Employee();
Dept dept = new Dept(1,"开发部");
List<dept> list = new ArrayList<Dept>();
list.add(dept);
employee.setDepts(list);
List<Dept> deptList = new ArrayList<Dept>();
deptList.add(dept);
deptList.add(new Dept(2,"销售部"));
deptList.add(new Dept(3,"财务部"));
model.addAttribute("employee",employee);
model.addAttribute("deptList",deptList);
return "checkboxesForm3";
}

          看到了吗,将选项封装成对象,再将对象封装在list容器中,而在JSP页面要注意一点,你要声明对象里面有什么?不然的话就是一个对象的地址而已

<form:form modelAttribute = "employee" method = "post" action = "checkboxesForm3">
<table>
<tr>
<td>选择部门:</td>
<td>
<form:checkboxes items = "${deptList}" path = "depts"
itemLabel = "name" itemValue = "id"/>
</td>
</tr>
</table>
</form:form>

  

        介绍完这个之后,接下来的标签就是差不多的了。
        radiobutton标签;
        1,全部选项列出来;

@Controller
public class UserController{
@RequestMapping(value = "/radiobuttonForm",method = RequestMethod.GET)
public String registerForm(Model model){
User user = new User();
user.setSex("男");
model.addAttribute("user",user);
return "radiobuttonForm";
}
}

          Controller内容如下;

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "radiobuttonForm">
<table>
<tr>
<td>性别:</td>
<td>
<form:radiobutton path = "sex" value = "男"/>男
<form:radiobutton path = "sex" value = "女"/>女
</td>
</tr>
</table>
</form:form>

  

        radiobuttons标签;
        可以有两种方法,List容器和Map容器;

@RequestMapping(value = "/radiobuttonsForm",method = RequestMethod.GET)
public String registerForm2(Model model){
User user = new User();
user.setSex("男");
List<String> sexList = new ArrayList<String>();
sexList.add("男");
sexList.add("女");
model.addAttribute("user",user);
model.addAttribute("sexList",sexList);
return "radiobuttonsForm";
}

  

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "radiobuttonForm">
<table>
<tr>
<td>性别:</td>
<td>
<form:radiobuttons path = "sex" items = "${sexList}"/>
</td>
</tr>
</table>
</form:form>

          下面是Map容器方法;

@RequestMapping(value = "/radiobuttonForm2",method = RequestMethod.GET)
public class registerForm3(Model model){
User user = new User();
user.setSex("1");
Map<String,String> sexMap = new HashMap<String,String>();
sexMap.put("1","男");
sexMap.put("2","女");
model.addAttribute("user",user);
model.addAttribute("sexMap",sexMap);
return "radiobuttonsForm2";
}

  

<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form" %>
<form:form modelAttribute = "user" method = "post" action = "radiobuttonForm">
<table>
<tr>
<td>性别:</td>
<td>
<form:radiobuttons path = "sex" items = "${sexMap}"/>
</td>
</tr>
</table>
</form:form>

  

        接下来是select标签,option标签,options标签;
        有三种方法,全选选项列出来,Map容器,List对象封装

@RequestMapping(value = "/selectForm",method = RequestMethod.GET)
public String selectForm(Model model){
User user = new User();
user.setDeptId(2);
model.addAttribute("user",user);
return "selectForm";
}

  

<form:form modelAttribute = "user" method = "post" action = "selectForm">
<table>
<tr>
<td>部门:</td>
<td>
<form:select path = "deptId">
<form:option value = "1">财务部</form:option>
<form:option value = "2">开发部</form:option>
<form:option value = "3">销售部</form:option>
</form:select>
</td>
</tr>
</table>
</form:form>

  

@RequestMapping(value = "/selectForm2",method = RequestMethod.GET)
public String selectForm2(Model model){
User user = new User();
user.setDeptid(2);
Map<Integer,String> deptMap = new HashMap<Integer,String>();
deptMap.put(1,"财务部");
deptMap.put(2,"开发部");
deptMap.put(3,"销售部");
model.addAttribute("user",user);
model.addAttribute("deptMap",deptMap);
return "selectForm2";
}

  

<form:form modelAttribute = "user" method = "post" action = "selectForm2">
<table>
<tr>
<td>部门:</td>
<td>
<form:select path = "deptId" items = "${deptMap}"/>
</td>
</tr>
</table>
</form:form>

  

@RequestMapping(value = "/selectForm4",method = RequestMethod.GET)
public String selectForm4(Model model){
User user = new User();
user.setDeptId(2);
List<Dept> deptList = new ArrayList<Dept>();
deptList.add(new Dept(1,"财务部"));
deptList.add(new Dept(2,"开发部"));
deptList.add(new Dept(3,"销售部"));
model.addAttribute("user",user);
model.addAttribute("deptList",deptList);
return "selectForm4";
}

  

<form:form modelAttribute = "user" method = "post" action = "selectForm2">
<table>
<tr>
<td>部门:</td>
<td>
<form:select path = "deptId" items = "${deptList}"
itemLabel = "name" itemValue = "id"/>
</td>
</tr>
</table>
</form:form>

  

其中,itemLabel表示的是Map中的key,itemValue表示的是Map中的value;
        errors标签;这个标签相当于将我们平时对项目执行中出现的各种用户的误操作进行了囊括和封装,将错误的类型列出来并做了相应的处理。首先,我们需要一个UserValidator;

public class UserValidator implements Validator{
@Override
public boolean supports(Class<?> clazz){
return User.class.equals(clazz);
}
@Override
public void validator(Object object,Errors errors){
ValidatorUtils.rejectIfEmpty(errors,"username",null,"用户名不能为空");
ValidatorUtils.rejectIfEmpty(errors,"sex",null,"性别不能为空");
ValidatorUtils.rejectIfEmpty(errors,"age",null,"年龄不能为空");
}
}

  UserValidator类实现org.springframework.validator.Validator接口,完成验证的功能;

@Controller
public class UserController{
@RequestMapping(value = "/registerForm",method = RequestMethod.GET)
public String registerForm(Model model){
User user = new User();
model.addAttribute("user",user);
return "registerForm";
}
@InitBinder
public void initBinder(DataBinder binder){
binder.setValidator(new UserValidator());
}
@RequestMapping(value = "/register",method = RequestMethod.POST)
public String register(@Validated User user,Errors errors){
if(errors.hasFieldErrors())
return "registerForm";
return "submit";
}
}

  UserController类使用@InitBinder注解绑定验证对象;

<form:form modelAttribute = "user" method = "post" action = "register">
<table>
<tr>
<td>姓名</td>
<td><form:input path = "username"/></td>
<td><font color = "red"><form:errors path = "username"></font></td>
</tr>
<tr>
<td>性别</td>
<td><form:input path = "sex"/></td>
<td><font color = "red"><form:errors path = "sex"></font></td>
</tr>
<tr>
<td>年龄</td>
<td><form:input path = "age"/></td>
<td><font color = "red"><form:errors path = "age"></font></td>
</tr>
</table>
</form:form>

  

在registerForm.jsp页面中,在每个需要输入的空间后面增加一个errors标签,用来显示错误信息;

SpringMVC的标签库的更多相关文章

  1. springmvc表单标签库的使用

    springmvc中可以使用表单标签库,支持数据绑定,用来将用户输入绑定到领域模型. 例子来源<Servlet.JSP和SpringMVC学习指南> 项目代码 关键代码及说明 bean对象 ...

  2. springMVC学习总结(二) --springMVC表单处理、标签库、静态文件处理

    根据springMVC学习总结(一) --springMVC搭建 搭建项目 一.表单处理 1.创建两个java类 Student.java, StudentController.java. 2.在js ...

  3. springMVC项目引入jstl标签库若干问题的总结

    中午,不知道动到项目的哪个地方了,之前在联系人列表页面用的好好的jstl标签库突然报错了:<%@taglib prefix="c" uri="http://java ...

  4. 自定义jstl标签库

    开发环境:Spring+SpringMVC +Maven +Mybatis JSTL 标签库的配置: 导入对应的 jstl.jar 和 standard.jar ,我使用的配置如下: <prop ...

  5. 关于Spring MVC中的表单标签库的使用

    普通的MVC设计模式中M代表模型层,V代表视图层,C代表控制器,SpringMVC是一个典型的MVC设置模式的框架,对于视图和控制器的优化很多,其中就有与控制器相结合的JSP的表单标签库. 我们先简单 ...

  6. jsp引用JSTL核心标签库

    一.引用JSTL 1.  JSTL的引入可以让JSP代码中<%%>等代码消失掉,再结合EL表达式,会更加方便以及美观. 2.  各套框架(还没有学习,比如struts,SpringMVC等 ...

  7. Spring MVC -- JSP标准标签库(JSTL)

    JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能.JSTL支持通用的.结构化的任务,比如迭 ...

  8. Spring MVC框架及标签库

    1.Spring MVC技术 1. 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求.DispatcherServlet通过一个或者多个处理程序映射,将每个请求映射到 ...

  9. JSP 标准标签库(JSTL)

    JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...

随机推荐

  1. eclipse修改默认workspace

    1.进入 Window > Preferences > General > Startup and Shutdown 选中 Prompt for workspace on start ...

  2. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

  3. xBIM 格式之间转换

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  4. SpringMVC源码情操陶冶-HandlerAdapter适配器简析

    springmvc中对业务的具体处理是通过HandlerAdapter适配器操作的 HandlerAdapter接口方法 列表如下 /** * Given a handler instance, re ...

  5. 洛谷 [P3973] 线性代数

    最大权闭合子图,神题 这不是线性代数,这是网络流. 我们看见这是一堆矩阵的运算,而且最后变成了一个数,那么我们就想到,把这个矩阵乘法的过程用具体的数字推出来 我们发现,a是一个01矩阵,然后其实就可以 ...

  6. vue2.0路由进阶

    一.路由的模式 第一种用history方式实现,HTML5使用window.history.pushState()实现路由的切换而不刷新页面. 第二种使用hash值的方式来实现. vue2.0两种都可 ...

  7. 【IT人】如何提高阅读源代码的效率

    1.最近刚到公司,公司就发一架构代码自己看,看了几天看的想吐,也在网上找了下相关的技巧吧,不是有句话叫做:成功必有方法,失败总是借口! 2.借鉴别人的方法来看看如下: 记得在开源流行之前,我看过的代码 ...

  8. opencv-python与c++ opencv中的一些区别和基础的知识

    使用opencv-python一段时间了,因为之前没有大量接触过c++下的opencv,在网上看c++的一些程序想改成python遇到了不少坑,正好在这里总结一下. 1.opencv 中x,y,hei ...

  9. 用 k8s 运行一次性任务 - 每天5分钟玩转 Docker 容器技术(132)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  10. 用Android属性动画实现和演示迪士尼动画基本原则

    本文将介绍在Android平台上实现和演示迪士尼动画基本准则. 项目开源,GitHub: https://github.com/vhow/animation 说明: 演示动画原则的想法源自 Anima ...