简体   繁体   中英

how to get the last history token in GWT

I want to get the previous token of my navigation.

For exemple, being in this page:

http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page1

I am redirected somehow to this new page :

http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page2

Now if I want the current token, I can easily get it this way:

String currentPlace = placeManager.getCurrentPlaceRequest().getNameToken();

currentPlace will receive "page2" but i can't figure how to get the previous token which is "page1"

I am not sure why your application issue of page1 redirecting to page2 but here goes. I extends the place controller so that I can do a goBackOr(Place place). This will allow you to get the previous place. You can call getPreviousPlace(). This might be a useful way to handle place navigation when you have an edit activity and you want to go back to the previous place where the user came from. You should be able to replace with this place controller without changes atleast for testing purposes.

public class PlaceController extends com.google.gwt.place.shared.PlaceController {

    private static final Logger log = Logger.getLogger(PlaceController.class.getName());

    private final EventBus eventBus;

    private final Delegate delegate;

    private Place where = Place.NOWHERE;

    /**
     * Previous place from history.
     */
    private Place previousPlace = null;

    /**
     * Legacy method tied to the old location for {@link EventBus}.
     * 
     * @deprecated use {@link #PlaceController(EventBus)}
     */
    @Deprecated
    public PlaceController(com.google.gwt.event.shared.EventBus eventBus) {
        this((EventBus) eventBus);
    }

    /**
     * Legacy method tied to the old location for {@link EventBus}.
     * 
     * @deprecated use {@link #PlaceController(EventBus, Delegate)}
     */
    @Deprecated
    public PlaceController(com.google.gwt.event.shared.EventBus eventBus, Delegate delegate) {
        this((EventBus) eventBus, delegate);
    }

    /**
     * Create a new PlaceController with a {@link DefaultDelegate}. The
     * DefaultDelegate is created via a call to GWT.create(), so an alternative
     * default implementation can be provided through <replace-with> rules
     * in a {@code .gwt.xml} file.
     * 
     * @param eventBus
     *            the {@link EventBus}
     */
    public PlaceController(EventBus eventBus) {
        this(eventBus, (Delegate) GWT.create(DefaultDelegate.class));
    }

    /**
     * Create a new PlaceController.
     * 
     * @param eventBus
     *            the {@link EventBus}
     * @param delegate
     *            the {@link Delegate} in charge of Window-related events
     */
    public PlaceController(EventBus eventBus, Delegate delegate) {
        super(eventBus, delegate);
        this.eventBus = eventBus;
        this.delegate = delegate;
        delegate.addWindowClosingHandler(new ClosingHandler() {
            public void onWindowClosing(ClosingEvent event) {
                String warning = maybeGoTo(Place.NOWHERE);
                if (warning != null) {
                    event.setMessage(warning);
                }
            }
        });
    }

    /**
     * Get the previous place, if null then this is the first place.
     * 
     * @return a {@link Place} instance
     */
    public Place getPreviousPlace() {
        return previousPlace;
    }

    /**
     * Returns the current place.
     * 
     * @return a {@link Place} instance
     */
    public Place getWhere() {
        return where;
    }

    /**
     * Request a change to a new place. It is not a given that we'll actually
     * get there. First a {@link PlaceChangeRequestEvent} will be posted to the
     * event bus. If any receivers post a warning message to that event, it will
     * be presented to the user via {@link Delegate#confirm(String)} (which is
     * typically a call to {@link Window#confirm(String)}). If she cancels, the
     * current location will not change. Otherwise, the location changes and a
     * {@link PlaceChangeEvent} is posted announcing the new place.
     * 
     * @param newPlace
     *            a {@link Place} instance
     *            
     */
    public void goTo(Place newPlace) {
        log().fine("goTo: " + newPlace);

        // if (getWhere().equals(newPlace)) {
        // log().fine("Asked to return to the same place: " + newPlace);
        // return;
        // }

        String warning = maybeGoTo(newPlace);
        if (warning == null || delegate.confirm(warning)) {
            previousPlace = where;
            where = newPlace;
            eventBus.fireEvent(new PlaceChangeEvent(newPlace));
        }
    }

    /**
     * This is useful for going back unless there is,
     * not a previous place, commonly when a user refreshes
     * the screen and then tries to click back.
     * @param place Place to go if there is not a previous place set.
     */
    public void goBackOr(Place place) {
        Place previousPlace = getPreviousPlace();

        if (previousPlace != null && previousPlace != Place.NOWHERE) {
            goTo(previousPlace);
        } else if (place != null) {
            goTo(place);
        } else {
            throw new RuntimeException("Previous place was null and the optional place was not specified");
        }

    }

    /**
     * Visible for testing.
     */
    private Logger log() {
        return log;
    }

    private String maybeGoTo(Place newPlace) {
        PlaceChangeRequestEvent willChange = new PlaceChangeRequestEvent(newPlace);
        eventBus.fireEvent(willChange);
        String warning = willChange.getWarning();
        return warning;
    }

}

You can add this code for example in your onModuleLoad() method or into a class that is created at the beginning of your application and of course not destroyed afterward

private Place previousPlace;
private Place currentPlace;

eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {

      public void onPlaceChange(PlaceChangeEvent event) {

          previousPlace = currentPlace;
          currentPlace = event.getNewPlace();
      }
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM