PDA

View Full Version : ext-gwtの最新(2.0.3)でPageキャッシュの問題



sigmat
4 Oct 2009, 11:35 PM
お世話になります。

DB内容を表示するGrid一覧のロジックを作成しているが、
初期はloader.load() を利用して、内容表示できます。
その後、DB内容を修正して、「更新」ボタン押下して(loader.load()再度実行)、
表示内容は変わらず、初回にキャッシュした情報が表示される。

↓ソースの一部↓
...
// 192.168.0.1/getDBInfo.do を アクセスすると、Json形式の最新DBデータが戻る

RequestBuilder builder = new RequestBuilder( RequestBuilder.GET, "http://192.168.0.1/getDBInfo.do?random=" + Math.random() );

builder.setHeader("Cache-Control", "no-cache");

HttpProxy<String> proxy = new HttpProxy<String>(builder);

JsonLoadResultReader<ListLoadResult<ModelData>> reader = new JsonLoadResultReader<ListLoadResult<ModelData>>( type );

final BaseListLoader<ListLoadResult<ModelData>> loader = new BaseListLoader<ListLoadResult<ModelData>>( proxy, reader);

ListStore<ModelData> store = new ListStore<ModelData>(loader);

final Grid<ModelData> grid = new Grid<ModelData>(store, cm); ...
...
//  データ取込、初期表示
loader.load();
...
...
// ボタン定義、クリックすると、データを取り込む
Button load = new Button("更新", new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
loader.load();
}
});

キャッシュをアクセスしないように、以下の設定をしましたが、問題は解決してません。
①同一URLをアクセスしないように、リクエスト対象URLの後に&Math.random()を追加しています。
②Htmソースl:
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache">
javaソース:
builder.setHeader("Cache-Control", "no-cache");

暫定対応として、2.0.3 ext-gwt BaseLoaderにproxy設定のメソッドを追加し
loader.load()を実行する前にproxyを再設定することにしました。

今回の対処方法は暫定的に、ソースに対してロジック追加を実施したが、
オリジナルソースを継続的に管理するのは難しいため、
ext-gwt側で恒久的な対処方法があれば、教えていただきたい。

★同じソースで、Gxt2.0.1では、問題なく、正しく更新して表示できます。

katsu_taira
13 Oct 2009, 4:36 PM
返信が遅くなりすみません。
こちらでext gwt 2.0.1および当方で入手可能な最新版に関してサンプルプログラムを作成してテストしてみましたが、ご指摘の現象は発生しませんでした。サーバー側でJsonファイルの内容を更新すると、クライアントの更新ボタンで正しく更新後のデータが表示されます。
ちなみに、最新版2.0.3はどこから入手したものでしょうか?
可能であれば、該当のext gwtのJsonLoadResultReaderのソースを添付していただけませんでしょうか?

なお、こちらで作成したクライアントのソースおよびJsonファイルは以下のようなものです。

---ソース---
/**
* This is the entry point method.
*/
public void onModuleLoad() {
Button bt = new Button("更新");
RootPanel.get("sendButtonContainer").add(bt);

String url = GWT.getHostPageBaseURL() + "data.json";

RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);

HttpProxy<String> proxy = new HttpProxy<String>(builder);
ModelType type = new ModelType();
type.setRoot("address");
type.addField("prefecture", "prefecture");
type.addField("city", "city");
type.addField("town", "town");

List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
columns.add(new ColumnConfig("prefecture", "prefecture", 200));
columns.add(new ColumnConfig("city", "city", 200));
columns.add(new ColumnConfig("town", "town", 200));
ColumnModel cm = new ColumnModel(columns);

JsonLoadResultReader<ListLoadResult<ModelData>> reader = new JsonLoadResultReader<ListLoadResult<ModelData>>(
type);

final BaseListLoader<ListLoadResult<ModelData>> loader = new BaseListLoader<ListLoadResult<ModelData>>(
proxy, reader);

ListStore<ModelData> store = new ListStore<ModelData>(loader);

final Grid<ModelData> grid = new Grid<ModelData>(store, cm);
RootPanel.get("sendButtonContainer").add(grid);
grid.setBorders(true);
grid.setHeight(300);

loader.load();

bt.addSelectionListener(new SelectionListener<ButtonEvent>() {

@Override
public void componentSelected(ButtonEvent ce) {
loader.load();
}
});

}

---Jsonファイル---
{"address":[{"city":"cde","prefecture":"abc","town":"efg"},{"city":"345","prefecture":"123","town":"567"}]}

よろしく、お願い致します。

sigmat
18 Oct 2009, 6:31 PM
回答ありがとうございます。:)

こちら利用している2.0.3はSVNからソースをチェックアウトして、ビルドしたものです。

※ソースなど修正してません。

katsu_taira (http://www.extjs.com/forum/member.php?u=64436)さんのソースで、再確認しました。こちらの使用方法は同じだと思いますが、やはりサーバ側の最新情報が表示できません。

こちらのテスト環境は:IE 6.0です。

よろしくお願いします。

katsu_taira
20 Oct 2009, 1:42 AM
IEの場合、インターネットオプションのキャッシュの指定が「自動的に確認」になっている場合、ご指摘の現象が確認できました。
URLの後に指定している&Math.random()が、ボタンを押下した際には再設定されない(前と同一のURLになる)のが原因と思われます。

loadの際にLoadConfigを指定すると、そこのプロパティからURLにrequest parmを指定できます。
LoadConfigのプロパティを毎回変更することでURLを変えることができます。
前回のソースを以下ように変更した結果、更新ボタンで表示が更新されるようになりました。

なお、このソースではLoadConfigのインスタンスはそのまま再利用していますので
loader.setReuseLoadConfig(true);
を忘れないようにしてください。

よろしく、お願い致します。

---ソース---
/**
* This is the entry point method.
*/
public void onModuleLoad() {
Button bt = new Button("更新");
RootPanel.get("sendButtonContainer").add(bt);

String url = GWT.getHostPageBaseURL() + "data.json";

RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);

HttpProxy<String> proxy = new HttpProxy<String>(builder);
ModelType type = new ModelType();
type.setRoot("address");
type.addField("prefecture", "prefecture");
type.addField("city", "city");
type.addField("town", "town");

List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
columns.add(new ColumnConfig("prefecture", "prefecture", 200));
columns.add(new ColumnConfig("city", "city", 200));
columns.add(new ColumnConfig("town", "town", 200));
ColumnModel cm = new ColumnModel(columns);

JsonLoadResultReader<ListLoadResult<ModelData>> reader = new JsonLoadResultReader<ListLoadResult<ModelData>>(
type);

final BaseListLoader<ListLoadResult<ModelData>> loader = new BaseListLoader<ListLoadResult<ModelData>>(
proxy, reader);

ListStore<ModelData> store = new ListStore<ModelData>(loader);

final Grid<ModelData> grid = new Grid<ModelData>(store, cm);
RootPanel.get("sendButtonContainer").add(grid);
grid.setBorders(true);
grid.setHeight(300);

//変更点!! loadConfigにrequest parm randomを指定
final ListLoadConfig config = new BaseListLoadConfig();
config.set("random", Math.random());
//変更点!! このloadConfigを再利用する
loader.setReuseLoadConfig(true);
//変更点!! loadConfigをloadの引数に指定
loader.load(config);

bt.addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
//変更点!! loadConfigにrequest parm randomを再設定
config.set("random", Math.random());
loader.load();
}
});

}