---------------- UPDATE ----------------春季控制器獲得405錯誤
我我已經完全重寫了我的問題,試圖澄清顯然寫得不好的問題。我還包含了更多的代碼,希望有人能夠提供一些幫助。我很抱歉前面提供的令人困惑的東西。
基本上我的問題似乎是我並沒有完全理解Spring和REST。所以我希望有人可以爲我澄清一些事情,也許看看我的代碼,並特別告訴我爲什麼它不起作用。雖然我有一些關於原因的想法,但我不明白爲什麼它是這樣。
我有一個非常基本的Spring應用程序。用戶顯示一個頁面,該頁面列出(從數據庫)一個表格,該表格由填充了usernams的兩列以及是否已啓用的布爾值組成。
@RequestMapping(value="/admin/modifyUser", method=RequestMethod.GET)
public void showModifyUser() {}
單擊已啓用列中的鏈接只需切換其狀態。該鏈接是通過將用戶發送到/ admin/access並附加用戶名和訪問變量來創建的。所以,一個例子是http://localhost:8080/myApp/admin/access?username=test&access=true(或者任何確切的語法)。該代碼是:
@RequestMapping(value="/admin/access",method=RequestMethod.GET)
public String submitModifyAccess(@RequestParam("username")String username,
@RequestParam("access")String access) {
....
return "redirect:/admin/modifyUser";
}
工作正常。它將更新用戶的訪問權限,並返回包含表格和用戶數據的頁面。 (也許不是實現它的最佳方式?)稍後,我想在Dojo網格中填充數據,因此需要將數據放入JSON格式。因此,我在我的關於REST等的Spring書中讀到過。所以,從容易開始,我決定讓上面的Handler RESTful。所以,我把它改爲:
@RequestMapping(value="/admin/access/{username}/{access}",method=RequestMethod.GET)
public String submitModifyAccess(@PathVariable String username,
@PathVariable String access) {
....
return "redirect:/admin/modifyUser";
}
我也更新了JSP,使鏈接到/管理/訪問/用戶名/訪問,因此,例如:http://localhost:8080/myApp/admin/access/test/true。瞧,事情仍然有效。我認爲我已經使它成爲RESTful。雖然有幾件事讓我覺得很奇怪。
首先,當點擊鏈接時,它確實正確地更新了狀態,但是當返回到/ admin/modifyUser頁面(這是它發送給你的頁面)時,這兩個變量將被追加到URL中。所以不是顯示http://localhost:8080/myApp/admin/modifyUser,而是顯示http://localhost:8080/myApp/admin/modifyUser?username=test&access=true。很確定這不應該發生。
其次,我意識到submitModifyAccess的RequestMethod應該是POST(或者也許是PUT)。
但正如我所說,它仍然有效,所以我並不擔心它太多。
接下來我試圖修改其他鏈接,即用戶名鏈接。當點擊該鏈接時,用戶將被帶到填有該人數據的表單中。最初只是通過GET請求將用戶名附加到URL來顯示錶單。所以代碼是:
@RequestMapping(value="/admin/editUser", method=RequestMethod.GET)
public void showEditUser(Model model, @RequestParam("username") String username) {
NFIUser user = userService.getUser(username);
UserDetails userDetails = userDetailsManager.loadUserByUsername(username);
....
model.addAttribute("user", user);
}
工作正常。所以,我更新了JSP這樣的用戶名鏈接調用正確的URL,然後我試圖將其更改爲到的RESTify這個方法:
@RequestMapping(value="/admin/editUser/{username}", method=RequestMethod.GET)
public String showEditUser(Model model, @PathVariable String username) {
NFIUser user = userService.getUser(username);
UserDetails userDetails = userDetailsManager.loadUserByUsername(username);
....
model.addAttribute("user", user);
return "redirect:/admin/editUser";
}
一旦這樣做,我開始看到405錯誤,我現在意識到我清楚不理解的東西。首先,我相信爲了做一個REST PUT或POST,你必須有一個完全相同的URL。那是對的嗎?人們認爲我應該在這種情況下做什麼?
哦,萬一有人需要它,形式我是派人到如下(雖然它不是有朝一日能加載時的鏈接用戶點擊他們得到405錯誤):
<div align="center">
<b>If you change the Username you MUST change the password as well.</b>
<s:url value="/admin/editUser" var="edit_url" />
<sf:form method="POST" modelAttribute="user" dojoType="dijit.form.Form" action="${edit_url}">
<script type="dojo/method" event="onSubmit">
if (!this.validate()) {
return false;
}
return true;
</script>
<sf:hidden path="username"/>
<table>
<tr>
<td align="right">Username: </td>
<td>
<sf:input path="newUsername" dojoType="dijit.form.ValidationTextBox" trim="true" required="true" value="${user.username}"/>
</td>
</tr>
<tr>
<td align="right">Password: </td>
<td>
<sf:input path="password" type="password" dojoType="dijit.form.ValidationTextBox" required="true"/>
</td>
</tr>
<tr>
<td align="right">Enabled: </td>
<td>
Yes<sf:radiobutton path="enabled" value="true" dojoType="dijit.form.RadioButton"/>
No<sf:radiobutton path="enabled" value="false" dojoType="dijit.form.RadioButton"/>
</td>
</tr>
<tr>
<td align="right">Admin: </td>
<td>
Yes<sf:radiobutton path="isAdmin" value="true" dojoType="dijit.form.RadioButton"/>
No<sf:radiobutton path="isAdmin" value="false" dojoType="dijit.form.RadioButton"/>
</td>
</tr>
<tr>
<td align="right" colspan="2">
<button dojoType="dijit.form.Button" type="submit">Submit</button>
</td>
</tr>
</table>
</sf:form>
</div>
所以希望這會讓事情更加清晰。再說一遍,如果你對我做錯了什麼有所瞭解,如果你可以解釋我明顯沒有得到的關於REST的信息,或者任何其他可以改進我的代碼的評論,請通知我。非常感謝你。
您是否更新了您的(JSP/Velocity模板/通用視圖技術)以反映鏈接的新路徑? –
是的,我確保更新所有鏈接以調用/ admin/editUser/username的新路徑。 – cardician
你可以發表你的表格嗎? –