Tôi đang viết chương trình, nhưng tôi gặp sự cố: khi tôi làm mới trang jsp, hệ thống sẽ tự động gửi lại toàn bộ trang, và tôi không biết cách tránh nó, ai đó có thể giúp tôi?Làm thế nào để tránh gửi lại trong jsp khi làm mới?
Trả lời
Dưới đây là giải thích về vấn đề ...
Nhấp vào nút "submit" trên một hình thức gửi một yêu cầu đến máy chủ web, bao gồm tất cả các dữ liệu nhập vào biểu mẫu. Không chỉ URL mà còn dữ liệu biểu mẫu là một phần của yêu cầu và yêu cầu này được trình duyệt nhớ đến. Nếu người dùng nhấp vào "làm mới", trình duyệt sẽ lặp lại yêu cầu, gửi lại cùng một URL và dữ liệu biểu mẫu cho máy chủ web.
Nhưng biểu mẫu có thể được gửi theo hai cách khác nhau, GET hoặc POST, tùy thuộc vào thuộc tính "method" của thẻ "form". Có một quy ước rằng yêu cầu GET không có tác dụng phụ; nó chỉ lấy dữ liệu nhưng không thực hiện bất kỳ thay đổi nào đối với cơ sở dữ liệu. Mặt khác, nếu yêu cầu thay đổi dữ liệu, nó sẽ luôn sử dụng yêu cầu POST.Như tôi đã nói, đây chỉ là những quy ước và không có sự khác biệt về kỹ thuật giữa chúng, nhưng sự khác biệt rất quan trọng là các trình duyệt sẽ cảnh báo người dùng nếu họ cố gắng lặp lại POST - nhấp vào "làm mới" sẽ bật lên hộp thoại cảnh báo người dùng rằng điều này có thể khiến một hoạt động được lặp lại và xác nhận rằng họ thực sự muốn gửi lại. Trình duyệt không hiển thị xác nhận này khi làm mới yêu cầu GET.
Biểu mẫu của bạn có sử dụng phương thức GET như bị nghi ngờ bởi @mk không? Nếu vậy, việc thay đổi nó thành POST là giải pháp đơn giản nhất, vì điều này ít nhất có nghĩa là người dùng được cảnh báo nếu họ cố gắng làm mới.
Nhưng giải pháp tốt hơn là POST + REDIRECT + GET thành ngữ được đề xuất bởi @cletus. Điều này chia tách cập nhật cơ sở dữ liệu (POST) và khung nhìn (GET) thành hai hoạt động. Nhấp vào làm mới trên trình duyệt sau đó chỉ lặp lại GET, mà không có tác dụng phụ.
Không sử dụng GET để gửi hoặc thay đổi dữ liệu. Sử dụng POST để thay thế. Bạn sẽ muốn thay đổi biểu mẫu của mình để đọc
<form action="test.jsp" method="get">
Xem http://www.google.com/search?q=get+post để biết thêm thông tin.
(Câu hỏi của bạn cũng có một chút không rõ ràng - bạn có nghĩa là làm mới trong trình duyệt hoặc trong vùng chứa (ví dụ Tomcat)? Bạn muốn gửi lại trang đó là gì? Các trang không được gửi, biểu mẫu. Hệ thống nào? tôi đoán những gì bạn có nghĩa là, nếu bạn có nghĩa là cái gì khác, cho chúng tôi biết)
yeah, đoán của bạn là tuyệt đối đúng, vì mỗi khi tôi làm mới trang, hình thức sẽ được đệ trình, và kết quả là bản ghi trùng lặp trong cơ sở dữ liệu – MemoryLeak
Các thành ngữ bạn muốn ở đây là một trong hai:.
- POST+REDIRECT+GET; hoặc
- gửi biểu mẫu AJAX.
POST + REDIRECT + GET công trình như thế này:
- Mẫu đệ trình sử dụng phương thức POST;
- Khi JSP hoặc (hy vọng) servlet nhận được POST, nó làm bất cứ điều gì nó cần làm (lưu hoặc cập nhật dữ liệu hoặc bất cứ điều gì);
- Servlet hoặc JSP sau đó sử dụng tiêu đề Vị trí: HTTP để chuyển hướng người dùng đến những gì có thể là cùng một URL đó.
Lợi ích của việc này là việc nhấp tải lại sẽ không gửi lại biểu mẫu. Ngoài ra, nếu bạn nhấp vào nút quay lại trình duyệt, bạn sẽ không được nhắc với "gửi lại"? hộp thoại.
Đây là số JSP example.
Việc gửi AJAX có nghĩa là thay vì gửi biểu mẫu trở lại máy chủ theo nghĩa truyền thống, bạn tạo yêu cầu AJAX quay lại máy chủ với dữ liệu biểu mẫu. Điều đó gửi những gì nó cần. Nhấp vào tải lại sẽ chỉ cần tải lại trang. Nó sẽ không gửi lại yêu cầu AJAX.
1.POST + REDIRECT + GET, là rất tốt, nhưng tôi cần phải gửi mẫu trong cùng một trang nhiều lần, nếu tôi luôn luôn chuyển hướng đến một trang khác, đó là rắc rối, bất kỳ giải pháp tốt hơn khác? và nhân tiện, tôi muốn biết, tại sao lại gửi lại biểu mẫu này? – MemoryLeak
Sẽ không có nhiều rắc rối. Trang được trả về bởi GET có thể bao gồm cùng một biểu mẫu; nó thậm chí có thể là cùng một trang JSP; biểu mẫu thậm chí có thể được điền bằng dữ liệu mà người dùng vừa nhập. Sự khác biệt là làm mới trang sẽ không được máy chủ web giải thích khi gửi biểu mẫu. –
Chúng tôi tự viết một khung MVC, khi gửi biểu mẫu này, nó sẽ sử dụng request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (yêu cầu, phản hồi); để chuyển sang trang tiếp theo, điều này sẽ gây ra sự cố gửi lại biểu mẫu, tôi vẫn xem xét giải pháp để giải quyết vấn đề đó, mọi đề xuất sẽ được đánh giá cao. – MemoryLeak
NẾU bạn đang sử dụng JSP trong máy chủ và sử dụng bộ điều khiển Servlet để điều khiển hướng trang. Bạn chỉ có thể thay đổi chế độ Hướng trang từ Chuyển tiếp sang Chuyển hướng trang. Bằng cách này, bạn có thể ngăn gửi biểu mẫu gửi lại. this would be userful to understand it
liên quan!
Dưới đây là giải pháp
@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
{
request.setCharacterEncoding("UTF-8");
String xxx=request.getParameter("xxx");
S
boolean result=object.method(xxx);
String message="";//reurning a messgae is sucess
if(result==true)
{
message="Data Saved successfully";
}
else
{
message="Error while saving data";
}
return (new ModelAndView(getMasterrulescreation(),"message",message));
}
else //if no value in primary key redirect fresh page
{
return (new ModelAndView(getMasterrulescreation()));
}
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
- 1. Làm cách nào để tránh thực hiện lại hành động gửi biểu mẫu cuối cùng khi trang được làm mới?
- 2. Làm thế nào để tránh lặp lại dòng mới khi đọc đầu vào của người dùng?
- 3. Làm thế nào để tránh lặp lại trong MSBuild?
- 4. Làm thế nào để tránh đoạn mới sau khi khối mã trong chế độ Org?
- 5. Làm thế nào để tránh làm mới trang trong một phương thức bootstrap?
- 6. làm thế nào để tải lại/làm mới/reinit DynaTree?
- 7. Làm thế nào để gửi lại js.haml trong đường ray
- 8. Jersey Guice JSP làm thế nào để?
- 9. Cách tốt nhất để tránh việc gửi do làm mới trang
- 10. Làm thế nào để tránh lặp lại tải lại video HTML trong cùng một trang?
- 11. Làm thế nào để đặt "dòng mới" trong ngôn ngữ biểu thức của JSP?
- 12. Làm thế nào để tránh OutOfMemoryException khi chạy Hadoop?
- 13. Làm thế nào để gửi JSON trở lại với JAVA?
- 14. Đã nhắc gửi lại biểu mẫu xác nhận khi làm mới sau khi đăng lại. Tôi đang làm gì sai?
- 15. Làm cách nào để tránh làm mới trang sau khi đã chọntìm danh sách thả xuống?
- 16. Làm thế nào để tránh nói "gstring"?
- 17. Tránh trình trùng lặp của trang Struts 2 jsp
- 18. Làm thế nào để tránh deadlocks?
- 19. Làm thế nào để tránh downcast?
- 20. Làm thế nào để tránh tìm kiếm vector trong data.table
- 21. Làm thế nào để tránh con trỏ null trong View.getDrawingCache()?
- 22. Làm thế nào để tránh lặp lại trong chuỗi Java ResourceBundle?
- 23. Biểu mẫu được gửi khi tôi nhấp vào nút trong biểu mẫu. Làm thế nào để tránh điều này?
- 24. Làm thế nào để làm mới GridView trong Extjs?
- 25. Làm thế nào để tránh một postback trong JavaScript?
- 26. Làm cách nào để chặn lại bài đăng khi làm mới trang - ASP.NET MVC
- 27. Làm thế nào để làm mới singleton trong C#
- 28. Làm thế nào để tránh các trình duyệt Unicode chuẩn hóa khi gửi một biểu mẫu với Unicode
- 29. Làm cách nào để tải lại/làm mới app.config?
- 30. Làm thế nào để tránh tràn ngăn xếp trong Haskell?
Trước hết, cảm ơn rất nhiều! Chúng tôi tự viết một khung MVC, khi gửi biểu mẫu này, nó sẽ sử dụng request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (request, response); để chuyển sang trang tiếp theo, điều này sẽ gây ra sự cố gửi lại biểu mẫu, tôi vẫn xem xét giải pháp để giải quyết vấn đề đó, mọi đề xuất sẽ được đánh giá cao. – MemoryLeak
Thay vì phương thức forward(), bạn cần sử dụng response.sendRedirect (jspPath + "/" + nextPage). –
vâng, nhưng tôi sợ nó sẽ gây ra vấn đề khác ... – MemoryLeak