0

我正在使用 jMesa 框架(一个有用的表格渲染 API),我遇到了一个错误。当使用允许通过 ajax 请求修改空中数据的工作表时,它会将这些请求发送到名为org.jmesa.worksheet.servlet.WorksheetServlet. 这个 servlet 管理对表和会话变量所做的更改,所以我不必担心它。

问题在按下保存按钮时开始。您可以进行所有您想要的更改,但在您按下此按钮之前它们不会被保存。然后,jMesa 启动魔法并管理请求和会话,但它同时在两个 sevlet 中完成(我认为这是问题所在)。那些是:

  1. 返回 .jsp 页面的控制器(我的)
  2. jMesa servlet

不知道为什么,我的 servlet 在 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 检查工作表的状态并决定如何显示表格。在渲染内部,它检查是否有任何未保存的内容(当没有首先调用另一个 servlet 时是这样)。

这是未实现但足以看到问题的保存方法。

工作表保存程序:

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 中的所有示例都没有注释,我需要它带有注释。我已经测试了更改 web.xml 文件中的顺序。

谢谢。

4

1 回答 1

0

最后,它与 servlet 问题无关。当您保存工作表时,它会将 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 回答