2015-11-16 68 views
2

如果我將對象傳遞給jsp頁面,如何使用setter更新其字段並將其發回?使用JSP表格更新對象

舉例來說,如果我們有

public class Person { 

    private int age; 
    private String name; 

    public int getAge() { 
     return age; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

和控制器

@RequestMapping(value = "/updatePerson", method = RequestMethod.GET) 
public String showPerson(Model model) { 
    Person person = new Person(); 
    person.setAge(23); 
    person.setName("Jack"); 
    model.addAttribute("person", person); 

    return "updatePerson"; 
} 

和JSP頁面

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 

<form:form modelAttribute="person"> 
    <form:input path="age"/> 
    <input type="submit"/> 
</form:form> 

如何讓這個JSP頁面發送結果修改Person對象,只有一個領域不是新的?

+0

要送你需要一個新的對象處理程序修改的新對象,最好是配置爲接受的形式方法。 –

+0

@nikpon我不明白,你能舉出一些鏈接的例子 – a76

回答

2

添加一個方法處理表單控制器提交:

@RequestMapping(value = "/updatePerson", method = RequestMethod.POST) 
public String alterPerson(@ModelAttribute Person person) { 
    // do stuff 
} 

注意的變化:

  • POST而不是GET:默認情況下,提交表單使用POST -REQUESTS。
  • @ModelAttribute自動檢索提交的數據,並填補了Person對象與它

你所擁有的name場永遠是空的形式,雖然。添加另一個<form:input path="name"/>來解決這個問題。

如果您不想讓用戶更改其名稱,Person對象可能根本不應該放在您的模型中;這取決於這些對象如何被持久化。你可以使用一個單獨的對象是這樣的:

public class PersonChangeRequest { 
    private int age; 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 

而且使用它作爲@ModelAttribute這樣的:

@RequestMapping(value = "/updatePerson", method = RequestMethod.GET) 
public String showPerson(Model model) { 
    PersonChangeRequest person = new PersonChangeRequest(); 
    person.setAge(23); 
    model.addAttribute("person", person); 

    return "updatePerson"; 
} 

@RequestMapping(value = "/updatePerson", method = RequestMethod.POST) 
public String alterPerson(@ModelAttribute PersonChangeRequest personChangeRequest) { 
    Person person = findPersonToChange(personChangeRequest); 
    person.setAge(personChangeRequest.getAge()); 
} 
+0

問題是我不希望人們被允許改變他的名字。我只需要顯示一個字段。當然我可以隱藏它(使用樣式屬性顯示:無),但我不認爲這是最好的解決方案。 – a76

+0

然後,您需要另一個對象,比如'PersonChangeRequest'或'AgeChangeRequest',它只包含一個年齡段,並位於您的模型中;您會收到該對象,驗證它並最終用新值更新基礎'Person'。目前設置攻擊者的方式可能會爲POST-Request添加一個名稱,並且「Person」的名稱將會更改。沒有'name'的輸入字段並不能阻止這一點。 – Bewusstsein

+0

我認爲這是唯一的解決方案。如果您發佈,我會將其標記爲正確 – a76