簡體   English   中英

Java:Spring MVC-如何在控制器操作中訪問更新的模型?

[英]Java: Spring MVC - How do I access the updated model in controller action?

我正在學習Spring MVC 3,並且通常不是Java專家。 我有幾個問題

  1. 據我所知,不再使用ModelAndView了。 我也看到這兩個:
    • org.springframework.ui.Model
    • org.springframework.ui.ModelMap

ModelMapModel什么區別? 是其中一種像ModelAndView這樣的舊樣式嗎?

  1. 如何將表格數據傳遞回控制器? 這是我到目前為止的內容:

視圖

<form action="/KSC/users/update" method="POST" class="form-horizontal" id="fEdit">

                            <input type="hidden" id="id" name="id" value="${record.id}" />

                            <div class="control-group">
                                <label for="userName" class="control-label"></label>
                                <div class="controls">
                                    <input type="text" id="userName" name="userName" value="${record.userName}" data-validation-engine="validate[required]" />
                                </div>
                            </div>

                            <div class="control-group">
                                <label for="email" class="control-label"></label>
                                <div class="controls">
                                    <input type="text" id="email" name="email" value="${record.email}" data-validation-engine="validate[required,custom[email]]" />
                                </div>
                            </div>

                            <div class="control-group">
                                <div class="controls">
                                    <input type="submit" value="Save" class="btn btn-primary" />
                                    <a href="/KSC/users" class="btn">Cancel</a>
                                </div>
                            </div>
                        </form>

編輯動作

這是我最初從Edit操作傳遞給上述View的內容:

@RequestMapping(value = "/users/edit/{id}")
    public String edit(ModelMap model, @PathVariable("id") int userId) {
        KCSUser user = service.find(userId);
        model.addAttribute("record", user);
        return "user/edit";
    }

控制器更新動作

@RequestMapping(value = "/users/update")
    public String update(ModelMap model) {
        //TODO
    }

我需要訪問更新的模型數據,以便將其保存到數據庫中。 理想情況下,如果它可以直接映射到一個不錯的KSCUser對象,但是如果沒有,那么使用ModelModelMap也可以。 我怎樣才能做到這一點?

如何將表格數據傳遞回控制器?

只需更改您的update方法的簽名,如下所示:

@RequestMapping(value = "/users/update")
public String update(KSCUser user, ModelMap model) {
    // ...
}

spring將創建KSCUser的實例,並根據輸入字段的name屬性填充屬性。 因此,如果您有一個像<input type="text" name="username" />這樣的輸入字段,spring將嘗試在setUsername實例上調用setUsername。

您也可以像這樣更改方法的簽名:

@RequestMapping(value = "/users/update")
public String update(@RequestParam("username") final String username) {
    // ...
}

然后spring將注入名為username的輸入字段的值。

或者您可以這樣更改方法的簽名:

@RequestMapping(value = "/users/update")
public String update(Map<String, String> params) {
    // ...
}

然后spring會將所有請求參數注入params映射中。 您可以像這樣訪問用戶名: params.get("username")

為了完整性...您可以像下面這樣更改您的方法的簽名:

@RequestMapping(value = "/users/update")
public String update(HttpServletRequest request) {
    // ...
}

春天,然后只需注入HttpServletRequest實例即可訪問請求參數,就像使用vanila servlet api一樣。

理想情況下,如果它可以直接映射到一個不錯的KSCUser對象,但是如果沒有,那么Model或ModelMap也可以

當僅注入ModelMap (就像在update方法中一樣),它將不包含請求參數(除非您使用@SeessionAttributes ),並且您將無法以這種方式訪問​​它們。

ModelMap和Model有什么區別

好問題。 ModelMap的Javadoc說:

檢出Model接口,以了解基於Java-5的接口變體,該變體起着相同的作用

imhoModel接口看起來僅用於向模型添加對象(而不是從模型讀取)……就像您的edit方法一樣。 但是,這里有一個asMap方法,該方法授予您訪問模型內​​容的權限。

我從未親自使用過Model接口。 始終注入ModelMap

這似乎可行:

@RequestMapping(value = "/users/update")
    public String update(ModelMap model, @ModelAttribute("record") KCSUser record) {

        if (record.getId() == 0) {
            service.insert(record);
        }
        else {
            KCSUser existing = service.find(record.getId());
            existing.setUserName(record.getUserName());
            existing.setEmail(record.getEmail());
            //etc...
            service.update(existing);
        }

        return index(model);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM