0

jMesa フレームワーク (便利なテーブル レンダリング API) を使用していますが、エラーが発生しました。ajax リクエストによって送信中のデータの変更を許可するワークシートを操作する場合、これらのリクエストを というサーブレットに送信しますorg.jmesa.worksheet.servlet.WorksheetServlet。このサーブレットはテーブルとセッション変数に加えられた変更を管理するので、私はそれについて心配する必要はありません。

保存ボタンを押すと問題が発生します。必要なすべての変更を行うことができますが、このボタンを押すまで保存されません。すると、jMesaがマジックを起動してリクエストとセッションを管理するのですが、同時に2つのサーブレットで行われます(これが問題だと思います)。それらは:

  1. .jsp ページを返すコントローラー (私のもの)
  2. 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 ファイルの順序を変更してテストしました。

ありがとう。

4

1 に答える 1

0

最後に、サーブレットの問題とは関係ありませんでした。ワークシートを保存すると、フラグが TableModel に true に設定されます。誰かがこのテーブルをレンダリングすると、操作を実行する前にデータが保存されます。したがって、問題を解決するのは次のとおりです。

@Controller
public class AdminController {

    @Autowired
    private UserManager userManager;

    @RequestMapping(value = "/users")
    public String adminUsersGet(ModelMap model, HttpServletRequest request, HttpServletResponse response){
        //Add a callback to jMesa save method
        TableModelUtils.saveWorksheet("usersTable", request, new UserWorksheetSaver(userManager, cityManager, businessManager));
        //Set users to the model creating the TableModel
        model.addAttribute("users", TableCreator.createUsersTable(request, response, userManager));
        //Return the view
        return "admin/adminusers";
    }
}

操作の順序を変更すると、この問題が解決します。

于 2013-04-08T22:37:43.763 に答える