SpringMVC学习(二)

##Map
Map,即java.util.Map,在springMVC中起到了至关重要的作用。它是架起视图和Model层的一座桥梁。
在RequestMap标记的任何一个方法,都可以使用Map< String, Object >
作为入参,这个map最终会自动添加到view的请求域中,在view中可以使用${key }或${requestScope.key }将model取出。

注:Map中的key必须是String类型的,因为这个map相当于映射了请求域中的键值对。

下面看一个例子:

@RequestMapping("/emp")
    public String showEmployee(Map<String, Object> map){

        List<Employee> employees = employeeDao.selectAll();

        map.put("employees", employees);
        return "list";
    }

在这个路径下,将所有employee取出来放到map中,然后框架会带着这个map进入list.jsp这个view中去。

在list.jsp中引用:


    <c:if test="${empty requestScope.employees}">
        没有信息
    </c:if>

    <c:if test="${!empty requestScope.employees }">
        <table border="1" cellpadding="10" cellspacing="0">
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Gender</th>
                <th>Age</th>
                <th>Department</th>
                <th>Edit</th>
                <th>Delete</th>
            </tr>
            <c:forEach var="emp" items="${requestScope.employees }" >
                <tr>
                    <th>${emp.id}</th>
                    <th>${emp.name}</th>
                    <th>${emp.gender==0?'female':'male'}</th>
                    <th>${emp.age}</th>
                    <th>${emp.department.name}</th>
                    <th><a href="">edit</th>
                    <th><a href="">delete</a></th>
                </tr>
            </c:forEach>
        </table>
    </c:if>

抛去标签先不说,对于key=employees的这个model来说,取出来的时候就用${requestScope.employees }或者直接使用${ employees}即可。

下面介绍标签语言:

JSTL

jstl-c

jstl可以以标签的形式进行逻辑控制。
使用该标签配合EL表达式可以很方便的实现对model的一些操作。这些操作往往是对model的信息进行遍历显示等等。
在view中使用jstl需要在xml头部引入jstl标准库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

才能使用上述例子中的操作。

jstl-form

jstl还有很多有用的工具,比如form
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

使用这种form能够非常方便的跟对象映射起来。
正如SpringMVC之一中提到的@ModelAttribute标签标记过的方法。只不过是,原生的form可以不用ModelAttribute进行“预先映射实体”,仅仅是在有需要的时候进行一下预提取(见SpringMVC之一中@ModelAttribute的例子);但是在jstl中的form,springMVC默认其必须有一个实体进行映射,即在显示表单的时候,表单所对应的实体也必须放在requestScope中或者sessionValue中去。在requestScope的情况,就用到了上述的map。在对应的Controller方法中,将表单实体放入map,然后返回view名称。框架会自动带着map传入到对应的view页面。
view页面包含的这个jstl表单也有一些要求:
参照下面的例子,一一列举:

<form:form action="input" method="POST" modelAttribute="employee">
        Name: <form:input path="name" />
        <br>
        Age:  <form:input path="age"/>
        <br>
        Gender:<form:radiobuttons path="gender" items="${genders}"/>
        <br>
        DepartmentName:<form:select path="department.id" items="${departments}"
        itemLabel="name" itemValue="id"/>
        <br>
        <input type="submit" value="Submit"/>
    </form:form>
  1. action:对应着控制层路径;modelAttribute对应着表单的映射实体,它的值就是map中那个实体的key。如果不写modelAttribute,在默认情况下的值为“command”,也就是说如果map中没有加入“command”为key的映射对象,后台在提交表单的时候会报错:无法找到‘command’对应的参数。
  2. < form:input path=”xxx” /> 中的path,相当于原生form的name属性。在使用path的值时,一定要对应着实体类的变量名称,如<form:input path="age"/>。对于级联属性,则对应级联的属性名。如例子中的<form:select path="department.id" items="${departments}"
  3. jstl的form标签有很多组件,单选标签、复选框、普通的输入框等等,非常方便开发,这也是选用它的一大优势。不过注意:最后的提交按钮使用的仍然是原生input标签,这一点要注意。

以上例子中,form提交之后会到如下的方法中(以Post提交):
入参中的employee正是map中放入的“key”对应的实例employee。

@RequestMapping(value="/input", method=RequestMethod.POST)
    public String save(Employee employee){

        employeeDao.save(employee);

        return "redirect:/emp";
    }

最终重定向到/emp的页面中显示所有employee。

附:
SpringMVC 提供了多个表单组件标签,如
< form:input />、< form:select /> 等,用以绑定表单字段的
属性值,它们的共有属性如下:

  • path:表单字段,对应 html 元素的 name 属性,支持级联属性 –
  • htmlEscape:是否对表单值的 HTML 特殊字符进行转换,默认值 –
    为 true
  • cssClass:表单组件对应的 CSS – 样式类名
  • cssErrorClass:表单组件的数据存在错误时,采取的 CSS – 样式
  • form:input、form:password、form:hidden、form:textarea
    :对应 HTML 表单的 text、password、hidden、textarea
    标签
  • form:radiobutton: 单选框组件标签,当表单 bean 对应的
    属性值和 value 值相等时,单选框被选中
  • form:radiobuttons:单选框组标签,用于构造多个单选 •
  • items:可以是一个 List、String[] 或 Map –
  • itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个属性值
  • itemLabel:指定 radio 的 label值
  • delimiter:多个单选框可以通过 delimiter 指定分隔符
  • form:checkbox: 复选框组件。用于构造单个复选框
  • form:checkboxs:用于构造多个复选框。使用方式同
  • form:radiobuttons: 标签
  • form:select: 用于构造下拉框组件。使用方式同
  • form:radiobuttons: 标签
  • form:option: 下拉框选项组件标签。使用方式同
  • form:radiobuttons: 标签
  • form:errors:显示表单组件或数据校验所对应的错误

redirect和forward

redirect和forward跳转

Spring MVC 中的 forward 和 redirect

这两篇文章短小但重点突出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值