1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
39
40
41
42
43
44
45 public class FormTag extends BodyTagSupport implements DynamicAttributes {
46
47 private static final long serialVersionUID = 3997441280451382093L;
48
49
50
51
52 private final Map<String, Object> attrs = new HashMap<String, Object>();
53
54
55
56
57 private Object value;
58
59
60
61
62 public void setDynamicAttribute(final String uri, final String localName,
63 final Object value) throws JspException {
64 this.attrs.put(localName, value);
65 }
66
67
68
69
70
71
72 protected Map<String, Object> getDynamicAttribute() {
73 return this.attrs;
74 }
75
76
77
78
79
80
81
82 public void setValue(final Object value) {
83 this.value = value;
84 }
85
86
87
88
89 @Override
90 public int doStartTag() throws JspException {
91 final Map<String, String[]> outputValues = bindFormToOutputValues(this.value);
92 pageContext.setAttribute(ATTR_OUTPUT_VALUES, outputValues,
93 PageContext.PAGE_SCOPE);
94
95 final JspWriter out = pageContext.getOut();
96 try {
97 out.write("<form ");
98 out.write(toAttr(getDynamicAttribute()));
99 out.write(">\n");
100 } catch (final IOException e) {
101 throw new JspException(e);
102 }
103 return EVAL_BODY_INCLUDE;
104 }
105
106 private Map<String, String[]> bindFormToOutputValues(final Object value) {
107 final Map<String, String[]> outputValues;
108 if (value == null) {
109 outputValues = Collections.emptyMap();
110 } else {
111 final ActionContext context = SingletonS2Container
112 .getComponent(ActionContext.class);
113 final FormDxo formDxo = context.getFormDxo();
114 final Map<String, String[]> map = new HashMap<String, String[]>();
115 formDxo.convert(value, map);
116 outputValues = map;
117 }
118 return outputValues;
119 }
120
121
122
123
124 @Override
125 public int doEndTag() throws JspException {
126 try {
127 pageContext.getOut().write("</form>\n");
128 } catch (final IOException e) {
129 throw new JspException(e);
130 }
131 pageContext.removeAttribute(ATTR_OUTPUT_VALUES, PageContext.PAGE_SCOPE);
132 return EVAL_PAGE;
133 }
134 }