Java 未从servlet在JSP中加载图像文件
我有一个java程序,它根据发送到程序的参数生成有效的BuffereImage bi。我想从servlet调用这个程序,让servlet向用户发送一个jsp,其中包含一个符合用户输入参数的图像。我在下面编写的代码生成一条空消息,而不是请求的图像 我应该补充一点,get_bi()有时需要几百毫秒才能在我的开发计算机上生成BuffereImage。不确定问题的一部分是否是时间延迟 有人能告诉我如何修改下面的代码,以便它在用户的web浏览器中输出实际图像而不是空消息吗 以下是ImageServlet的代码:Java 未从servlet在JSP中加载图像文件,java,jsp,servlets,Java,Jsp,Servlets,我有一个java程序,它根据发送到程序的参数生成有效的BuffereImage bi。我想从servlet调用这个程序,让servlet向用户发送一个jsp,其中包含一个符合用户输入参数的图像。我在下面编写的代码生成一条空消息,而不是请求的图像 我应该补充一点,get_bi()有时需要几百毫秒才能在我的开发计算机上生成BuffereImage。不确定问题的一部分是否是时间延迟 有人能告诉我如何修改下面的代码,以便它在用户的web浏览器中输出实际图像而不是空消息吗 以下是ImageServlet的
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import org.apache.log4j.Logger;
import myownpackage.GetBI;
public class ImageServlet extends HttpServlet{
// private Logger logger = Logger.getLogger(this.getClass());
private RequestDispatcher jsp;
public void init(ServletConfig config) throws ServletException {
ServletContext context = config.getServletContext();
jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// logger.debug("doGet()");
String imageParams = req.getParameter("imageParams");
jsp.forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
Map<String, String> errors = validate(req);
if (!errors.isEmpty()){
// logger.debug("validation errors");
jsp.forward(req, resp);
return;
}
resp.setContentType("image/gif");
BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
GetBI fetchBI = new GetBI();
bi = fetchBI.get_bi(req.getParameter("imageParams"));
File imgFile = new File("imgFile");
ImageIO.write(bi, "gif", imgFile);
resp.sendRedirect("send-image-into-html");
}
public static Map<String, String> validate(HttpServletRequest req){
HashMap<String, String> errors = new HashMap<String, String>();
req.setAttribute("errors", errors);
String imageParams = req.getParameter("imageParams");
if (imageParams == null || imageParams.trim().length() == 0){
errors.put("imageParams", "imageParams required.");
}
return errors;
}
}
public class FirstServlet extends HttpServlet{
// private Logger logger = Logger.getLogger(this.getClass());
private RequestDispatcher jsp;
public void init(ServletConfig config) throws ServletException {
ServletContext context = config.getServletContext();
jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {// logger.debug("doGet()");
jsp.forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
Map<String, String> errors = validate(req);
if (!errors.isEmpty()){// logger.debug("validation errors");
jsp.forward(req, resp);
return;
}
resp.sendRedirect("/send-image-into-html");
}
public static Map<String, String> validate(HttpServletRequest req){
HashMap<String, String> errors = new HashMap<String, String>();
req.setAttribute("errors", errors);
String imageParam1 = req.getParameter("imageParam1");
if (imageParam1 == null || imageParam1.trim().length() == 0){
errors.put("imageParam1", "imageParam1 required.");
}
return errors;
}
}
public class GetGraphServlet extends HttpServlet{
// private Logger logger = Logger.getLogger(this.getClass());
private RequestDispatcher jsp;
public void init(ServletConfig config) throws ServletException {
ServletContext context = config.getServletContext();
jsp = context.getRequestDispatcher("/WEB-INF/jsp/send-image-into-html.jsp");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {// logger.debug("doGet()");
// Create the BufferedImage, using any parameters and
// possibly the exact request URI:
String requestURI = req.getRequestURI();
String imageParam1 = req.getParameter("imageParam1");
resp.setContentType("image/gif");//256 colors
BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
GetBI fetchBI = new GetBI();
bi = fetchBI.get_bi(req.getParameter(imageParam1));
ImageIO.write(bi,"gif",resp.getOutputStream());
resp.setContentType("image/gif"); // 256 colors.
ImageIO.write(bi, "gif", resp.getOutputStream());
jsp.forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{}
}
下面是send-image-into-html.jsp的代码
<jsp:useBean id="errors" scope="request" type="java.util.Map" class="java.util.HashMap" />
<%@ include file="top.inc" %>
<%@ include file="middle.inc" %>
<form method="post">
<table>
<tr>
<td width=350>
<img src="<%="/get-graph.gif?imageParam1="%>">
</td>
<td>
<table>
<tr>
<td>imageParam1: </td>
<td><input type="text" name="imageParam1" value="samplevalue" size="50" />
<%if (errors.containsKey("imageParam1")) {
out.println("<span class=\"error\">" + errors.get("imageParam1") + "</span>");}%>
</td>
</tr>
<tr>
<td>
<input type="submit" name="submit-button" value="CreateImage"/>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
<%@ include file="bottom.inc" %>
">
imageParam1:
以下是web.xml中的相关标记:
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>mypackage.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/html-page-url</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>mypackage.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/get-graph</url-pattern>
</servlet-mapping>
第一个servlet
mypackage.FirstServlet
第一个servlet
/html页面url
第二个servlet
mypackage.SecondServlet
第二个servlet
/获取图形
通过getRealPath
使用web应用程序路径到文件的转换
File imgFile = req.getServletContext().getRealPath("/images/generated.gif");
<img src="/images/generated.gif?t=<%= imgFile.lastModified() %>">
您也可以将servlet URL放入img.src中,以便在没有文件的情况下动态生成图像:
resp.setContentType("image/gif");
ImageIO.write(bi, "gif", resp.getOutputStream());
创建一个单独的图像生成servlet,该servlet在响应的输出流上返回图像的二进制数据。
的src URL映射到此servlet上
<img src=".../... .gif?imageParam1=...&imageParam2=...">
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Create the BufferedImage, using any parameters and
// possibly the exact request URI:
String requestURI = req.getRequestURI();
String imageParam1 = req.getParameter("imageParam1");
String imageParam2 = req.getParameter("imageParam2");
BufferedImage bi = ...
resp.setContentType("image/gif"); // 256 colors.
ImageIO.write(bi, "gif", resp.getOutputStream());
}
受保护的无效数据集(HttpServletRequest-req、HttpServletResponse-resp)
抛出ServletException、IOException{
//使用任何参数和
//可能是确切的请求URI:
字符串requestURI=req.getRequestURI();
字符串imageParam1=req.getParameter(“imageParam1”);
字符串imageParam2=req.getParameter(“imageParam2”);
BuffereImage bi=。。。
resp.setContentType(“image/gif”);//256色。
write(bi,“gif”,resp.getOutputStream());
}
试试这个……它100%有效
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
*
* @author kites
*/
public class FileUpload extends HttpServlet {
File uploadFile;
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
long fileSize;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
boolean bb = upload(request);
} finally {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
private boolean upload(HttpServletRequest request) {
boolean bool = false;
try {
String fileName = "";
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
System.out.println("Inside fileupload.....");
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
// System.out.println("File content" + request.getParameter("f1"));
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();
FileItem item1 = item;
System.out.println("Form field:::" + item.isFormField());
if (!item.isFormField()) {
fileName = item.getName();
fileSize = item.getSize();
File f = new File("C:\\"+fileName);
String filepath=f.getAbsolutePath();
System.out.println("fileName = " + fileName);
System.out.println("fileSize = " + fileSize);
if (!fileName.equals("")) {
item.write(filepath);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return bool;
}
}
看起来您有3个单独的请求:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Create the BufferedImage, using any parameters and
// possibly the exact request URI:
String requestURI = req.getRequestURI();
String imageParam1 = req.getParameter("imageParam1");
BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
GetBI fetchBI = new GetBI();
bi = fetchBI.get_bi(req.getParameter(imageParam1));
resp.setContentType("image/gif");//256 colors
ImageIO.write(bi,"gif",resp.getOutputStream());
}
当图像正确显示时,然后测试包含图像的页面。您现在知道url应该是什么,因此请查看生成的html并将其与您期望的内容进行比较。图像src正确吗
<td width=350>
<img src="<%="/get-graph.gif?imageParam1="%>">
</td>
这将在以下位置显示带有imageParam1文本的图像:
http://127.0.0.1:8080/myapp/get-graph?imageParam1=Testing
感谢您的帮助。+1。我希望动态生成映像,以避免应用程序的并发用户出现问题。在添加ImageIO.write(bi,“gif”,resp.getOutputStream())时,您能否在我的代码中显示您给出的动态建议的确切上下文;在doPost中,servlet返回图像,而不是返回一个包含图像的html页面,如>,eclipse告诉我没有定义ImageIO。有什么建议吗?另外,我没有使用Spring和getServletContext()需要Spring。你对基本Java/tomcat有什么建议吗?还是我安装Spring的唯一选择?我想你说的是创建第二个servlet只用于。但是我如何将imageParams的内容放入第二个servlet?你能给我看一下这方面的显式代码吗?足以让我完全理解吗?我已经扩展了编辑答案。
getServletContext()
也是ServletRequest
的一种方法,它也是接口HttpServletRequest
的基本接口。因此不需要通过ServletConfig。一般来说,不需要像您那样将请求分派器存储在init
中。谢谢您的帮助。我将在接下来的几小时内仔细查看rs并返回给您更多问题。再次感谢。我尝试在浏览器中加载myapp/get graph,但在执行几个类时,它给了我一个错误,表明imageParam1只有空值。然后我键入myapp/get graph?imageParam1=“aValidValue“它给了我相同的空指针错误,表明它没有收到imageParam1的值。你能给我看清楚的工作代码吗?我真的很紧张,我不确定我是否能理解这个时间框架,除非我看到工作代码。我测试了get_bi(string)函数,该函数没有从servlet接收imageParam1值。我从另一个程序中调用了get_bi(string),它工作正常,在
<td width=350>
<img src="<%="/get-graph.gif?imageParam1="%>">
</td>
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String imageParam1 = request.getParameter("imageParam1");
BufferedImage bi = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
// Try replacing with:
//GetBI fetchBI = new GetBI();
//BufferedImage bi = fetchBI.get_bi(req.getParameter("imageParam1"));
Graphics2D g = bi.createGraphics();
g.setColor(new Color(255, 255, 255));
g.drawString(imageParam1, 0, 150);
g.dispose();
response.setContentType("image/gif");
ImageIO.write(bi, "gif", response.getOutputStream());
}
}
http://127.0.0.1:8080/myapp/get-graph?imageParam1=Testing