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元素
分享到:
相关推荐
joddform-2.0”和描述中的“springside-joddform-2.0.zip”指的是一个开源项目或者软件库,它很可能是一个基于SpringSide框架的扩展,专注于处理Web表单的模块,利用了Jodd库的一个特定部分,可能是Jodd Form模块。...
**JODD工具包**,全称为Java Open Development Drawer,是一个全面且强大的Java开发工具集。这个工具包提供了多种功能,旨在简化开发人员的工作流程,提高效率。在JODD中,你将找到一系列模块,如`jodd-joy`、`jodd-...
赠送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-...
赠送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 工具集, 包含一些实用的工具类和小型框架。简单,却很强大!Jodd = Tools IoC MVC DB AOP TX JSON HTML < 1.5 MbJodd 被分成众多模块,按需选择,其中工具类模块有:jodd-core 一些工具类...
Java常用工具包Jodd是一个强大的开源库,专为Java开发者设计,提供了许多实用的功能和类,以简化开发过程。这个工具包涵盖了多个领域,包括HTTP客户端、数据转换、日期时间处理、字符串操作、I/O流、线程管理、对象...
你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载Bean, 3. 简化JDBC的接连与代码, 4. 剖析SQL查询, 5. 处理...
Jodd MVC,全称为Jodd Model-View-Controller,是一个轻量级的Java Web应用程序框架,主要用于构建MVC风格的应用。这个框架源自Jodd库,它包含了一系列的Java工具类和组件,旨在简化开发过程。在本教程中,我们将...
你可以把 Jodd 想象成 Java 的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载 Bean, 3. 简化 JDBC 的接连与代码, 4. 剖析 SQL 查询, 5....
你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能。 Jodd 提供的功能有: 1. 提供操作Java bean, 2. 可以从各种数据源加载Bean, 3. 简化JDBC的接连与代码, 4. 剖析SQL查询, 5. 处理时间与...
**Jodd 框架详解** Jodd 是一个开源的 Java 工具包,它包含了一系列功能丰富的模块,为开发者提供了高效且灵活的解决方案。在深入探讨 Jodd 的各项功能之前,我们先来了解一下它的核心组件。 1. **BeanUtil...
在Jodd库中,Base64工具类通常位于`org.jodd.io`或`org.jodd.util`等包下,这些工具类可以帮助开发者方便地处理Base64编码和解码任务,比如将图片、文本或者其他二进制数据转换成Base64字符串,或者将Base64字符串...
赠送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:全方位解析与应用》 Jodd是一个全面的Java工具库,它为开发者提供了丰富的功能,包括但不限于对象处理、HTTP客户端、数据库操作、AOP(面向切面编程)支持以及更多实用工具类。在Jodd v5.3.0...
赠送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-...
赠送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依赖注入等等
赠送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-...
赠送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-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-...