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> &nbsp <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; 

} 
+0

你会得到什么异常? –

+0

究竟什么不行?更多的前端或后端?或者是数据库错误? – Patrick

+0

您的删除地址不起作用,但您在哪个基地删除地址?我的意思是成员和地址id都是需要的? –

从我所看到的,你不使用任何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动词来取回东西而不是删除它。