Java获取系统文件类型图标并显示在JSP上

在网站制作中通常需要上传附件,而对于附件我们往往希望在其名称前面有类似于Windows系统中的类型图标,那么怎么根据附件的类型来显示不同的图标呢?目前有两种解决方案: 
第一种:将所有类型文件的图标图片放置到项目中,然后通过分析文件的扩展名来调用相应的图片,这种方式比较简单常见,但是我们往往无法弄到所有文件类型的图标,而且也不能排除意外情况的出现,这里就不在介绍了; 
第二种:通过java调用系统的文件类型图标然后显示出来,好处是可以显示跟操作系统中一模一样的图标,但是要复杂一些,下面详细介绍。 
1、JSP 
Java代码  
<img src="fileAction!dispalyIcon?dirName=<%=request.getAttribute("fileName").toString()%>" style="width:16px;height:16px;"/>  
 
2、fileAction 
Java代码  
@Component("fileAction")  
public class FileAction extends ActionSupport {   
private String dirName;  
public String getDirName() {  
        return dirName;  
    }  
  
    public void setDirName(String dirName) {  
        this.dirName = dirName;  
    }  
public void dispalyIcon() {  
        HttpServletResponse response = ServletActionContext.getResponse();  
        response.setContentType("image/png");  
        try {  
            OutputStream sos = response.getOutputStream();  
            BufferedImage myImage = CommonTool.getImageByFileTyle(dirName);  
            ImageIO.write(myImage, "png", sos);  
            sos.flush();  
            sos.close();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          
    }  
}  
 
3、CommonTool 
Java代码  
public class CommonTool {  
    public static BufferedImage getImageByFileTyle(String filename)  
            throws FileNotFoundException {  
        File file = null;  
        String extension = filename.substring(filename.lastIndexOf("."))  
                .toLowerCase();  
        try {  
            file = File.createTempFile("icon", extension);  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return toBufferedImage(toImage(toIcon(file)));  
  
    }  
  
    public static Icon toIcon(File file) throws FileNotFoundException {  
        ShellFolder shellFolder = ShellFolder.getShellFolder(file);  
        Icon icon = new ImageIcon(shellFolder.getIcon(true));  
        return icon;  
    }  
  
    public static Image toImage(Icon icon) {  
        if (icon instanceof ImageIcon) {  
            return ((ImageIcon) icon).getImage();  
        } else {  
            int w = icon.getIconWidth();  
            int h = icon.getIconHeight();  
            GraphicsEnvironment ge = GraphicsEnvironment  
                    .getLocalGraphicsEnvironment();  
            GraphicsDevice gd = ge.getDefaultScreenDevice();  
            GraphicsConfiguration gc = gd.getDefaultConfiguration();  
            BufferedImage image = gc.createCompatibleImage(w, h);  
            Graphics2D g = image.createGraphics();  
            icon.paintIcon(null, g, 0, 0);  
            g.dispose();  
            return image;  
        }  
    }  
  
    private static boolean hasAlpha(Image image) {  
        // If buffered image, the color model is readily available  
        if (image instanceof BufferedImage) {  
            BufferedImage bimage = (BufferedImage) image;  
            return bimage.getColorModel().hasAlpha();  
        }  
  
        // Use a pixel grabber to retrieve the image's color model;  
        // grabbing a single pixel is usually sufficient  
        PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);  
        try {  
            pg.grabPixels();  
        } catch (InterruptedException e) {  
        }  
  
        // Get the image's color model  
        ColorModel cm = pg.getColorModel();  
        return cm.hasAlpha();  
    }  
  
    // This method returns a buffered image with the contents of an image  
    public static BufferedImage toBufferedImage(Image image) {  
        if (image instanceof BufferedImage) {  
            return (BufferedImage) image;  
        }  
  
        // This code ensures that all the pixels in the image are loaded  
        image = new ImageIcon(image).getImage();  
  
        // Determine if the image has transparent pixels; for this method's  
        // implementation, see Determining If an Image Has Transparent Pixels  
        boolean hasAlpha = hasAlpha(image);  
  
        // Create a buffered image with a format that's compatible with the  
        // screen  
        BufferedImage bimage = null;  
        GraphicsEnvironment ge = GraphicsEnvironment  
                .getLocalGraphicsEnvironment();  
        try {  
            // Determine the type of transparency of the new buffered image  
            int transparency = Transparency.OPAQUE;  
            if (hasAlpha) {  
                transparency = Transparency.BITMASK;  
            }  
  
            // Create the buffered image  
            GraphicsDevice gs = ge.getDefaultScreenDevice();  
            GraphicsConfiguration gc = gs.getDefaultConfiguration();  
            bimage = gc.createCompatibleImage(image.getWidth(null), image  
                    .getHeight(null), transparency);  
        } catch (HeadlessException e) { 
            // The system does not have a screen  
        }  
  
        if (bimage == null) {  
            // Create a buffered image using the default color model  
            int type = BufferedImage.TYPE_INT_RGB;  
            if (hasAlpha) {  
                type = BufferedImage.TYPE_INT_ARGB;  
            }  
            bimage = new BufferedImage(image.getWidth(null), image  
                    .getHeight(null), type);  
        }  
  
        // Copy image to buffered image  
        Graphics g = bimage.createGraphics();  
  
        // Paint the image onto the buffered image  
        g.drawImage(image, 0, 0, null);  
        g.dispose();  
  
        return bimage;  
    }  
}  
 
4、struts.xml 
Java代码  
<action name="fileAction" class="com.render.action.cyl.FileAction">  
    <result name="input">login.jsp</result>  
</action>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java中的Date和SimpleDateFormat类来获取网络时间并在JSP网页显示。具体步骤如下: 1. 在Java中使用URLConnection类打开一个连接到网络时间服务器,例如:time.windows.com。 2. 从URLConnection对象中获取输入流并读取服务器返回的时间数据。 3. 使用Date类将时间数据转换为日期对象。 4. 使用SimpleDateFormat类将日期格式化为你所需的字符串格式。 5. 将格式化后的时间字符串传递给JSP页面,并在页面中显示。 以下是示例代码: Java代码: ``` import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.Date; public class NetworkTime { public static void main(String[] args) { try { // 打开网络连接 URL url = new URL("http://time.windows.com"); URLConnection conn = url.openConnection(); conn.connect(); // 读取服务器返回的时间数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String timeString = in.readLine(); in.close(); // 转换为日期对象 Date date = new Date(Long.parseLong(timeString) * 1000); // 格式化日期为字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedTime = sdf.format(date); // 输出结果 System.out.println(formattedTime); } catch (Exception e) { e.printStackTrace(); } } } ``` 在JSP页面中使用以下代码来显示网络时间: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Network Time</title> </head> <body> <h1>Network Time</h1> <p>The current network time is: <%= request.getAttribute("networkTime") %></p> </body> </html> ``` 在Servlet中使用以下代码来将网络时间传递给JSP页面: ``` import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/NetworkTimeServlet") public class NetworkTimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 打开网络连接 URL url = new URL("http://time.windows.com"); URLConnection conn = url.openConnection(); conn.connect(); // 读取服务器返回的时间数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String timeString = in.readLine(); in.close(); // 转换为日期对象 Date date = new Date(Long.parseLong(timeString) * 1000); // 格式化日期为字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedTime = sdf.format(date); // 将结果传递给JSP页面 request.setAttribute("networkTime", formattedTime); request.getRequestDispatcher("networkTime.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } } ``` 当你访问NetworkTimeServlet时,它将从网络时间服务器获取时间并将结果传递给networkTime.jsp页面进行显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值