`
41669
  • 浏览: 8158 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

struts2 验证框架 查找验证文件源码

    博客分类:
  • SSH
 
阅读更多
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极速表单验证框架(注解)

    本篇将详细介绍Struts2的极速表单验证框架,特别是其注解方式的使用。 ### 1. 表单验证的重要性 在Web应用程序中,验证用户输入的数据是必不可少的,因为不正确的数据可能导致业务逻辑错误,甚至安全漏洞。Struts2...

    Struts validator验证框架

    2. Struts框架接收到请求,查找对应的ActionForm(或ModelDriven接口的实现)。 3. 验证框架根据配置文件(如struts-config.xml或struts-validation.xml)中的规则对ActionForm中的字段进行验证。 4. 如果验证失败,...

    struts2完全学习手册源码

    第一章的源码提供了关于Struts2配置文件和基本原理的实践示例。以下是对这些知识点的详细阐述: 1. **配置文件**: - **struts.xml**: 这是Struts2的核心配置文件,定义了应用的Action、结果类型、拦截器栈等。...

    struts-1.2.9源码

    - 数据校验框架:通过Validator插件对用户输入进行验证。 - Tiles框架集成:更方便地组织和复用视图组件。 5. **源码分析价值** - 理解核心组件间的协作机制,提高问题定位能力。 - 学习框架设计思想,为自定义...

    struts2输入校验深入总结

    Struts2提供了多种方式进行输入校验,包括Action级别校验、拦截器级别校验以及基于Validator框架的校验。 二、Action级别校验 Action级别校验是在Action类中定义校验逻辑,通常通过在Action类的属性上添加注解实现...

    struts2.0标签使用源码

    此外,还可以学习如何配置Struts2拦截器,结合标签库实现更强大的功能,如表单验证、国际化等。 总之,理解并熟练掌握Struts2.0标签的使用及其源码,能够帮助我们构建高效、易维护的Web应用程序,提升开发效率。...

    Struts2中xwork源码

    通过深入学习XWork的源码,开发者能够理解Struts2框架的工作原理,优化性能,解决实际开发中的问题,同时也能为自定义插件和扩展提供基础。理解XWork的设计模式和核心机制,将有助于提升开发效率和代码质量,使项目...

    Struts2的检证框架详解

    要深入了解Struts2的检证框架,可以阅读其源码,特别是`org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor`和`org.apache.struts2.util.FieldHelper`等关键类,它们是验证过程的核心。...

    Struts2源代码与源码解析文档

    9. **国际化与本地化**:Struts2支持多语言,源码分析会展示如何加载和使用资源文件以实现国际化。 10. **性能优化**:通过源码分析,开发者可以了解Struts2的性能瓶颈,并学习如何通过调整配置或优化代码来提升...

    struts2_cms_src.rar

    Struts2_CMS_Src.rar 是一个包含Struts2内容管理系统源代码的压缩包,它提供了深入了解和学习Struts2框架的机会。Struts2是一个基于MVC(模型-视图-控制器)设计模式的Java Web应用程序框架,它极大地简化了构建可...

    (转)Struts2中的collection验证

    `CollectionFieldValidator`是Struts2框架中处理集合验证的类,其主要任务是对用户提交的集合数据进行校验。这个类通常会与表单字段关联,当用户尝试提交包含多个值的字段时(例如,多选框或复选框),`...

    Struts 2 Core 2.0.6 API

    Struts 2 Core 2.0.6 API是该框架的一个版本,提供了丰富的API接口供开发者使用,以实现灵活的控制流程、数据验证和结果映射等功能。 在Struts 2 Core 2.0.6 API中,以下几个关键概念和技术值得深入理解: 1. **...

    struts2上传文件

    由于没有具体的博客内容,以上只是对Struts2文件上传功能的一般性介绍。在阅读原始博客时,你可能会发现更多关于如何配置Struts2,处理特定问题,以及优化文件上传性能的具体建议和技巧。对于深入学习,你可以查找更...

    struts2+hibernate实现登录及增删改操作

    5. **整合Struts2与Hibernate**:整合两个框架时,需要在Struts2的配置文件中定义Action,指定对应的Action类和结果页面。同时,需要配置Hibernate的SessionFactory,通常在Spring框架中管理,以便在Action中注入,...

    Struts 2源码查看xwork-2.1.5第二部分

    通过深入研究Struts 2的源码,开发者可以更好地理解和定制框架,以满足特定项目的需求。对于想要优化性能、解决框架中的问题或开发自定义插件的开发者来说,源码分析是必不可少的步骤。同时,这也是一种提升Java编程...

    关于struts2漏洞问题及解决办法

    虽然这些文件不直接影响Struts2框架的后端安全性,但确保它们的代码安全也是很重要的。例如,前端验证可以作为输入验证的第一道防线,但不能替代后端验证,因为前端验证可以被绕过。 总的来说,理解Struts2的安全...

    struts2 helloworld

    Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中。它的出现是为了改进和替代早期的Struts1框架,提供更好的性能、更灵活的控制流以及更丰富的特性。"Struts2 HelloWorld"是学习...

    struts web开发与设计 源码

    8. **Validator框架**:Struts包含一套强大的验证机制,可以对用户输入进行校验,源码中可以了解如何编写验证规则和使用验证框架。 9. **国际化与本地化**:Struts支持多语言环境,源码中可以看到如何配置资源文件...

    Struts2 动态方法调用(十三)

    6. **源码分析**:深入理解Struts2的源码可以帮助开发者更好地利用和定制这个框架。例如,研究`DefaultActionMapper`和`DefaultActionProxy`的实现,可以了解如何处理动态方法调用的细节。 7. **工具支持**:有一些...

    Struts源码及帮助

    Struts 是一个开源的Java Web框架,...通过研究Struts 1.2.9的源码和帮助文档,开发者可以提升对MVC模式的理解,学习如何设计和实现企业级Web应用,同时也能为向更现代的框架(如Spring MVC或Struts 2)迁移打下基础。

Global site tag (gtag.js) - Google Analytics