Chán thằng FireFox quá. Các bạn giúp mình với.

folie
10-12-09, 20:05
Tình hình là chị có cái JSP, có cái nút bấm "In ra". Mỗi lần bấm vào đó chị tạo ra 1 file PDF rồi mở file này ở một cửa sổ mới. Bấm càng nhiều thì càng nhiều cửa sổ.

Nếu dùng <input type="submit" target="_new" ...> thì không sao, chạy cả trên IE lẫn Firefox. Nhưng dùng kiểu này có cái là nếu quá trình tạo file PDF của chị có lỗi, thì lỗi nó hiển thị hết ở bên cửa sổ mới, mà chị muốn lỗi nó hiển thị ở cửa sổ ban đầu thôi.

Chị mới làm cách khác. Đại loại ko có lỗi thì gọi cái javascript này:
var windowName = "edition"+randomString();/*dổi tên của sổ để mỗi lần bấm mở cái mới*/
win=window.open("editionInit.do", windowName );
win.focus();
mà cái editionInit.do thì gọi tới cái action struts này :
p_response.reset();
p_response.setHeader( "Pragma", "public" );
p_response.setHeader("Content-disposition", "inline;filename=\"simulation.pdf\"");
p_response.setContentType("application/pdf");

// Lấy tên file đã được tạo ra
String fileFusion = "TênfilePDFVuaMoiTao.pdf";
ServletOutputStream ouputStream = p_response.getOutputStream();
// Đẩy hết nội dung file PDF mới vào outputStream này (*)
ouputStream.flush();

Cái này ở IE chạy ngon, nghĩa là cứ bấm thì tạo ra cửa sổ mới, hiển thị nộ dung file PDF mới tạo. CÒn thằng FireFox thì như điên, nó cũng tạo ra cửa sổ mới, cũng focus vào cửa sổ mới này, nhưng nội dung hiển thị thì không bị thay đổi, nghĩa là nó hiển thị cái PDF đầu tiên được tạo ra, trong khi rõ ràng chị thấy nó đã lấy nội dung PDF mới push vào ouputStream rồi.

Sao nó lại nhầm 2 cái outputStream của 2 p_reponse được nhỉ?

Các bạn giúp chị xem lỗi nó ở đâu với.
Help me!!!
lm2
10-12-09, 20:17
Nếu dùng <input type="submit" target="_new" ...> thì không sao, chạy cả trên IE lẫn Firefox. Nhưng dùng kiểu này có cái là nếu quá trình tạo file PDF của chị có lỗi, thì [B]lỗi nó hiển thị hết ở bên cửa sổ mới, mà chị muốn lỗi nó hiển thị ở cửa sổ ban đầu thôi.[/bó tay]
báo lỗi ở cửa sổ mới là hợp lí sao lại muốn báo lỗi ở cửa sổ ban đầu?
folie
10-12-09, 20:29
Hiện tại thì client muốn báo lỗi ở của sổ ban đầu. Nói chung cái target="_new" này mục đích chỉ là để mở file PDF ở bên cửa sổ mới thôi, nên cái lỗi nó mới bị kéo theo bên cửa sổ mới. Chứ các nút bấm khác nó có target="_self" thì lỗi nó hiện ở của sổ ban đầu là normal mà.
folie
10-12-09, 20:34
Nếu mà mình không đổi cái windowName mà cho nó là chuỗi cố định thôi, thì mỗi lần bấm nút in ra, , trong Firefox, file PDF mới đều được cập nhật lại ở chính cái cửa sổ mới duy nhất. Nhưng cái hàm win.focus() nó lại không làm gì cả, nghĩa là bấm xong mình cứ đứng nguyên ở cửa sổ ban đầu, ko bị chuyển sang bên mới gì cả.

