如何将存储在服务器上的图片显示当页面中?

javaee_sunny 2016-03-13 09:36:46
我通过一个jsp页面,将商品信息和图片路径保存到数据库中.而图片保存在tomcat服务器中.想通过访问另外一个jsp来展示出商品信息和图片,但图片一直加载不上去,查看网页源代码,显示URL加载失败.
请问大家如何解决?
下面是我的代码:
addproduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${msg }
<form action="${pageContext.request.contextPath }/servlet/addProductServlet" method="post" enctype="multipart/form-data">
商品名称:<input type="text" name="name"/><br/>
商品价格:<input type="text" name="price"/><br/>
商品数量:<input type="text" name="pnum"/><br/>
上传图片:<input type="file" name="upfile"/><br/>
<input type="submit" name="添加"/><br/>
</form>
</body>
</html>

AddProductServlet.java

package cn.itcast.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.itcast.domain.Product;
import cn.itcast.service.ProductService;

import com.sun.org.apache.commons.beanutils.BeanUtils;

public class AddProductServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个工厂对象
DiskFileItemFactory dfi = new DiskFileItemFactory();
//创建一个核心上传类对象
ServletFileUpload sfu = new ServletFileUpload(dfi);
//设置单个文件的上传大小
sfu.setFileSizeMax(1024*1024);
//设置解决中文文件名乱码问题
sfu.setHeaderEncoding("utf-8");
//解析request,将解析结果封装到一个FileItem对象中,并将该对象保存到List集合中

try {
List<FileItem> list = sfu.parseRequest(request);

//创建一个结合用于存储name-value的对应关系
Map<String,Object> map=new HashMap<String, Object>();
Product product = new Product();
//对list集合进行遍历
for(FileItem fi:list){

//判断元素是普通输入型,还是文件上传项
if(fi.isFormField()){
String name=fi.getFieldName();
String value=fi.getString("utf-8");
map.put(name, value);
}else{
String fieldName = fi.getFieldName();
//获得上传文件的名字
String filename = fi.getName();
//由于不同浏览器获得结果可能不同,所以进行截取处理
filename = filename.substring(filename.lastIndexOf("."));
//为了使存储到文件不重名,再次对文件名进行处理
filename=UUID.randomUUID()+filename;
//获得存储文件的绝对路径
String path = getServletContext().getRealPath("/images");
//String path = "\\images";
//获得上传文件的输入流
InputStream in = request.getInputStream();
//创建输出流
FileOutputStream fos = new FileOutputStream(path+"\\"+filename);
//进行流对接
byte[] b=new byte[1024];
int len;
while((len=in.read(b))!=-1){
fos.write(b, 0, len);
}
fos.close();
//注意我这里是把文件在服务器中的全路径的地址作为purl存入到了服务器中.
//下一次获取时,记得尝试用这个purl搞出来一个输入流.
map.put("id", UUID.randomUUID().toString());
map.put("purl", path+"\\"+filename);
}
}
//将map集合中的包含的键值关系队,封装到product对象中
BeanUtils.populate(product, map);
//调用业务逻辑
ProductService ps=new ProductService();
boolean b=ps.addProduct(product);
//分发转向
if(b==true){
//System.out.println("添加商品成功...");
request.getRequestDispatcher("/servlet/productListServlet").forward(request, response);

}else{
request.setAttribute("msg", "商品添加失败...");
request.getRequestDispatcher("/addProduct.jsp").forward(request, response);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

ProductListServlet.java

package cn.itcast.servlet;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Product;
import cn.itcast.service.ProductService;

public class ProductListServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ProductService ps = new ProductService();
List<Product> list=ps.getAllProducts();
request.setAttribute("list", list);
request.getRequestDispatcher("/productlist.jsp").forward(request, response);
}
}

ProductService
package cn.itcast.service;

import java.sql.SQLException;
import java.util.List;

import cn.itcast.dao.ProductDao;
import cn.itcast.domain.Product;


