Java for Web学习笔记(六四):Controller替代Servlet(6)Spring Form Tag

引入Spring <form> Tag

Spring提供一个方便使用form的Tag。将页面form的内容映射到对象中,作为方法的输入,也可以将Model中的数据映射至页面form的内容。使用FormHttpMessageConverter提供双向的转换,在上一次学习中,我们可以看到FormHttpMessageConverter是缺省默认加入的。

要在jsp中使用Spring的tag,需要引入taglib,我们可以在web.xml中配置全局引入的base.jspf:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspf</url-pattern>
    <page-encoding>UTF-8</page-encoding>
    <scripting-invalid>true</scripting-invalid>
    <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude>
    <trim-directive-whitespaces>true</trim-directive-whitespaces>
    <default-content-type>text/html</default-content-type>
  </jsp-property-group>
</jsp-config>
在base.jspf中加入Spring的<form>Tag
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

设置映射的对象:UserForm

public class UserForm {
    private String username;
    private String name;
    ... getters & setters ...
}
我们给每个User增加一个id,这样可以在模拟的数据库Map中作为key使用。实际上User相当于我们的业务对象,而UserForm是form对象,这两者通常不完全一致。我们需要对业务对象和form对象的差异有清晰的认识,业务对象可能含有更多的信息,可能某些属性的类型和form对象不同,也可能含有多个form对象。
public class User {
    private long id;
    private String username;
    private String name;
    ... getters & setters ...
}
在Controller中,我们维护一个Map存储用户的信息,并提供分配ID的方法。
@Controller
public class UserManagementController {
    private final Map<Long,User> userDatabase = new HashMap<>();    
    private volatile long userIdSequence = 1L;

    private synchronized long getNextUserId(){
        return userIdSequence ++;
    }
}

创建jsp文件

下面我们将通过edit某个用户的数据,演示如何利用<form>来实现form内容和UserForm对象之间的双向映射。

创建和form有关的jsp:form.jspf

将其作为jspf文件,是因为除了edit外,add也会使用到,无需重复代码

<%--@elvariable id="userForm" type="cn.wei.flowingflying.chapter13.site.UserForm"--%>
<!DOCTYPE html>
<html>
<head>
    <title>${title} </title>    
</head>
<body>
    <h1>${title} </h1>
        <!-- form:form是parent tag,无需给出action,缺省是当前的URL;
        modelAttribute表明页面内容和model中的userForm属性相互映射 -->
        <form:form method="post" modelAttribute="userForm">  
            <!-- path表明了userForm对象中的属性username相互映射 -->
            <form:label path="username">Username </form:label> <br />
            <form:input path="username" /> <br />
            <br/>
            <form:label path="name">Name: </form:label> <br />
            <form:input path="name" /> <br />
            <br/>
            <input type="submit" value="Save" />
     </form:form>
</body>
</html>

form tag还提供以下的tag:

  • <form:error>等同于<span>,和自动form对象检验有关,以后进一步学习
  • <form:label>相当于<label>
  • <form:hidden>相当于<input type="hidden">
  • <form:input>相当于<input type="text">
  • <form:password>相当于<input type="password">,有一个属性showPassword,缺省为flase,如果为true,就显示密码内容,等同<input type="text">。
  • <form:textarea>相当于<input type="textarea">
  • <form:checkbox>相当于<input type="checkbox">
  • <form:checkboxes>是checkbox的变体,自动创建多个check box field,可以表示Collection,Map,array,具有itemValue和itemLabel属性表示field的值和field label
  • <form:radiobutton>相当于<input type="radio">,通常我们会绑定两个或者多个至同一个path(即form对象属性)
  • <form:radiobuttons>和checkboxes类似,是radiobutton的变体。
  • <form:select>相当于<select>下拉或多选,和 <form:option>及<form:options>一起使用。可以根据path的值自动选择当前的选项。
  • <form:option>下属于<form:select>,等同于<option>
  • <form:options>和下checkboxes类似,是<form:option>的变体。

编辑用户的jsp:edit.jsp

<c:set var="title" value="Edit User" />
<%@ include file="form.jspf" %>

添加用户的jsp:add.jsp

<c:set var="title" value="Add User" />
<%@ include file="form.jspf" %>

Controller的处理

我们看看看UserManagementController 的相关方法

//user/list的显示所有用户,处理add和edit后均跳到此
@RequestMapping(value="user/list", method=RequestMethod.GET)    
public String displayUsers(Map<String,Object> model){
     ... ...
}

//【对象 ➤ 页面】add(GET),表示显示显示添加用户的页面。这里需要在Model里面添加属性userForm,作为jsp中的modelAttribute所对应的对象
@RequestMapping(value="user/add", method=RequestMethod.GET)
public String createUser(Map<String, Object> model){
    model.put("userForm", new UserForm());
    return "/user/add";
}

//【对象 <- 页面】add(POST),从页面中返回添加用户的信息。页面中信息已经和userForm对象向对应,将此作为输入参数即可。
@RequestMapping(value="user/add", method=RequestMethod.POST)
public View createUser(UserForm form){
    User user = new User();
    user.setUserId(getNextUserId());
    user.setName(form.getName());
    user.setUsername(form.getUsername());
    this.userDatabase.put(user.getUserId(), user);
    return new RedirectView("/user/list",true);
}

//【对象 ➤ 页面】edit(GET),同样的这里需要在Model里面添加属性userForm,作为jsp中的modelAttribute所对应的对象,而且进一步这个对象是有具体内容的。
@RequestMapping(value="user/edit/{userId}", method=RequestMethod.GET)
public String editUser(Map<String, Object> model, @PathVariable("userId") long userId){
    User user = this.userDatabase.get(userId); 
    UserForm form = new UserForm();
    form.setName(user.getName());
    form.setUsername(user.getUsername());
    model.put("userForm", form);
    return "user/edit";
}

 //【对象 <- 页面】edit(POST),和add类似,直接获取输入的对象
@RequestMapping(value="user/edit/{userId}", method=RequestMethod.POST)
public View editUser(UserForm form, @PathVariable("userId") long userId){
    User user = this.userDatabase.get(userId);
    user.setName(form.getName());
    user.setUsername(form.getUsername());
    return new RedirectView("/user/list",true);
}
相关链接: 我的Professional Java for Web Applications相关文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值