2013-04-06 79 views
0

我正在使用jMesa框架(一种有用的表格渲染API),并且遇到了错误。当处理允许通过ajax请求修改数据的工作表时,它会将这些请求发送到名为org.jmesa.worksheet.servlet.WorksheetServlet的servlet。该servlet管理对表和会话变量所做的更改,因此我不必担心。jMesa保存工作表时发生弹簧同步错误

按下保存按钮时,问题开始。您可以进行所有需要的更改,但只有按下此按钮后才能保存。然后,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的String。当您调用render()方法时,jMesa会检查工作表的状态并决定如何显示表格。内部呈现它检查是否有任何未保存的内容(当另一个servlet不首先被调用时,这是真的)。

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

WorksheetSaver:

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(); 
      } 
     } 
    } 
} 

由于所有移除已经执行,jMesa的hasChanges()方法返回false(取决于修改的行的大小),从而去everithing确定。

所以,因为我知道什么是问题,所以我如何让jMesa在我的控制器之前工作? 注意:jMesa中的所有示例都是在没有注释的情况下创建的,我需要注释。 而且我测试了在web.xml文件中更改顺序。

谢谢。

回答

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"; 
    } 
} 

更改操作的顺序解决了这个问题。