View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.cubby.tags;
17  
18  import static org.seasar.cubby.tags.TagUtils.addClassName;
19  import static org.seasar.cubby.tags.TagUtils.errors;
20  import static org.seasar.cubby.tags.TagUtils.formValue;
21  import static org.seasar.cubby.tags.TagUtils.isChecked;
22  import static org.seasar.cubby.tags.TagUtils.multipleFormValues;
23  import static org.seasar.cubby.tags.TagUtils.outputValues;
24  import static org.seasar.cubby.tags.TagUtils.toAttr;
25  
26  import java.io.IOException;
27  import java.util.Arrays;
28  import java.util.Map;
29  
30  import javax.servlet.jsp.JspContext;
31  import javax.servlet.jsp.JspException;
32  import javax.servlet.jsp.JspTagException;
33  import javax.servlet.jsp.JspWriter;
34  
35  import org.seasar.cubby.action.ActionErrors;
36  import org.seasar.cubby.util.CubbyFunctions;
37  import org.seasar.framework.message.MessageFormatter;
38  import org.seasar.framework.util.ArrayUtil;
39  
40  /**
41   * inputを出力するタグ。
42   * <p>
43   * 入力検証にエラーがある場合、class属性に「fieldError」を追加します。 なおこのタグはtype属性により挙動が変わります。
44   * </p>
45   * <ul>
46   * <li>type値がcheckbox/radio -
47   * value値をvalue属性の値として出力します。フォームオブジェクトの値とvalueが一致した場合checked="checked"を出力します。</li>
48   * <li>その他 - value値をvalue属性の値として出力します。</li>
49   * </ul>
50   * 
51   * @author agata
52   * @author baba
53   */
54  public class InputTag extends DynamicAttributesTagSupport {
55  
56  	private static final String[] MULTIPLE_VALUE_TYPES = new String[] {
57  			"checkbox", "radio" };
58  
59  	private String type;
60  
61  	private String name;
62  
63  	private Object value;
64  
65  	private String checkedValue;
66  
67  	private Integer index;
68  
69  	public void setType(final String type) {
70  		this.type = type;
71  	}
72  
73  	public void setName(final String name) {
74  		this.name = name;
75  	}
76  
77  	public void setCheckedValue(final String checkedValue) {
78  		this.checkedValue = checkedValue;
79  	}
80  
81  	public void setValue(final Object value) {
82  		this.value = value;
83  	}
84  
85  	public void setIndex(final Integer index) {
86  		this.index = index;
87  	}
88  
89  	@Override
90  	public void doTag() throws JspException, IOException {
91  		final JspContext context = this.getJspContext();
92  		final JspWriter out = context.getOut();
93  		final ActionErrors errors = errors(context);
94  		final Map<String, Object> dyn = this.getDynamicAttribute();
95  		final Map<String, String[]> outputValues = outputValues(context);
96  
97  		if (this.index == null) {
98  			if (!errors.getFields().get(this.name).isEmpty()) {
99  				addClassName(dyn, "fieldError");
100 			}
101 		} else {
102 			if (!errors.getIndexedFields().get(this.name).get(index).isEmpty()) {
103 				addClassName(dyn, "fieldError");
104 			}
105 		}
106 
107 		if (ArrayUtil.contains(MULTIPLE_VALUE_TYPES, this.type)) {
108 			if (this.value == null) {
109 				throw new JspTagException(MessageFormatter.getMessage(
110 						"ECUB1003", new Object[] {
111 								Arrays.deepToString(MULTIPLE_VALUE_TYPES),
112 								"value" }));
113 			}
114 			final Object[] values = multipleFormValues(context, outputValues,
115 					this.name, this.checkedValue);
116 
117 			out.write("<input type=\"");
118 			out.write(type);
119 			out.write("\" name=\"");
120 			out.write(this.name);
121 			out.write("\" value=\"");
122 			out.write(CubbyFunctions.out(this.value));// TODO
123 			out.write("\" ");
124 			out.write(toAttr(dyn));
125 			out.write(" ");
126 			out.write(checked(toString(this.value), values));
127 			out.write("/>\n");
128 		} else {
129 			final Object value = formValue(context, outputValues, this.name,
130 					this.index, this.value);
131 
132 			out.write("<input type=\"");
133 			out.write(type);
134 			out.write("\" name=\"");
135 			out.write(this.name);
136 			out.write("\" value=\"");
137 			out.write(CubbyFunctions.out(toString(value)));
138 			out.write("\" ");
139 			out.write(toAttr(dyn));
140 			out.write("/>\n");
141 		}
142 	}
143 
144 	private static String checked(final String value, final Object values) {
145 		if (value == null || values == null) {
146 			return "";
147 		}
148 		if (isChecked(value, values)) {
149 			return "checked=\"true\"";
150 		} else {
151 			return "";
152 		}
153 	}
154 
155 }