`
konser
  • 浏览: 1089 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

jodd form 改版成velocity

阅读更多
package velocity;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import jodd.servlet.HtmlEncoder;
import jodd.servlet.HtmlTag;
import jodd.servlet.tag.FormTag.FieldResolver;
import jodd.util.StringUtil;

import org.apache.velocity.context.Context;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.Node;

public class FormDirective extends Directive {

private static final String INPUT = "input";
private static final String TYPE = "type";
private static final String VALUE = "value";
private static final String TEXT = "text";
private static final String SELECT = "select";
private static final String HIDDEN = "hidden";
private static final String IMAGE = "image";
private static final String PASSWORD = "password";
private static final String CHECKBOX = "checkbox";
private static final String TRUE = "true";
private static final String CHECKED = "checked";
private static final String RADIO = "radio";
private static final String TEXTAREA = "textarea";
private static final String NAME = "name";
private static final String OPTION = "option";
private static final String SELECTED = "selected";

public static String render(StringBuffer html,final Context context) {
return populateForm(html.toString(), new FieldResolver() {
public Object value(String name) {
return VelocityValueResolver.resolveProperty(name, context);
}
});
}

// ---------------------------------------------------------------- populate

/**
* Populates HTML form.
*/
protected static String populateForm(String html, FieldResolver resolver) {
int s = 0;
StringBuilder result = new StringBuilder((int) (html.length() * 1.2));
String currentSelectName = null;
HtmlTag tag = null;
while (true) {
if (tag != null) {
result.append(tag);
}
tag = HtmlTag.locateNextTag(html, s);
if (tag == null) {
result.append(html.substring(s));
break;
}
result.append(html.substring(s, tag.getStartIndex()));
s = tag.getNextIndex();

String tagName = tag.getTagName();
// process end tags
if (tag.isEndTag()) {
if (tagName.equals(SELECT)) {
currentSelectName = null;
}
continue;
}

if (tagName.equals(INPUT) == true) {
// INPUT
String tagType = tag.getAttribute(TYPE);
if (tagType == null) {
continue;
}
String name = tag.getAttribute(NAME);
if (name == null) {
continue;
}
Object valueObject = resolver.value(name);
if (valueObject == null) {
continue;
}
String value = valueObject.toString();
tagType = tagType.toLowerCase();

if (tagType.equals(TEXT)) {
tag.setAttribute(VALUE, value);
} else if (tagType.equals(HIDDEN)) {
tag.setAttribute(VALUE, value);
} else if (tagType.equals(IMAGE)) {
tag.setAttribute(VALUE, value);
} else if (tagType.equals(PASSWORD)) {
tag.setAttribute(VALUE, value);
} else if (tagType.equals(CHECKBOX)) {
String tagValue = tag.getAttribute(VALUE);
if (tagValue == null) {
tagValue = TRUE;
}
if (valueObject.getClass().isArray()) {
// checkbox group
String vs[] = StringUtil.toStringArray(valueObject);
for (String vsk : vs) {
if ((vsk != null) && (vsk.equals(tagValue))) {
tag.setAttribute(CHECKED);
}
}
} else if (tagValue.equals(value)) {
tag.setAttribute(CHECKED);
}
} else if (tagType.equals(RADIO)) {
String tagValue = tag.getAttribute(VALUE);
if (tagValue != null) {
if (tagValue.equals(value)) {
tag.setAttribute(CHECKED);
}
}
}
} else if (tagName.equals(TEXTAREA)) {
String name = tag.getAttribute(NAME);
Object valueObject = resolver.value(name);
if (valueObject != null) {
tag.setSuffixText(HtmlEncoder.text(valueObject.toString()));
}
} else if (tagName.equals(SELECT)) {
currentSelectName = tag.getAttribute(NAME);
} else if (tagName.equals(OPTION)) {
if (currentSelectName == null) {
continue;
}
String tagValue = tag.getAttribute(VALUE);
if (tagValue != null) {
Object vals = resolver.value(currentSelectName);
if (vals == null) {
continue;
}
if (vals.getClass().isArray()) {
String vs[] = StringUtil.toStringArray(vals);
for (String vsk : vs) {
if ((vsk != null) && (vsk.equals(tagValue))) {
tag.setAttribute(SELECTED);
}
}
} else {
String value = StringUtil.toString(vals);
if (value.equals(tagValue)) {
tag.setAttribute(SELECTED);
}
}
}
}
}
return result.toString();
}

@Override
public String getName() {
return "form";
}

@Override
public int getType() {
return BLOCK;
}

@Override
public boolean render(InternalContextAdapter context, Writer writer,
Node node) throws IOException, ResourceNotFoundException,
ParseErrorException, MethodInvocationException {
String name = Utils.getRequiredArgument(context, node, 0,getName());
Node outputNode = getOverrideNode(context,name);
        if(outputNode == null) {
        outputNode = node.jjtGetChild(1);
        }
        StringWriter writ = new StringWriter();
        outputNode.render(context, writ);
writer.write(render(writ.getBuffer(), context));
        return true;
}

private Node getOverrideNode(InternalContextAdapter context,String name) {
return (Node)context.get(Utils.getOverrideVariableName(name));
}
}




配置文件 org.springframework.web.servlet.view.velocity.VelocityConfigurer

properties 加 userdirective = velocity.FormDirective


package velocity;

import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.runtime.parser.node.Node;
import org.apache.velocity.runtime.parser.node.SimpleNode;

/**
* @author badqiu
*/
class Utils {

static String BLOCK = "__vm_override__";

static String getOverrideVariableName(String name) {
return BLOCK + name;
}

static String getRequiredArgument(InternalContextAdapter context,Node node,int argumentIndex,String directive) throws ParseErrorException {
SimpleNode sn_value = (SimpleNode)node.jjtGetChild(argumentIndex);
        if ( sn_value == null){
        throw new ParseErrorException("required argument is null with directive:#"+directive+"()");
        }
       
String value = (String)sn_value.value(context);
if ( value == null){
throw new ParseErrorException("required argument is null with directive:#"+directive+"()");
        }
return value;
}

}





在页面中调用#form('')  <input type="text" name="user"/> #end  会自动赋值 form元素
分享到:
评论

相关推荐

    springside-joddform-2.0

    joddform-2.0”和描述中的“springside-joddform-2.0.zip”指的是一个开源项目或者软件库,它很可能是一个基于SpringSide框架的扩展,专注于处理Web表单的模块,利用了Jodd库的一个特定部分,可能是Jodd Form模块。...

    JODD工具包

    **JODD工具包**,全称为Java Open Development Drawer,是一个全面且强大的Java开发工具集。这个工具包提供了多种功能,旨在简化开发人员的工作流程,提高效率。在JODD中,你将找到一系列模块,如`jodd-joy`、`jodd-...

    jodd-http-3.7.1-API文档-中文版.zip

    赠送jar包:jodd-http-3.7.1.jar; 赠送原API文档:jodd-http-3.7.1-javadoc.jar; 赠送源代码:jodd-http-3.7.1-sources.jar; 赠送Maven依赖信息文件:jodd-http-3.7.1.pom; 包含翻译后的API文档:jodd-...

    jodd-core-5.1.6-API文档-中文版.zip

    赠送jar包:jodd-core-5.1.6.jar; 赠送原API文档:jodd-core-5.1.6-javadoc.jar; 赠送源代码:jodd-core-5.1.6-sources.jar; 赠送Maven依赖信息文件:jodd-core-5.1.6.pom; 包含翻译后的API文档:jodd-core-...

    Java常用工具包Jodd.zip

    Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大!Jodd = Tools IoC MVC DB AOP TX JSON HTML &lt; 1.5 MbJodd 被分成众多模块,按需选择,其中工具类模块有:jodd-core 一些工具类...

    Java常用工具包 Jodd

    Java常用工具包Jodd是一个强大的开源库,专为Java开发者设计,提供了许多实用的功能和类,以简化开发过程。这个工具包涵盖了多个领域,包括HTTP客户端、数据转换、日期时间处理、字符串操作、I/O流、线程管理、对象...

    jodd全包带doc文档

    你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载Bean, 3. 简化JDBC的接连与代码, 4. 剖析SQL查询, 5. 处理...

    jodd mvc截图教程

    Jodd MVC,全称为Jodd Model-View-Controller,是一个轻量级的Java Web应用程序框架,主要用于构建MVC风格的应用。这个框架源自Jodd库,它包含了一系列的Java工具类和组件,旨在简化开发过程。在本教程中,我们将...

    jodd-3.5.1

    你可以把 Jodd 想象成 Java 的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载 Bean, 3. 简化 JDBC 的接连与代码, 4. 剖析 SQL 查询, 5....

    jodd-all-3.9.1.jar

    你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载Bean, 3. 简化JDBC的接连与代码, 4. 剖析SQL查询, 5. 处理时间与...

    jodd 完整包有测试例子

    **Jodd 框架详解** Jodd 是一个开源的 Java 工具包,它包含了一系列功能丰富的模块,为开发者提供了高效且灵活的解决方案。在深入探讨 Jodd 的各项功能之前,我们先来了解一下它的核心组件。 1. **BeanUtil...

    Base64工具类 jar包 jodd-3.6.6

    在Jodd库中,Base64工具类通常位于`org.jodd.io`或`org.jodd.util`等包下,这些工具类可以帮助开发者方便地处理Base64编码和解码任务,比如将图片、文本或者其他二进制数据转换成Base64字符串,或者将Base64字符串...

    jodd-bean-5.0.13-API文档-中文版.zip

    赠送jar包:jodd-bean-5.0.13.jar; 赠送原API文档:jodd-bean-5.0.13-javadoc.jar; 赠送源代码:jodd-bean-5.0.13-sources.jar; 赠送Maven依赖信息文件:jodd-bean-5.0.13.pom; 包含翻译后的API文档:jodd-bean-...

    Jodd工具集 v5.3.0.zip

    《Jodd工具集v5.3.0:全方位解析与应用》 Jodd是一个全面的Java工具库,它为开发者提供了丰富的功能,包括但不限于对象处理、HTTP客户端、数据库操作、AOP(面向切面编程)支持以及更多实用工具类。在Jodd v5.3.0...

    jodd-core-3.7.1-API文档-中英对照版.zip

    赠送jar包:jodd-core-3.7.1.jar; 赠送原API文档:jodd-core-3.7.1-javadoc.jar; 赠送源代码:jodd-core-3.7.1-sources.jar; 赠送Maven依赖信息文件:jodd-core-3.7.1.pom; 包含翻译后的API文档:jodd-core-...

    jodd-core-5.1.6-API文档-中英对照版.zip

    赠送jar包:jodd-core-5.1.6.jar; 赠送原API文档:jodd-core-5.1.6-javadoc.jar; 赠送源代码:jodd-core-5.1.6-sources.jar; 赠送Maven依赖信息文件:jodd-core-5.1.6.pom; 包含翻译后的API文档:jodd-core-...

    jodd java工具类库,包括数据库mvc依赖注入等等

    jodd java工具类库,包括数据库mvc依赖注入等等

    jodd-http-3.7.1-API文档-中英对照版 (1).zip

    赠送jar包:jodd-http-3.7.1.jar; 赠送原API文档:jodd-http-3.7.1-javadoc.jar; 赠送源代码:jodd-http-3.7.1-sources.jar; 赠送Maven依赖信息文件:jodd-http-3.7.1.pom; 包含翻译后的API文档:jodd-...

    jodd-upload-3.7.1-API文档-中文版.zip

    赠送jar包:jodd-upload-3.7.1.jar; 赠送原API文档:jodd-upload-3.7.1-javadoc.jar; 赠送源代码:jodd-upload-3.7.1-sources.jar; 赠送Maven依赖信息文件:jodd-upload-3.7.1.pom; 包含翻译后的API文档:jodd-...

    jodd-jar.zip

    jodd-bean-5.1.6.jar,jodd-bean-5.1.6-javadoc.jar,jodd-bean-5.1.6-sources.jar,jodd-core-5.1.6.jar,jodd-core-5.1.6-javadoc.jar,jodd-core-5.1.6-sources.jar,jodd-core-5.2.0.jar,jodd-http-5.2.0.jar,jodd-...

Global site tag (gtag.js) - Google Analytics