jMesa フレームワーク (便利なテーブル レンダリング API) を使用していますが、エラーが発生しました。ajax リクエストによって送信中のデータの変更を許可するワークシートを操作する場合、これらのリクエストを というサーブレットに送信しますorg.jmesa.worksheet.servlet.WorksheetServlet
。このサーブレットはテーブルとセッション変数に加えられた変更を管理するので、私はそれについて心配する必要はありません。
保存ボタンを押すと問題が発生します。必要なすべての変更を行うことができますが、このボタンを押すまで保存されません。すると、jMesaがマジックを起動してリクエストとセッションを管理するのですが、同時に2つのサーブレットで行われます(これが問題だと思います)。それらは:
- .jsp ページを返すコントローラー (私のもの)
- jMesa サーブレット
新しいビューをレンダリングするときにワークシートを更新する必要があるため、jMesa が必要なときに最初にサーブレットが呼び出される理由がわかりません。ここにコードと問題の詳細があります。
Web.xml
<!-- Front controller of the application -->
<servlet>
<servlet-name>takeme</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- Configuration file of the application -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configuration/app-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Select what will be mapped by the servlet. In this case everything from /takeme servlet -->
<servlet-mapping>
<servlet-name>takeme</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Servlet used to modify jMesa tables -->
<servlet>
<servlet-name>worksheet</servlet-name>
<servlet-class>org.jmesa.worksheet.servlet.WorksheetServlet</servlet-class>
</servlet>
<!-- JMesa worksheet mapping -->
<servlet-mapping>
<servlet-name>worksheet</servlet-name>
<url-pattern>*.wrk</url-pattern>
</servlet-mapping>
コントローラ:
@Controller
public class AdminController {
@Autowired
private UserManager userManager;
@RequestMapping(value = "/users")
public String adminUsersGet(ModelMap model, HttpServletRequest request, HttpServletResponse response){
//Set users to the model creating the TableModel
model.addAttribute("users", TableCreator.createUsersTable(request, response, userManager));
//Add a callback to jMesa save method
TableModelUtils.saveWorksheet("usersTable", request, new UserWorksheetSaver(userManager, cityManager, businessManager));
//Return the view
return "admin/adminusers";
}
}
ここで createUsersTable にテーブルを作成しますが、これは通常の操作であるため関係ありません。このメソッドは、jMesa によって作成されたプレーンな html を含む文字列を返します。render() メソッドを呼び出すと、jMesa はワークシートの状態をチェックし、テーブルの表示方法を決定します。render の内部では、保存されていないものがあるかどうかをチェックします (これは、他のサーブレットが最初に呼び出されていない場合に当てはまります)。
これは実装されていない save メソッドですが、問題を確認するには十分です。
ワークシートセーバー:
public class UserWorksheetSaver implements WorksheetSaver{
public void saveWorksheet(Worksheet worksheet) {
Iterator<WorksheetRow> worksheetRows = worksheet.getRows().iterator();
while (worksheetRows.hasNext()) {
boolean valid = true;
WorksheetRow worksheetRow = worksheetRows.next();
String uniqueValue = worksheetRow.getUniqueProperty().getValue();
String message = null;
if (worksheetRow.getRowStatus().equals(WorksheetRowStatus.ADD)) {
} else if (worksheetRow.getRowStatus().equals(WorksheetRowStatus.MODIFY)) {
} else if (worksheetRow.getRowStatus().equals(WorksheetRowStatus.REMOVE)) {
}
if (valid) {
//This tells jMesa I have updated all rows
worksheetRows.remove();
}
}
}
}
すべての削除が実行されたためhasChanges()
、jMesa のメソッドは false を返し (変更された行のサイズによって異なります)、すべて問題ありません。
それで、何が問題なのかを知っているので、「コントローラーの前で jMesa を動作させるにはどうすればよいですか?」注: jMesa のすべての例は注釈なしで作成されており、WITH 注釈が必要です。そして、web.xml ファイルの順序を変更してテストしました。
ありがとう。