我有一个简单的Web应用程序,在其中使用Struts和XSLT转换。在动作类中,如果我得到正确的数据,我尝试调用“保存”方法。
public ActionForward saveProduct(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws XMLProductDAOException {
// Validation
if (sizeValidationErrorList == 0) {
try {
writeLock.lock();
productDAO.saveProducts(document, product, categoryId, subcategoryId);
} finally {
writeLock.unlock();
}
}
...
}
但我有一个问题。我的老师说,在处理简单的Web应用程序时,最好将锁放在Action类或Command中。
但是,在saveProducts方法中,我在写入新数据到XML文件之前进行了转换。这意味着如果仅在Action类中使用writeLock,我将失去对正确数据的读取控制。
在XMLProductDAO中,我有如下内容:
public void saveProducts(Document document, Product product, Integer categoryId, Integer subcategoryId) throws XMLProductDAOException {
// /......
XSLTTransformer xsltTransformer = XSLTTransformer.getInstance();
Transformer transformer = xsltTransformer.getCachedTransformer(NEW_PRODUCT_REAL_XSL_PATH);
transformer.setParameter(PARAM_CURRENT_CATEGORY, currentCategory);
transformer.setParameter(PARAM_CURRENT_SUBCATEGORY, currentSubcategory);
transformer.setParameter(PARAM_PRODUCT, product);
Writer result = new StringWriter();
xsltTransformer.transform(transformer, result);
File originalXML = new File(PRODUCT_REAL_XML_PATH);
Writer fileWriter = null;
try {
fileWriter = new PrintWriter(originalXML, ENCODING);
fileWriter.write(result.toString());
} catch (IOException e) {
logger.error(IO_EXCEPTION, e);
throw new XMLProductDAOException(IO_EXCEPTION, e);
} finally {
fileWriter.close();
}
// /.....
}
如果只在Action类中使用writeLock,那么我是否有可能面临在XML文件中写入不正确的数据?