public class DefaultValidatorFactory implements ValidatorFactory { protected Map<String, String> validators = new HashMap<String, String>(); private static Logger LOG = LoggerFactory.getLogger(DefaultValidatorFactory.class); protected ObjectFactory objectFactory; protected ValidatorFileParser validatorFileParser; @Inject public DefaultValidatorFactory(@Inject ObjectFactory objectFactory, @Inject ValidatorFileParser parser) { this.objectFactory = objectFactory; this.validatorFileParser = parser; parseValidators(); } public Validator getValidator(ValidatorConfig cfg) { String className = lookupRegisteredValidatorType(cfg.getType()); Validator validator; try { // instantiate the validator, and set configured parameters //todo - can this use the ThreadLocal? validator = objectFactory.buildValidator(className, cfg.getParams(), null); // ActionContext.getContext().getContextMap()); } catch (Exception e) { final String msg = "There was a problem creating a Validator of type " + className + " : caused by " + e.getMessage(); throw new XWorkException(msg, e, cfg); } // set other configured properties validator.setMessageKey(cfg.getMessageKey()); validator.setDefaultMessage(cfg.getDefaultMessage()); validator.setMessageParameters(cfg.getMessageParams()); if (validator instanceof ShortCircuitableValidator) { ((ShortCircuitableValidator) validator).setShortCircuit(cfg.isShortCircuit()); } return validator; } public void registerValidator(String name, String className) { if (LOG.isDebugEnabled()) { LOG.debug("Registering validator of class " + className + " with name " + name); } validators.put(name, className); } public String lookupRegisteredValidatorType(String name) { // lookup the validator class mapped to the type name String className = validators.get(name); if (className == null) { throw new IllegalArgumentException("There is no validator class mapped to the name " + name); } return className; } //看这里的方法 private void parseValidators() { if (LOG.isDebugEnabled()) { LOG.debug("Loading validator definitions."); } List<File> files = new ArrayList<File>(); try { // Get custom validator configurations via the classpath Iterator<URL> urls = ClassLoaderUtil.getResources("", DefaultValidatorFactory.class, false); while (urls.hasNext()) { URL u = urls.next(); try { URI uri = new URI(u.toExternalForm().replaceAll(" ", "%20")); if (!uri.isOpaque() && "file".equalsIgnoreCase(uri.getScheme())) { File f = new File(uri); FilenameFilter filter = new FilenameFilter() { public boolean accept(File file, String fileName) { return fileName.contains("-validators.xml");//ladies and 乡亲们和对面的女孩们看过来 } }; // First check if this is a directory // If yes, then just do a "list" to get all files in this directory // and match the filenames with *-validators.xml. If the filename // matches then add to the list of files to be parsed if (f.isDirectory()) { files.addAll(Arrays.asList(f.listFiles(filter))); } else { // If this is not a directory, then get hold of the inputstream. // If its not a ZipInputStream, then create a ZipInputStream out // of it. The intention is to allow nested jar files to be scanned // for *-validators.xml. // Ex: struts-app.jar -> MyApp.jar -> Login-validators.xml should be // parsed and loaded. ZipInputStream zipInputStream = null; try { InputStream inputStream = u.openStream(); if (inputStream instanceof ZipInputStream) { zipInputStream = (ZipInputStream) inputStream; } else { zipInputStream = new ZipInputStream(inputStream); } ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { if (zipEntry.getName().endsWith("-validators.xml")) { if (LOG.isTraceEnabled()) { LOG.trace("Adding validator " + zipEntry.getName()); } files.add(new File(zipEntry.getName())); } zipEntry = zipInputStream.getNextEntry(); } } finally { //cleanup if (zipInputStream != null) { zipInputStream.close(); } } } } } catch (Exception ex) { LOG.error("Unable to load #0", ex, u.toString()); } } } catch (IOException e) { throw new ConfigurationException("Unable to parse validators", e); } // Parse default validator configurations String resourceName = "com/opensymphony/xwork2/validator/validators/default.xml"; retrieveValidatorConfiguration(resourceName); // Overwrite and extend defaults with application specific validator configurations resourceName = "validators.xml"; retrieveValidatorConfiguration(resourceName); // Add custom (plugin) specific validator configurations for (File file : files) { retrieveValidatorConfiguration(file.getName()); } } private void retrieveValidatorConfiguration(String resourceName) { InputStream is = ClassLoaderUtil.getResourceAsStream(resourceName, DefaultValidatorFactory.class); if (is != null) { validatorFileParser.parseValidatorDefinitions(validators, is, resourceName); } } }
相关推荐
本篇将详细介绍Struts2的极速表单验证框架,特别是其注解方式的使用。 ### 1. 表单验证的重要性 在Web应用程序中,验证用户输入的数据是必不可少的,因为不正确的数据可能导致业务逻辑错误,甚至安全漏洞。Struts2...
2. Struts框架接收到请求,查找对应的ActionForm(或ModelDriven接口的实现)。 3. 验证框架根据配置文件(如struts-config.xml或struts-validation.xml)中的规则对ActionForm中的字段进行验证。 4. 如果验证失败,...
第一章的源码提供了关于Struts2配置文件和基本原理的实践示例。以下是对这些知识点的详细阐述: 1. **配置文件**: - **struts.xml**: 这是Struts2的核心配置文件,定义了应用的Action、结果类型、拦截器栈等。...
- 数据校验框架:通过Validator插件对用户输入进行验证。 - Tiles框架集成:更方便地组织和复用视图组件。 5. **源码分析价值** - 理解核心组件间的协作机制,提高问题定位能力。 - 学习框架设计思想,为自定义...
Struts2提供了多种方式进行输入校验,包括Action级别校验、拦截器级别校验以及基于Validator框架的校验。 二、Action级别校验 Action级别校验是在Action类中定义校验逻辑,通常通过在Action类的属性上添加注解实现...
此外,还可以学习如何配置Struts2拦截器,结合标签库实现更强大的功能,如表单验证、国际化等。 总之,理解并熟练掌握Struts2.0标签的使用及其源码,能够帮助我们构建高效、易维护的Web应用程序,提升开发效率。...
通过深入学习XWork的源码,开发者能够理解Struts2框架的工作原理,优化性能,解决实际开发中的问题,同时也能为自定义插件和扩展提供基础。理解XWork的设计模式和核心机制,将有助于提升开发效率和代码质量,使项目...
要深入了解Struts2的检证框架,可以阅读其源码,特别是`org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor`和`org.apache.struts2.util.FieldHelper`等关键类,它们是验证过程的核心。...
9. **国际化与本地化**:Struts2支持多语言,源码分析会展示如何加载和使用资源文件以实现国际化。 10. **性能优化**:通过源码分析,开发者可以了解Struts2的性能瓶颈,并学习如何通过调整配置或优化代码来提升...
Struts2_CMS_Src.rar 是一个包含Struts2内容管理系统源代码的压缩包,它提供了深入了解和学习Struts2框架的机会。Struts2是一个基于MVC(模型-视图-控制器)设计模式的Java Web应用程序框架,它极大地简化了构建可...
`CollectionFieldValidator`是Struts2框架中处理集合验证的类,其主要任务是对用户提交的集合数据进行校验。这个类通常会与表单字段关联,当用户尝试提交包含多个值的字段时(例如,多选框或复选框),`...
Struts 2 Core 2.0.6 API是该框架的一个版本,提供了丰富的API接口供开发者使用,以实现灵活的控制流程、数据验证和结果映射等功能。 在Struts 2 Core 2.0.6 API中,以下几个关键概念和技术值得深入理解: 1. **...
由于没有具体的博客内容,以上只是对Struts2文件上传功能的一般性介绍。在阅读原始博客时,你可能会发现更多关于如何配置Struts2,处理特定问题,以及优化文件上传性能的具体建议和技巧。对于深入学习,你可以查找更...
5. **整合Struts2与Hibernate**:整合两个框架时,需要在Struts2的配置文件中定义Action,指定对应的Action类和结果页面。同时,需要配置Hibernate的SessionFactory,通常在Spring框架中管理,以便在Action中注入,...
通过深入研究Struts 2的源码,开发者可以更好地理解和定制框架,以满足特定项目的需求。对于想要优化性能、解决框架中的问题或开发自定义插件的开发者来说,源码分析是必不可少的步骤。同时,这也是一种提升Java编程...
虽然这些文件不直接影响Struts2框架的后端安全性,但确保它们的代码安全也是很重要的。例如,前端验证可以作为输入验证的第一道防线,但不能替代后端验证,因为前端验证可以被绕过。 总的来说,理解Struts2的安全...
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中。它的出现是为了改进和替代早期的Struts1框架,提供更好的性能、更灵活的控制流以及更丰富的特性。"Struts2 HelloWorld"是学习...
8. **Validator框架**:Struts包含一套强大的验证机制,可以对用户输入进行校验,源码中可以了解如何编写验证规则和使用验证框架。 9. **国际化与本地化**:Struts支持多语言环境,源码中可以看到如何配置资源文件...
6. **源码分析**:深入理解Struts2的源码可以帮助开发者更好地利用和定制这个框架。例如,研究`DefaultActionMapper`和`DefaultActionProxy`的实现,可以了解如何处理动态方法调用的细节。 7. **工具支持**:有一些...
Struts 是一个开源的Java Web框架,...通过研究Struts 1.2.9的源码和帮助文档,开发者可以提升对MVC模式的理解,学习如何设计和实现企业级Web应用,同时也能为向更现代的框架(如Spring MVC或Struts 2)迁移打下基础。