Spring MVC – jQuery Ajaxのリファクタリングの例
jQuery AjaxフォームのPOSTとSpring MVCの例を見て、以下のパターンを見つけてください:
<script>
jQuery(document).ready(
function($) {
$("#btn-save").click(function(event) {
var id = $('#id').val();
var domain = $('#domain').val();
var name = $('#name').val();
var desc = $('#desc').val();
var tags = $('#tags').val();
var afflink = $('#afflink').val();
var cdn = $("#cdn").prop("checked") ? true : false;
var hosting = $("#hosting").prop("checked") ? true : false;
var paas = $("#paas").prop("checked") ? true : false;
var display = $("#display").prop("checked") ? true : false;
var imageUrl = $('#imageUrl').val();
var favUrl = $('#favUrl').val();
var whoisPattern = $('#whoisPattern').val();
$("#btn-save").prop("disabled", true);
$.post("/path-to/hosting/save", {
id : id,
domain : domain,
name : name,
desc : desc,
tags : tags,
afflink : afflink,
display : display,
hosting : hosting,
cdn : cdn,
paas : paas,
imageUrl : imageUrl,
favUrl : favUrl,
whoisPattern : whoisPattern
}, function(data) {
var json = JSON.parse(data);
//...
}).done(function() {
}).fail(function(xhr, textStatus, errorThrown) {
}).complete(function() {
$("#btn-save").prop("disabled", false);
});
});
});
</script>
Spring MVCでは、 `@ RequestParam`を使ってAjax POSTデータを受け入れます。
@RequestMapping(value = "/path-to/hosting/save", method = RequestMethod.POST)
@ResponseBody
public String saveHosting(
@RequestParam int id, @RequestParam String domain, @RequestParam String name,
@RequestParam String desc, @RequestParam String tags, @RequestParam String afflink,
@RequestParam boolean display, @RequestParam boolean hosting,
@RequestParam boolean cdn, @RequestParam boolean paas,
@RequestParam String imageUrl, @RequestParam String favUrl,
@RequestParam String whoisPattern
) {
//...do something
}
上記のコードは正常に動作していますが、ちょっと変わったし、保守が難しいです。
Javascript
$。post 'とSpring MVC
@ RequestParam`は多すぎるパラメータを扱っています。
1.リファクタリングJavaScript
Javascriptでは、 `$ .ajax`を使い、すべてを配列に格納し、Spring MVCにPOSTします。
<script>
jQuery(document).ready(
function($) {
$("#btn-save").click(function(event) {
var data = {}
data["id"]= $("#id").val();
data["domain"]= $("#domain").val();
data["name"]= $("#name").val();
data["desc"]= $("#desc").val();
data["tags"]= $("#tags").val();
data["afflink"]= $("#afflink").val();
data["cdn"]= $("#cdn").prop("checked") ? true : false;
data["hosting"]= $("#hosting").prop("checked") ? true : false;
data["paas"]= $("#paas").prop("checked") ? true : false;
data["display"]= $("#display").prop("checked") ? true : false;
data["imageUrl"]= $("#imageUrl").val();
data["favUrl"]= $("#favUrl").val();
data["whoisPattern"]= $("#whoisPattern").val();
$("#btn-save").prop("disabled", true);
$.ajax({
type: "POST",
contentType: "application/json",
url: "/path-to/hosting/save",
data: JSON.stringify(data),
dataType: 'json',
timeout: 600000,
success: function (data) {
$("#btn-update").prop("disabled", false);
//...
},
error: function (e) {
$("#btn-save").prop("disabled", false);
//...
}
});
});
});
</script>
2.リファクタリングSpring MVC
2.1 Ajax POSTデータを格納するためのPOJOを作成します。
public class HostingForm {
private boolean display;
private boolean cdn;
private boolean hosting;
private boolean paas;
private String whoisPattern;
private long id;
private String domain;
private String name;
private String desc;
private String tags;
private String affLink;
private String imageUrl;
private String favUrl;
//getters and setters
2.2 `@ RequestBody`でAjax POSTデータを受け入れます。
@RestController//...
@RequestMapping(value = "/path-to/hosting/save", method = RequestMethod.POST)
public String updateHosting(@RequestBody HostingForm hostingForm) {
//...
}
@ RequestBody`では、Springは自動的にPOSTデータを
HostingForm` POJO(名前で)にマップします。完了しました。
参考文献
@RequestBody]。
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html
[Spring
@RequestParam]