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
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
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);
}
}
}
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
}
}
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
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
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
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.
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
Đố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);
....
}
}
Giải pháp này làm việc cho tôi cho phiên bản Wicket 6.16.0. – Yuci
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
// 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));
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
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
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
Đã 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
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. –
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. –