我正在使用jMesa框架(一種有用的表格渲染API),並且遇到了錯誤。當處理允許通過ajax請求修改數據的工作表時,它會將這些請求發送到名爲org.jmesa.worksheet.servlet.WorksheetServlet
的servlet。該servlet管理對錶和會話變量所做的更改,因此我不必擔心。jMesa保存工作表時發生彈簧同步錯誤
按下保存按鈕時,問題開始。您可以進行所有需要的更改,但只有按下此按鈕後才能保存。然後,jMesa啓動魔術並管理請求和會話,但它同時在兩個sevlet中完成(我認爲這是問題)。這些都是:
- 返回.jsp頁面控制器(礦)
- 的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文件中更改順序。
謝謝。