Reputation: 8497
This String
in the filter:
String duke = request.getServletContext().getRealPath("") + "\\" + "duke.gif";
is, or should be, the path to duke.gif
. How do I make duke
load the image? Assuming that the image is moved into WEB-INF/IMAGES/duke.gif
?
Also, is this a sane way to load images in JSP's? I want to dynamically load images in the filter code. For this duke example, it's always the same gif, but I want to be able to change that in the filter.
I'm using Netbeans and Linux, but would like this to be portable.
This JSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<img src="${requestScope.duke}">
${requestScope.me}, what's yours?
<form name="user_name_form" action="controller" method="POST">
name <input type="text" name="name" value="skinner" size='20' />
<p>
<input type="submit">
</p>
</form>
${requestScope.message}
<img src="${pageContext.request.contextPath}/WEB-INF/IMAGES/duke.gif" />
<img src="/WEB-INF/IMAGES/duke.gif" />
<img src="http://localhost:8080/WebApplication/WEB-INF/IMAGES/duke.gif" />
</body>
</html>
results in this html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<img src="WEB-INF/IMAGES/duke.gif">
my name is thufir 34562345, what's yours?
<form name="user_name_form" action="controller" method="POST">
name <input type="text" name="name" value="skinner" size='20' />
<p>
<input type="submit">
</p>
</form>
<img src="/WebApplication/WEB-INF/IMAGES/duke.gif" />
<img src="/WEB-INF/IMAGES/duke.gif" />
<img src="http://localhost:8080/WebApplication/WEB-INF/IMAGES/duke.gif" />
</body>
</html>
the filter:
package net.bounceme.dur.filter;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthenticateFilter implements Filter {
private static final Logger log = Logger.getLogger(AuthenticateFilter.class.getName());
private FilterConfig filterConfig = null;
private Map<String, String> mapOfUsers = new HashMap<>();
public AuthenticateFilter() {
}
private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
log.fine("do before processing..");
}
private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
log.fine("do after processing"); //add image here?
}
private void makeMap() {
Enumeration<String> parmNamesEnum = filterConfig.getInitParameterNames();
List<String> keys = Collections.list(parmNamesEnum);
for (String s : keys) {
mapOfUsers.put(s, filterConfig.getInitParameter(s));
}
log.fine(mapOfUsers.toString());
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.fine("do filter");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
log.fine("Requested Resource::" + uri);
makeMap(); //debatable and maybe should be in init? only should run once.
String name = (String) request.getAttribute("name");
String message = mapOfUsers.containsValue(name) ? "hello " + name : "no " + name;
String myName = request.getServletContext().getInitParameter("me");
String myId = request.getServletContext().getInitParameter("id");
String me = "my name is " + myName + " " + myId;
boolean authenticated = mapOfUsers.containsValue(name) ? true : false;
message = authenticated ? "hello " + name : "";
// String duke = request.getServletContext().getRealPath("//duke.gif");
String duke = request.getServletContext().getRealPath("") + "\\" + "duke.gif";
duke = "WEB-INF/IMAGES/duke.gif";
log.info("filter user is\t\t\t" + message);
log.info("filter authenticated is\t\t" + authenticated);
log.info("filter message is\t\t" + message);
log.info("filter duke is\t\t\t" + duke);
request.setAttribute("me", me);
request.setAttribute("authenticated", authenticated);
request.setAttribute("message", message);
request.setAttribute("duke", duke);
chain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return (this.filterConfig);
}
public void setFilterConfig(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) {
log.fine("init");
this.filterConfig = filterConfig;
if (filterConfig != null) {
log.fine("SessionCheckFilter:Initializing filter");
} else {
log.warning("null filterConfig");
}
}
@Override
public String toString() {
if (filterConfig == null) {
return ("SessionCheckFilter()");
}
StringBuilder sb = new StringBuilder("SessionCheckFilter(");
sb.append(filterConfig);
sb.append(")");
return (sb.toString());
}
private void sendProcessingError(Throwable t, ServletResponse response) {
log.fine("send processing error");
String stackTrace = getStackTrace(t);
if (stackTrace != null && !stackTrace.equals("")) {
try {
response.setContentType("text/html");
try (PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps)) {
pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N
pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
pw.print(stackTrace);
pw.print("</pre></body>\n</html>"); //NOI18N
}
response.getOutputStream().close();
} catch (Exception ex) {
}
} else {
try {
try (PrintStream ps = new PrintStream(response.getOutputStream())) {
t.printStackTrace(ps);
}
response.getOutputStream().close();
} catch (Exception ex) {
}
}
}
public static String getStackTrace(Throwable t) {
String stackTrace = null;
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
pw.close();
sw.close();
stackTrace = sw.getBuffer().toString();
} catch (Exception ex) {
}
log.warning(stackTrace);
return stackTrace;
}
}
see also:
https://askubuntu.com/questions/583309/when-a-war-is-deployed-in-glassfish-whats-the-path-to-web-inf
Upvotes: 0
Views: 1464
Reputation: 8497
This kludge works.
war file:
thufir@doge:~$
thufir@doge:~$ jar -tf NetBeansProjects/WebApplication/dist/WebApplication.war
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/beginnersbook/
WEB-INF/classes/beginnersbook/com/
WEB-INF/classes/net/
WEB-INF/classes/net/bounceme/
WEB-INF/classes/net/bounceme/dur/
WEB-INF/classes/net/bounceme/dur/filter/
WEB-INF/classes/net/bounceme/dur/servlets/
WEB-INF/images/
WEB-INF/resources/
WEB-INF/classes/beginnersbook/com/Details.class
WEB-INF/classes/net/bounceme/dur/filter/AuthenticateFilter.class
WEB-INF/classes/net/bounceme/dur/filter/SessionCheckFilter.class
WEB-INF/classes/net/bounceme/dur/servlets/Controller.class
WEB-INF/classes/net/bounceme/dur/servlets/MyToken.class
WEB-INF/classes/properties.properties
WEB-INF/duke.gif
WEB-INF/fail.jsp
WEB-INF/images/duke.gif
WEB-INF/login.jsp
WEB-INF/resources/duke.gif
WEB-INF/success.jsp
WEB-INF/web.xml
duke.gif
index.html
thufir@doge:~$
html (duke image loads):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<img src="http://localhost:8080/WebApplication/duke.gif">
my name is thufir 34562345, what's yours?
<form name="user_name_form" action="controller" method="POST">
name <input type="text" name="name" value="skinner" size='20' />
<p>
<input type="submit">
</p>
</form>
</body>
</html>
the login.jsp code:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<img src="${requestScope.duke}">
${requestScope.me}, what's yours?
<form name="user_name_form" action="controller" method="POST">
name <input type="text" name="name" value="skinner" size='20' />
<p>
<input type="submit">
</p>
</form>
${requestScope.message}
</body>
</html>
and the filter:
package net.bounceme.dur.filter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthenticateFilter implements Filter {
private static final Logger log = Logger.getLogger(AuthenticateFilter.class.getName());
private FilterConfig filterConfig = null;
private Map<String, String> mapOfUsers = new HashMap<>();
public AuthenticateFilter() {
}
private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
log.fine("do before processing..");
}
private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException {
log.fine("do after processing"); //add image here?
}
private void makeMap() {
Enumeration<String> parmNamesEnum = filterConfig.getInitParameterNames();
List<String> keys = Collections.list(parmNamesEnum);
for (String s : keys) {
mapOfUsers.put(s, filterConfig.getInitParameter(s));
}
log.fine(mapOfUsers.toString());
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.fine("do filter");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
log.fine("Requested Resource::" + uri);
makeMap(); //debatable and maybe should be in init? only should run once.
String name = (String) request.getAttribute("name");
String message = mapOfUsers.containsValue(name) ? "hello " + name : "no " + name;
String myName = request.getServletContext().getInitParameter("me");
String myId = request.getServletContext().getInitParameter("id");
String me = "my name is " + myName + " " + myId;
boolean authenticated = mapOfUsers.containsValue(name) ? true : false;
message = authenticated ? "hello " + name : "";
String hp = request.getServerName();
int p = request.getServerPort();
String duke = "http://" + hp + ":" + p + request.getServletContext().getContextPath() + "/duke.gif";
log.info("filter user is\t\t\t" + message);
log.info("filter authenticated is\t\t" + authenticated);
log.info("filter message is\t\t" + message);
log.info("filter duke is\t\t\t" + duke);
request.setAttribute("me", me);
request.setAttribute("authenticated", authenticated);
request.setAttribute("message", message);
request.setAttribute("duke", duke);
chain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return (this.filterConfig);
}
public void setFilterConfig(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) {
log.fine("init");
this.filterConfig = filterConfig;
if (filterConfig != null) {
log.fine("SessionCheckFilter:Initializing filter");
} else {
log.warning("null filterConfig");
}
}
@Override
public String toString() {
if (filterConfig == null) {
return ("SessionCheckFilter()");
}
StringBuilder sb = new StringBuilder("SessionCheckFilter(");
sb.append(filterConfig);
sb.append(")");
return (sb.toString());
}
private void sendProcessingError(Throwable t, ServletResponse response) {
log.fine("send processing error");
String stackTrace = getStackTrace(t);
if (stackTrace != null && !stackTrace.equals("")) {
try {
response.setContentType("text/html");
try (PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps)) {
pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N
pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
pw.print(stackTrace);
pw.print("</pre></body>\n</html>"); //NOI18N
}
response.getOutputStream().close();
} catch (Exception ex) {
}
} else {
try {
try (PrintStream ps = new PrintStream(response.getOutputStream())) {
t.printStackTrace(ps);
}
response.getOutputStream().close();
} catch (Exception ex) {
}
}
}
public static String getStackTrace(Throwable t) {
String stackTrace = null;
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
pw.close();
sw.close();
stackTrace = sw.getBuffer().toString();
} catch (Exception ex) {
}
log.warning(stackTrace);
return stackTrace;
}
}
I'm sure there's a better way.
Upvotes: 0
Reputation: 1289
It appears that you are returning the location "on disk" to your image instead of the url, this is sort-of dependent on how your servlet is configured in your application server but I am guessing simply calling "images/duke.gif" would be more than enough to cause your image to load.
Upvotes: 1