2009-08-23 26 views

Trả lời

17

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 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ụ.

+0

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

+1

Thay vì phương thức forward(), bạn cần sử dụng response.sendRedirect (jspPath + "/" + nextPage). –

+0

vâng, nhưng tôi sợ nó sẽ gây ra vấn đề khác ... – MemoryLeak

0

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)

+0

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

9

Các thành ngữ bạn muốn ở đây là một trong hai:.

  1. POST+REDIRECT+GET; hoặc
  2. gửi biểu mẫu AJAX.

POST + REDIRECT + GET công trình như thế này:

  1. Mẫu đệ trình sử dụng phương thức POST;
  2. 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ì);
  3. 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.

+0

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

+0

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. –

+0

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

0

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!

0

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; 
    } 
} 
Các vấn đề liên quan