Còn bên IE thì tịt hẳn. Chả hiểu cái gì thì tương đương với target="_new" nữa. Chị chịu.
lm2
10-12-09, 20:38
sao không làm thế này:
- tạo 1 cửa sổ mới là bản sao của cửa sổ hiện tại, không focus cửa sổ mới
- tạo file pdf trong cửa sổ hiện tại
- nếu người người dùng đóng cửa sổ hiện tại thì focus cửa sổ mới
wasabi
10-12-09, 21:41
BLAH IE chạy ngon, nghĩa là cứ bấm thì tạo ra cửa sổ mới, hiển thị nộ dung file PDF mới tạo. CÒn thằng FireFox thì như điên, nó cũng tạo ra cửa sổ mới, cũng focus vào cửa sổ mới này, nhưng nội dung hiển thị thì không bị thay đổi, nghĩa là nó hiển thị cái PDF đầu tiên được tạo ra, trong khi rõ ràng chị thấy nó đã lấy nội dung PDF mới push vào ouputStream rồi BLAH
Sở dĩ có lỗi như vậy vì chị/Tomcat (?) không trả cho Firefox đúng header mà từ đó nó có thể quyết định được là cái file được generated một phút trước của chị nó đã expired hay là chưa cho nên nó sẽ mặc định lôi từ cache ra.

Để làm được việc này một cách chính xác, thì phải trả thêm về một expire header cho file PDF vừa tạo nữa: http://developer.yahoo.net/blog/archives/2007/05/high_performanc_2.html

Như thế này supposedly là trình duyệt sẽ không còn cache file nữa:

p_response.setHeader( "Pragma", "no-cache" );
p_response.setHeader( "Expires", "-1" );

Tuy nhiên có một cách dễ hơn để bảo cho trình duyệt luôn luôn không cache file, đó là thêm một cái gì đó đại loại như một dãy số vào cuối URL tạo PDF Stream, ví dụ như thế này:


cachePreventionRand=Math.floor(Math.random()*11)
win=window.open("editionInit.do" + "?crap=" + cachePreventionRand, windowName );
Vàng
10-12-09, 22:11
hok hỉu *` hi't tro'n

pó tay lun
Mây.....
11-12-09, 11:27
Ố la la, chúc mừng anh Vàng đã được cu bi cho lên cột điện hóng mát vì lí do trên 30 tuổi mà vẫn còn độc thân. :yahoo:
gió
11-12-09, 12:03
Anh nghe nói người đàng hoàng bây giờ phải dùng chrome (trên win) hoặc safari (trên mac).
sonata
11-12-09, 12:27
Anh nghe nói người đàng hoàng bây giờ phải dùng chrome (trên win) hoặc safari (trên mac).

Vì sao vậy anh gió?
gió
11-12-09, 12:41
Không hẳn thế đâu sonata ạ, người dùng FF và IE cũng có người đàng hoàng.
wasabi
11-12-09, 13:21
Anh nghe nói người đàng hoàng khoe hàng bây giờ phải dùng chrome (trên win) hoặc safari (trên mac).
Fixed it for you.
folie
12-12-09, 04:35
Sở dĩ có lỗi như vậy vì chị/Tomcat (?) không trả cho Firefox đúng header mà từ đó nó có thể quyết định được là cái file được generated một phút trước của chị nó đã expired hay là chưa cho nên nó sẽ mặc định lôi từ cache ra.

Để làm được việc này một cách chính xác, thì phải trả thêm về một expire header cho file PDF vừa tạo nữa: http://developer.yahoo.net/blog/archives/2007/05/high_performanc_2.html

Như thế này supposedly là trình duyệt sẽ không còn cache file nữa:

p_response.setHeader( "Pragma", "no-cache" );
p_response.setHeader( "Expires", "-1" );

Tuy nhiên có một cách dễ hơn để bảo cho trình duyệt luôn luôn không cache file, đó là thêm một cái gì đó đại loại như một dãy số vào cuối URL tạo PDF Stream, ví dụ như thế này:


cachePreventionRand=Math.floor(Math.random()*11)
win=window.open("editionInit.do" + "?crap=" + cachePreventionRand, windowName );

Bi em thân iêu, chị xác nhận cách thứ 2 chạy tuyệt vời.

Cách 1 chỉ chạy ngon trên Firefox 2. Chị thấy chạy ngon rồi ngồi rung đùi chơi. Đến cuối ngày thằng sếp test không chạy, nó dùng firefox 3. Chị hoảng hồn vào đây cóp lại cách thứ 2 của Bi, chạy ngay típ tắp. Nói chung là muốn cám ơn Bi mille fois, a thousand times.

Bizous em iêu.
folie
12-12-09, 04:37
hok hỉu *` hi't tro'n

pó tay lun
So ri mình nhé. Lên cột chơi hai ngày cho mát rồi mình lại về đây thuật ngữ với Bi nhen.