public class ProductService {

ProductDao pd=new ProductDao();
public Boolean addProduct(Product product) {
try {
return pd.insertProduct(product);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}

public List<Product> getAllProducts() {
try {
return pd.getAllProducts();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

}

ProductDao

package cn.itcast.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import utils.C3P0Util;

import cn.itcast.domain.Product;

public class ProductDao {
QueryRunner qr=new QueryRunner(C3P0Util.getDataSource());
public Boolean insertProduct(Product product) throws SQLException {
int i = qr.update("INSERT INTO products VALUES(?,?,?,?,?)", product.getId(),product.getName(),product.getPrice(),product.getPnum(),product.getPurl());
if(i>0){
return true;
}
return false;
}
public List<Product> getAllProducts() throws SQLException {
return qr.query("SELECT * FROM products", new BeanListHandler<Product>(Product.class));
}

}

Product[

package cn.itcast.domain;

public class Product {
private String id;
private String name;
private double price;
private int pnum;
private String purl;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPnum() {
return pnum;
}
public void setPnum(int pnum) {
this.pnum = pnum;
}
public String getPurl() {
return purl;
}
public void setPurl(String purl) {
this.purl = purl;
}

}

...全文
10269 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaee_sunny 2016-03-15
  • 打赏
  • 举报
回复
确实如楼上所说,是我想的太复杂了,其实是从根本上没有清楚如何访问tomcat服务器. 我最初以为只要src拿到一个准确的绝对路径就可以实现显示到页面中.却没有考虑到现在的tomcat服务器是在本地,但如果是在别的电脑上,使用带有盘符的绝对路径,肯定是拿不到图片的.而最初自己一直就迷糊到这里了. 现在搞清楚了一点,上传的图片的图片是保存到了服务器的文件系统中,而跳转网页显示图片时,图片的src只需要写相对于当前应用的相对路径.注意是当前应用.全路径是带着http协议,ip及端口号还有项目名称的. 比如:http://192.168.10.12:8080/day20_product/images/a.jpg 在jsp页面中,也可以写成是src="${pageContext.request.contextPath}/images/${product.purl}"; 在product对象的purl属性中保存着图片的名字,同时在数据库中purl也是保存着图片的名称. 另外也可以通过在jsp头部设置: <% String path = request.getContextPath(); String basePath = request.getScheme()+"://" +request.getServerName()+":" +request.getServerPort()+path+"/"; %> <base href= "<%=basePath %>"> 之后, 在jsp页面中,也可以写成是src="images/${product.purl}";
街头小贩 2016-03-14
  • 打赏
  • 举报
回复
有几个错别字: 1.你想的过于复杂了!像图片或其它静态资源就是你在html中连接真正的物理地址也是异步加载的 2.别外图片输出也不必输出二进制流
街头小贩 2016-03-14
  • 打赏
  • 举报
回复
可以实现为过滤器,看你喜欢什么了?别外图片输出也不能像写的哪样 为代码
if(图片在服务器上找到了){
		final RequestDispatcher rd = getServletContext().getRequestDispatcher("图片在服务器上的路径,例:/upload/xxxx/xxx.jpg");
	        //path: /thumb/scale/filename
		rd.forward(request, response);
}else{
                response.sendError(HttpServletResponse.SC_NOT_FOUND );
}
当然你哪种输出二进制流的方法也是可以的
街头小贩 2016-03-14
  • 打赏
  • 举报
回复
你想的过于复杂了!像图片或其它静态资源就是你在html中连接向真正的物理地址也是异常加载的 说说常规作法吧 1.html中的img src 指向 a:重写后的地址:/album/xxx/cover,这时需要urlrewritefilter,或者其它的重写框架,它最终指向:/album?id=xxxx b:动态地址:/album?id=xxx[或者其它参数] 2./album是一个servlet,用它来定位图片在服务器上的物理地址, 可以在此作一些工作: 缓存,格式转换,上水印,裁剪,或其.... 最后:最终输出 参考github上的:https://github.com/soulgalore/image-resize-servlet

5,655

社区成员

发帖
与我相关
我的任务
社区描述
Web开发应用服务器相关讨论专区
社区管理员
  • 应用服务器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