best practice tips JSP redirect XML
Problem:
<jsp:forward> is not for redirecting to an external server (and the address you forward to will have access the request attributes and parameters, which may be desirable, see discussion here: when to use response redirect and jsp forward.
Is using
response.sendRedirect(...)
ok/best-practice?Solution:
The short answer, is it's fine. In summary, there are four approaches I can think of:
Approach #1: Scriptlet to sendRedirect
<% response.sendRedirect("http://www.example.com"); %>
This has worked since the introduction of JSPs (see: Implementing a Redirect in a JSP Page) ... sometimes you need the servlet API in your JSP page either because there's other content (eg HTML) that makes it reasonable not to be a pure servlet. Other times it's just convenient to have a text file compiled on the fly.
Though there are many that would disagree (Sciptlet snobs? see How to redirect a page in JSP - I don't see why you'd get wound up about scriptlets. Why would you write a servlet when one line of code in a text file gives you the same result?).
Approach #2: Use Apache JSTL and the c:redirect tag
<c:redirect url="http://www.example.com"/>
or scriptlets again:
<c:redirect url="<%=scriptlet logic%>"/>
Sure, it's 'pure' XML but you'll need the
taglib
definition in the JSP file and include the JSTL jars in your web application - as discussed in the notes for a previous post. Approach #3: Refresh meta tag
You could get the JSP to produce a HTML page that contains the Refresh meta tag.
<html> <head> <meta http-equiv="Refresh" content="0; url=http://www.example.com/"> </head> <body></body> </html>
Where 0 is the delay in seconds. If more than zero, you'd probably want to put some text on the page to explain what's happening.
Approach #4: Javascript
As above, you could get the JSP to produce a HTML page that contains javascript to perform the redirect.
<html> <head> <script type="text/javascript"> window.location = "http://www.example.com/"; </script> </head> <body></body> </html>
You could use setTimeout to get the redirect to happen after a period of milliseconds.
Notes:
Out of curiosity I checked TCP monitor for what the browser is actually receiving when you use Approach #1 or #2 (sendRedirect or c:redirect)
HTTP/1.1 302 Moved Temporarily Location: http://www.example.com
So it saves you from 2 lines of servlet (or scriptlet) code:
response.setStatus(302); response.setHeader("Location", "http://www.example.com");
So the difference to Approaches #3 & #4 isn't great or much more inefficient really, in all cases it's up to the browser to go to the specified address.