2011-12-22 22 views
22

Làm cách nào để xóa hoặc ẩn số phiên bản trong URL được giới thiệu trong Wicket 1.5?xóa số phiên bản trong url

Việc gắn trang không có tác dụng.

http://localhost/MyPage/SubPage?0 

Trả lời

18

Trong Application.init():

mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class)); 

với lớp Mapper sau:

public class MountedMapperWithoutPageComponentInfo extends MountedMapper { 

    public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) { 
    super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
    // do nothing so that component info does not get rendered in url 
    } 

    @Override 
    public Url mapHandler(IRequestHandler requestHandler) 
    { 
     if (requestHandler instanceof ListenerInterfaceRequestHandler || 
       requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) { 
      return null; 
     } else { 
      return super.mapHandler(requestHandler); 
     } 
    } 
} 
+1

Đã hoạt động! Cảm ơn nhiều. Tôi chỉnh sửa bài đăng của bạn để đại diện cho toàn bộ giải pháp. – rotsch

+0

Hoạt động thực sự. Nếu bạn muốn hành vi này cho Trang chủ của bạn thì hãy mở rộng HomePageMapper. –

+2

Chỉ cần cho rõ ràng, điều này làm cho các trang của bạn không có quốc tịch, do đó, không sử dụng này nếu bạn muốn các trang statefull. –

3

Sử dụng trình ánh xạ sau để gắn trang, thao tác này sẽ hoạt động trên bất kỳ trang có thể đánh dấu sách nào ngoại trừ trang chủ.

Dưới đây là làm thế nào để sử dụng người lập bản đồ Application.init()

mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class)); 

Đây là mapper.

import org.apache.wicket.request.Url; 
import org.apache.wicket.request.component.IRequestablePage; 
import org.apache.wicket.request.mapper.MountedMapper; 
import org.apache.wicket.request.mapper.info.PageComponentInfo; 
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; 

public class MountedMapperWithoutPageComponentInfo extends MountedMapper { 

    public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) { 
    super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
    // does nothing so that component info does not get rendered in url 
    } 
} 
+0

Tôi đã thử các phương pháp đầu tiên, số phiên bản biến mất nhưng tất cả các liên kết ngừng hoạt động. Phương pháp thứ hai không xóa số phiên bản. – rotsch

+0

Phương pháp đầu tiên phù hợp với tôi, không có vấn đề gì. Trang của tôi cũng có liên kết, tất cả đều hoạt động tốt. Bạn có thấy bất kỳ lỗi nào không? Ngoài ra chính xác của bạn về giải pháp thứ hai, nó không hoạt động và tôi đã lấy nó ra, xin lỗi. – Alinoor

+0

Tôi quản lý để tái tạo một phần vấn đề liên kết không hoạt động, trong trường hợp của tôi có các biểu mẫu ngừng hoạt động.Tôi đã sử dụng câu trả lời từ http://stackoverflow.com/questions/2178285/stateless-apache-wicket-stateless-pages-requests để kiểm tra xem thành phần nào của tôi đã đầy đủ trạng thái, đối với hầu hết chúng tôi chỉ cần ghi đè lên getStatelessHint () phương thức trả về true, cho các liên kết và biểu mẫu tôi đã sử dụng phiên bản không trạng thái (StatelessLink, StatelessForm). Sau đó tôi đã ngừng sử dụng mã trên và ComponentInfo không nhận được kết xuất nữa và các trang dường như đang làm việc từ các bài kiểm tra nhanh mà tôi đã làm. – Alinoor

4

Nếu bạn không muốn số phiên bản thì trang của bạn phải hoàn toàn không quốc tịch, số phiên bản dành cho trang nhà nước. Ví dụ: nếu trang của bạn bao gồm một biểu mẫu thì bạn nên sử dụng biến thể không trạng thái của thành phần Biểu mẫu, đó là org.apache.wicket.markup.html.form.StatelessForm. Nếu trang của bạn đã hoàn toàn không có quốc tịch, bạn có thể đưa ra gợi ý bằng cách gọi phương thức org.apache.wicket.Page # setStatelessHint.

+3

Bạn nói đúng. Nhưng tôi muốn trang nhà nước mà không có một số phiên bản, điều này có thể trong wicket 1.4. – rotsch

3

Đối với tôi, giải pháp với setStatelessHint đã không làm việc. Sau đây làm việc:

class MyApplication extends WebApplication { 
    @Override protected void init() { 
     getRequestCycleSettings().setRenderStrategy(
      IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER); 
     .... 
    } 
} 
+0

Giải pháp này làm việc cho tôi cho phiên bản Wicket 6.16.0. – Yuci

4

các giải pháp sử dụng một lớp MountedMapperWithoutPageComponentInfo tự tạo ra không làm việc cho Wicket 6.13+, trang sẽ không đáp ứng với hành động gọi lại người dùng. (. Lưu ý rằng có nhiều phiên bản của MountedMapperWithoutPageComponentInfo trên Internet)

Một giải pháp cho 6.13+ (thử nghiệm với 6.15) có thể được tìm thấy ở đây:

http://apache-wicket.1842946.n4.nabble.com/Delete-version-number-in-url-td4665752.html

https://svn.apache.org/repos/asf/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java

// Put this code in your WebApplication subclass 
import org.apache.wicket.core.request.mapper.MountedMapper; 
import org.apache.wicket.request.component.IRequestablePage; 
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; 
import org.apache.wicket.request.mapper.info.PageComponentInfo; 
import org.apache.wicket.request.IRequestHandler; 
import org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler; 

private static class NoVersionMapper extends MountedMapper { 
    public NoVersionMapper(final Class<? extends IRequestablePage> pageClass) { 
     this("/", pageClass); 
    } 

    public NoVersionMapper(String mountPath, final Class<? extends IRequestablePage> pageClass) { 
     super(mountPath, pageClass, new PageParametersEncoder()); 
    } 

    @Override 
    protected void encodePageComponentInfo(Url url, PageComponentInfo info) { 
     //Does nothing 
    } 

    @Override 
    public Url mapHandler(IRequestHandler requestHandler) { 
     if (requestHandler instanceof ListenerInterfaceRequestHandler || requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) { 
      return null; 
     } else { 
      return super.mapHandler(requestHandler); 
     } 
    } 
} 

Sau đó, bạn có thể gắn kết các trang bằng cách sử dụng:

// Put this in the init() method of your WebApplication subclass 
getRootRequestMapperAsCompound().add(new NoVersionMapper("urlPatternOfAPage", YourPage.class)); 
+0

Giải pháp nếu bạn sử dụng chú thích '@ MountPath' để gắn kết một trang là gì? – Jon

0

Các cách giải quyết được đề xuất cho đến nay có thể làm việc với các phiên bản cụ thể và có tác dụng phụ. Họ nên được coi là hack. Tôi đã sử dụng những hacks này và họ đã bị phá vỡ bởi các phiên bản mới. Do đó tôi đã tạo một yêu cầu hỗ trợ khung chung ở đây (vui lòng bình luận/bỏ phiếu): setVersioned(false) should force single Page Version.

Một ví dụ về một tác dụng phụ: Page Reload on Submit of non-versioned Page

+0

hãy nhớ rằng tôi đã đăng câu trả lời cách đây 3 năm. nhiều thứ đã thay đổi trong wicket trong những năm này :) – Apostolos

Các vấn đề liên quan