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.CubbyConstants.ATTR_OUTPUT_VALUES;
19  import static org.seasar.cubby.tags.TagUtils.toAttr;
20  
21  import java.io.IOException;
22  import java.util.Collections;
23  import java.util.HashMap;
24  import java.util.Map;
25  
26  import javax.servlet.jsp.JspException;
27  import javax.servlet.jsp.JspWriter;
28  import javax.servlet.jsp.PageContext;
29  import javax.servlet.jsp.tagext.BodyTagSupport;
30  import javax.servlet.jsp.tagext.DynamicAttributes;
31  
32  import org.seasar.cubby.controller.ActionContext;
33  import org.seasar.cubby.dxo.FormDxo;
34  import org.seasar.framework.container.SingletonS2Container;
35  
36  /**
37   * フォームを出力するタグライブラリ。
38   * <p>
39   * {@link InputTag}, {@link SelectTag}, {@link TextareaTag}を保持することができます。
40   * </p>
41   * 
42   * @author agata
43   * @author baba
44   * @since 1.0.0
45   */
46  public class FormTag extends BodyTagSupport implements DynamicAttributes {
47  
48  	private static final long serialVersionUID = 3997441280451382093L;
49  
50  	/**
51  	 * DynamicAttributes
52  	 */
53  	private final Map<String, Object> attrs = new HashMap<String, Object>();
54  
55  	/**
56  	 * フォームのバインディング対象のBean。
57  	 */
58  	private Object value;
59  
60  	/**
61  	 * {@inheritDoc} DynamicAttributeをセットします。
62  	 */
63  	public void setDynamicAttribute(final String uri, final String localName,
64  			final Object value) throws JspException {
65  		this.attrs.put(localName, value);
66  	}
67  
68  	/**
69  	 * DynamicAttributeを取得します。
70  	 * 
71  	 * @return DynamicAttribute
72  	 */
73  	protected Map<String, Object> getDynamicAttribute() {
74  		return this.attrs;
75  	}
76  
77  	/**
78  	 * フォームのバインディング対象のBeanをセットします。
79  	 * 
80  	 * @param value
81  	 *            フォームのバインディング対象のBean
82  	 */
83  	public void setValue(final Object value) {
84  		this.value = value;
85  	}
86  
87  	/**
88  	 * 開始タグ
89  	 */
90  	@Override
91  	public int doStartTag() throws JspException {
92  		final Map<String, String[]> outputValues = bindFormToOutputValues(this.value);
93  		pageContext.setAttribute(ATTR_OUTPUT_VALUES, outputValues,
94  				PageContext.PAGE_SCOPE);
95  
96  		final JspWriter out = pageContext.getOut();
97  		try {
98  			out.write("<form ");
99  			out.write(toAttr(getDynamicAttribute()));
100 			out.write(">\n");
101 		} catch (final IOException e) {
102 			throw new JspException(e);
103 		}
104 		return EVAL_BODY_INCLUDE;
105 	}
106 
107 	private Map<String, String[]> bindFormToOutputValues(final Object value) {
108 		final Map<String, String[]> outputValues;
109 		if (value == null) {
110 			outputValues = Collections.emptyMap();
111 		} else {
112 			final ActionContext context = SingletonS2Container
113 					.getComponent(ActionContext.class);
114 			final FormDxo formDxo = context.getFormDxo();
115 			final Map<String, String[]> map = new HashMap<String, String[]>();
116 			formDxo.convert(value, map);
117 			outputValues = map;
118 		}
119 		return outputValues;
120 	}
121 
122 	/**
123 	 * 終了タグ
124 	 */
125 	@Override
126 	public int doEndTag() throws JspException {
127 		try {
128 			pageContext.getOut().write("</form>\n");
129 		} catch (final IOException e) {
130 			throw new JspException(e);
131 		}
132 		pageContext.removeAttribute(ATTR_OUTPUT_VALUES, PageContext.PAGE_SCOPE);
133 		return EVAL_PAGE;
134 	}
135 }