Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Servlets 如何在java server faces项目中将base64另存为映像_Servlets_Jsf 2_Nullpointerexception_Servlet 3.0_Facescontext - Fatal编程技术网

Servlets 如何在java server faces项目中将base64另存为映像

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

我正在为学校做一个项目。该项目的主题是T恤设计。我正在使用jsf和primefaces。但我不太了解jsf和primefaces。我想将html中的base64另存为jsf项目中的图像。但当我尝试使用以下函数时,NullPointerException。此函数在Servlet中调用。base64被这个Servlet抓取

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)的