1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts.taglib.html;
22
23 import org.apache.struts.Globals;
24 import org.apache.struts.taglib.TagUtils;
25 import org.apache.struts.util.MessageResources;
26 import org.apache.struts.util.RequestUtils;
27
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.jsp.JspException;
30 import javax.servlet.jsp.JspWriter;
31 import javax.servlet.jsp.PageContext;
32 import javax.servlet.jsp.tagext.TagSupport;
33
34 import java.io.IOException;
35
36 import java.util.StringTokenizer;
37
38 /**
39 * Renders an HTML <base> element with an href attribute pointing to the
40 * absolute location of the enclosing JSP page. This tag is only valid when
41 * nested inside a head tag body. The presence of this tag allows the browser
42 * to resolve relative URL's to images, CSS stylesheets and other resources
43 * in a manner independent of the URL used to call the ActionServlet.
44 *
45 * @version $Rev: 471754 $ $Date: 2005-09-20 02:29:01 -0400 (Tue, 20 Sep 2005)
46 * $
47 */
48 public class BaseTag extends TagSupport {
49 /**
50 * The message resources for this package.
51 */
52 protected static MessageResources messages =
53 MessageResources.getMessageResources(Constants.Package
54 + ".LocalStrings");
55 protected final String REF_SITE = "site";
56 protected final String REF_PAGE = "page";
57
58 /**
59 * The server name to use instead of request.getServerName().
60 */
61 protected String server = null;
62
63 /**
64 * The target window for this base reference.
65 */
66 protected String target = null;
67
68 /**
69 * The reference to which the base will created.
70 */
71 protected String ref = REF_PAGE;
72
73 /**
74 * Gets the reference to which the base will be created
75 */
76 public String getRef() {
77 return (this.ref);
78 }
79
80 /**
81 * Sets the reference to which the base will be created.
82 *
83 * @param ref Either "page" to render the base as the jsp path located, or
84 * "site" as the application's context
85 */
86 public void setRef(String ref) {
87 if (ref == null) {
88 throw new IllegalArgumentException("Ref attribute cannot be null");
89 }
90
91 ref = ref.toLowerCase();
92
93 if (ref.equals(REF_PAGE) || ref.equals(REF_SITE)) {
94 this.ref = ref;
95 } else {
96 throw new IllegalArgumentException("Ref attribute must either be "
97 + "'" + REF_PAGE + "' or '" + REF_SITE + "'");
98 }
99 }
100
101 public String getTarget() {
102 return (this.target);
103 }
104
105 public void setTarget(String target) {
106 this.target = target;
107 }
108
109 /**
110 * Process the start of this tag.
111 *
112 * @throws JspException if a JSP exception has occurred
113 */
114 public int doStartTag() throws JspException {
115 HttpServletRequest request =
116 (HttpServletRequest) pageContext.getRequest();
117 String serverName =
118 (this.server == null) ? request.getServerName() : this.server;
119
120 int port = request.getServerPort();
121 String headerHost = request.getHeader("Host");
122
123 if ((serverName == null) && (headerHost != null)) {
124 StringTokenizer tokenizer = new StringTokenizer(headerHost, ":");
125
126 serverName = tokenizer.nextToken();
127
128 if (tokenizer.hasMoreTokens()) {
129 String portS = tokenizer.nextToken();
130
131 try {
132 port = Integer.parseInt(portS);
133 } catch (Exception e) {
134 port = 80;
135 }
136 } else {
137 port = 80;
138 }
139 }
140
141 String baseTag =
142 renderBaseElement(request.getScheme(), serverName, port,
143 request.getRequestURI());
144
145 JspWriter out = pageContext.getOut();
146
147 try {
148 out.write(baseTag);
149 } catch (IOException e) {
150 pageContext.setAttribute(Globals.EXCEPTION_KEY, e,
151 PageContext.REQUEST_SCOPE);
152 throw new JspException(messages.getMessage("common.io", e.toString()));
153 }
154
155 return EVAL_BODY_INCLUDE;
156 }
157
158 /**
159 * Render a fully formed HTML <base> element and return it as a
160 * String.
161 *
162 * @param scheme The scheme used in the url (ie. http or https).
163 * @param serverName
164 * @param port
165 * @param uri The portion of the url from the protocol name up to
166 * the query string.
167 * @return String An HTML <base> element.
168 * @since Struts 1.1
169 */
170 protected String renderBaseElement(String scheme, String serverName,
171 int port, String uri) {
172 StringBuffer tag = new StringBuffer("<base href=\"");
173
174 if (ref.equals(REF_SITE)) {
175 StringBuffer contextBase =
176 new StringBuffer(((HttpServletRequest) pageContext.getRequest())
177 .getContextPath());
178
179 contextBase.append("/");
180 tag.append(RequestUtils.createServerUriStringBuffer(scheme,
181 serverName, port, contextBase.toString()).toString());
182 } else {
183 tag.append(RequestUtils.createServerUriStringBuffer(scheme,
184 serverName, port, uri).toString());
185 }
186
187 tag.append("\"");
188
189 if (this.target != null) {
190 tag.append(" target=\"");
191 tag.append(this.target);
192 tag.append("\"");
193 }
194
195 if (TagUtils.getInstance().isXhtml(this.pageContext)) {
196 tag.append(" />");
197 } else {
198 tag.append(">");
199 }
200
201 return tag.toString();
202 }
203
204 /**
205 * Returns the server.
206 *
207 * @return String
208 */
209 public String getServer() {
210 return this.server;
211 }
212
213 /**
214 * Sets the server.
215 *
216 * @param server The server to set
217 */
218 public void setServer(String server) {
219 this.server = server;
220 }
221 }