2015-02-09 47 views
0

String这在过滤器:负载图像getRealPath()

String duke = request.getServletContext().getRealPath("") + "\\" + "duke.gif"; 

是,或应该是的路径duke.gif。我如何让duke加载图像?假设图像被移动到WEB-INF/IMAGES/duke.gif

此外,这是一个理想的方式来加载JSP的图像?我想动态加载过滤器代码中的图像。对于这个公爵例子,它总是一样的gif,但我希望能够在过滤器中改变它。

我正在使用Netbeans和Linux,但希望这是可移植的。

这个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> 

结果在这个网站:

<!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> 

过滤器:

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; 
    } 

} 

还看到:

https://askubuntu.com/questions/583309/when-a-war-is-deployed-in-glassfish-whats-the-path-to-web-inf

+0

我认为这可能与注释? http://balusc.blogspot.ca/2007/04/imageservlet.html – Thufir 2015-02-09 05:20:17

+0

另请参阅https://alexismp.wordpress.com/2010/04/28/web-inflib-jarmeta-infresources/ – Thufir 2015-02-09 05:36:02

回答

1

看起来你正在将“磁盘上”的位置返回给你的映像而不是url,这是依赖于你的servlet在你的应用服务器上的配置方式,但我猜测只是简单地调用“images/duke .gif“将足以导致图像加载。

+0

我更新了问题。我希望路径(?),如果**是**路径,则将其作为其部署的文件。如果这甚至可以作为加载图像的方式。 – Thufir 2015-02-09 04:21:29

+1

我假设你想从部署的servlet的位置获取图像的相对url? – 2015-02-09 04:27:30

+0

我这么认为。一旦部署了WAR,Glassfish将解压WAR。我想我想要文件的路径,一旦GF解压缩一切。 (?) – Thufir 2015-02-09 04:31:06

0

这个kludge的作品。

war文件:

[email protected]:~$ 
[email protected]:~$ 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 
[email protected]:~$ 

HTML(公爵图像加载):

<!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> 

的login.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} 
    </body> 
</html> 

和过滤器:

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; 
    } 

} 

我确定有更好的方法。

+0

这是否只在从本地主机运行时才起作用? – Thufir 2015-02-09 06:04:25