java spring MVC,REST点击链接后的删除方法
我正在创建一个网页,允许用户添加新地址,删除和更新地址列表。我的“添加新地址”正在工作,但是“删除地址”不起作用。java spring MVC,REST点击链接后的删除方法
请检查下面我的界面设计,以便更好地理解,帮助将不胜感激。
这是我的“添加新地址”的工作代码,也是非工作的“删除地址”代码。
在控制器:
@RequestMapping(value = "/addressBook", method = RequestMethod.GET)
public Object AddressBook(HttpSession session) throws Exception {
try{
String memberId= (String) session.getAttribute("memberId");
String addressId = (String) session.getAttribute("addressId");
List<Address> addresses = memberService.detail(memberId).getAddresses();
return new ModelAndView("account/addressBook").addObject("addressList", addresses);
} catch (Exception e) {
return new ModelAndView("account/addressBook")
.addObject("error", "No address book found");
}
}
@RequestMapping(value = "/addNewAddress", method = RequestMethod.GET)
public Object AddNewAddress() {
return "account/addNewAddress";
}
@RequestMapping(value = "/addNewAddress", method = RequestMethod.POST)
public Object AddNewAddress(@ModelAttribute AddAddress addAddress, HttpSession session, RedirectAttributes redirectAttributes) {
try {
String memberId = (String)session.getAttribute("memberId");
AddressDetail address1 = memberService.add(addAddress, memberId);
session.setAttribute("addressId", address1.getId());
return "redirect:/addressBook";
} catch (Exception e) {
return new ModelAndView("member/addNewAddress")
.addObject("addressList", addAddress)
.addObject("error", e.getMessage());
}
}
@RequestMapping(value="/deleteAddress" , method =RequestMethod.DELETE)
public Object DeleteAddress(HttpSession session) throws Exception {
String addressId = (String) session.getAttribute("addressId");
String memberId = (String) session.getAttribute("memberId");
AddressDetail addressDetail = memberService.deleteAddress(memberId, addressId);
return new ModelAndView("account/addressBook")
.addObject("success", "Address Deleted")
;
// "redirect:/addressBook";
}`
HTML页:
<div class="8u 12u(5)">
<div class="table-wrapper">
<h4>Address Book</h4>
{{#addressList}}
<address>
{{street1}}, {{street2}}<br>
{{district}},{{cityTown}}<br>
{{postCode}}, {{provinceState}},<br>
{{countryCode}}<br>
<br>
<a href="/editAddress">Edit</a>   <a class="confirm" href="/deleteAddress">Delete</a>
<hr>
</address>
{{/addressList}}
</div>
<a href="/addNewAddress"><b>Add New Address</b></a>
</div>
会员服务:
public AddressDetail add(AddAddress addAddress, String memberId) throws Exception {
Address address = new Address.Builder()
.setStreet1(addAddress.getStreet1())
.setStreet2(addAddress.getStreet2())
.setCityTown(addAddress.getCityTown())
.setDistrict(addAddress.getDistrict())
.setProvinceState(addAddress.getProvinceState())
.setPostCode(addAddress.getPostCode())
.setCountryCode(addAddress.getCountryCode())
.build();
RestRequest request = RestRequest.newBuilder()
.url("/member/" + memberId + "/address")
.post(address);
Address response = restClient.execute(configuration.serviceMemberName(), request, Address.class).body();
AddressDetail addressDetail = new AddressDetail();
addressDetail.setId(response.getId());
addressDetail.setDistrict(response.getDistrict());
addressDetail.setStreet1(response.getStreet1());
addressDetail.setStreet2(response.getStreet2());
addressDetail.setCityTown(response.getCityTown());
addressDetail.setProvinceState(response.getProvinceState());
addressDetail.setPostCode(response.getPostCode());
return addressDetail;
}
public AddressDetail addressDetail(String memberId, String addressId) throws Exception {
RestRequest request = RestRequest.newBuilder()
.url("/member/" + memberId + "/address/" + addressId)
.get();
Address response = restClient.execute(configuration.serviceMemberName(), request, Address.class).body();
AddressDetail addressDetail = new AddressDetail();
addressDetail.setId(response.getId());
addressDetail.setStreet1(response.getStreet1());
addressDetail.setStreet2(response.getStreet2());
addressDetail.setDistrict(response.getDistrict());
addressDetail.setCityTown(response.getCityTown());
addressDetail.setCountryCode(response.getCountryCode());
addressDetail.setPostCode(response.getPostCode());
addressDetail.setProvinceState(response.getProvinceState());
return addressDetail;
}
public AddressDetail deleteAddress(String memberId, String addressId) throws Exception {
RestRequest request = RestRequest.newBuilder()
.url("/member/" + memberId + "/address/" + addressId)
.delete();
Address response = restClient.execute(configuration.serviceMemberName(), request, Address.class).body();
AddressDetail addressDetail = new AddressDetail();
addressDetail.setId("");
addressDetail.setStreet1("");
addressDetail.setStreet2("");
addressDetail.setDistrict("");
addressDetail.setCityTown("");
addressDetail.setCountryCode("");
addressDetail.setPostCode("");
addressDetail.setProvinceState("");
return addressDetail;
}
从我所看到的,你不使用任何AJAX调用删除你的记录。您刚刚创建了一个指向某个“/deleteAddress
”URL的锚点,该URL预计浏览器将从URL语义中推断出要使用哪个HTTP谓词。你太乐观了。将发生的事情是,您将向以上“/deleteAddress
”URL发送HTTP GET。但同时你指示你的Container注册HTTP DELETE动词的“/deleteAddress
”URL,所以......什么也没有发生。可能你会得到一个404错误。 如果你想使用DELETE,你将不得不编写一个JavaScript代码来将“删除按钮”单击附加到AJAX调用。 也有类似以下内容:
$('.btn-delete').click(function() {
var id = //get the id somehow
doAjaxDelete(id);
});
function doAjaxDelete(id){
$.ajax({
type: "DELETE",
url: "your/path/to/record/" + id,
success: function(response){
// we have the response, do something to notify success
error: function(e){
//do something to notify failure
});
}
这个代码将用于具有“.btn - 删除”类中的所有元素,所以你应该把它添加到您的按钮(或使用不同的selctor工作,它是由您)。而且您还应该找到一种方法在您的DELETE网址中添加一个ID以正确标识您的记录。最重要的是,我使用了JQuery,所以你应该把它包含在你的HTML页面中。
更简单的方法是将方法注释从@RequestMapping(value="/deleteAddress" , method =RequestMethod.DELETE)
切换到@RequestMapping(value="/deleteAddress" , method =RequestMethod.GET)
。老实说,我更喜欢使用GET动词来取回东西而不是删除它。
你会得到什么异常? –
究竟什么不行?更多的前端或后端?或者是数据库错误? – Patrick
您的删除地址不起作用,但您在哪个基地删除地址?我的意思是成员和地址id都是需要的? –