Servlets 如何在java server faces项目中将base64另存为映像
我正在为学校做一个项目。该项目的主题是T恤设计。我正在使用jsf和primefaces。但我不太了解jsf和primefaces。我想将html中的base64另存为jsf项目中的图像。但当我尝试使用以下函数时,NullPointerException。此函数在Servlet中调用。base64被这个Servlet抓取Servlets 如何在java server faces项目中将base64另存为映像,servlets,jsf-2,nullpointerexception,servlet-3.0,facescontext,Servlets,Jsf 2,Nullpointerexception,Servlet 3.0,Facescontext,我正在为学校做一个项目。该项目的主题是T恤设计。我正在使用jsf和primefaces。但我不太了解jsf和primefaces。我想将html中的base64另存为jsf项目中的图像。但当我尝试使用以下函数时,NullPointerException。此函数在Servlet中调用。base64被这个Servlet抓取 public static void save(String dataURL){ line85: ExternalContext external = FacesContext
public static void save(String dataURL){
line85: ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
ServletContext servletContext = (ServletContext) external.getContext();
String filename = servletContext.getRealPath("cloud.png");
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes;
try {
decodedBytes = decoder.decodeBuffer(dataURL.split("data:image/(png|jpg);base64,")[1]);
BufferedImage imag=ImageIO.read(new ByteArrayInputStream(decodedBytes));
ImageIO.write(imag, "png", new File(filename));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
23.Ara.2012 17:48:20 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [org.soft.tshirt.servlets.DesignServlet] in context with path [/Tshirt] threw exception
java.lang.NullPointerException
at org.soft.tshirt.beans.ImageBean.save(ImageBean.java:85)
at org.soft.tshirt.servlets.DesignServlet.processRequest(DesignServlet.java:102)
at org.soft.tshirt.servlets.DesignServlet.doPost(DesignServlet.java:76)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
FacesContext
的当前实例仅在HTTP请求线程中可用,该线程通过负责创建FacesContext
的FacesServlet
提供服务。换句话说,仅当请求URL与FacesServlet
的URL模式匹配时。换句话说,只有JSF页面、JSF管理的bean(因此不支持您自己实例化的bean,就像这里发生的一样!)以及所有其他JSF工件(如事件/阶段侦听器、UI组件等)可以使用FacesContext
的当前实例
在任意自行开发的HTTP servlet中,FacesContext
根本不可用,原因很简单,FacesServlet
事先没有被调用。因此它的getCurrentInstance()
方法将返回null
。您知道,尝试访问/调用null
上的任何字段/方法将导致NullPointerException
为了实现获取ServletContext
的唯一目标,只需在servlet中调用继承的方法
protected void doPost(...) {
String filename = getServletContext().getRealPath("cloud.png");
// ...
}
将该信息传递给负责创建文件的方法。您可能希望将该代码提取到另一个类中,该类在servlet和支持bean之间重用
与具体问题无关,将文件写入扩展的WAR文件夹确实是一种不好的做法,原因如下:。谢谢。我正在尝试你现在说的。另外,在Servlet中调用函数ImageBean.save(dataURL)。ImageBean是一个ManagedBean。save函数是由ImageBean定义的。在这个上下文中,它根本不是一个托管bean。您没有使用由JSF实例化并放在EL
{}
范围内的代码。支持bean类只是作为一个实用程序类被“滥用”。您是否了解FacesContext
是如何以及何时可用的?我试图将base 64直接保存在servlet getServletContext().getRealPath(“cloud.png”)中,但还是nullpointerexception。Servlet使用jquery.post()从html5中获取base64,因此我无法用xhtml(jsf)设计图像。现在的null
到底是什么意思(顺便问一下,您是否理解NullPointerException
的实际含义?在您试图访问它时,您的注释中似乎没有任何地方能够识别出null
到底是什么对象)错误:servlet calisti 23.Ara.2012 19:33:10 org.apache.catalina.core.StandardWrapperValve调用SEVERE:servlet[org.soft.tshirt.servlets.DesignServlet]在路径为[/tshirt]的上下文中抛出异常java.lang.NullPointerException在javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125)位于org.soft.tshirt.servlets.DesignServlet.processRequest(DesignServlet.java:114)的org.soft.tshirt.servlets.DesignServlet.doPost(DesignServlet.java:84)的javax.servlet.http.HttpServlet.service(HttpServlet.java:641)的代码>