`

jsp_下载文件_转

    博客分类:
  • java
阅读更多

jsp java 下载文件

文章分类:Java编程

Html代码
  1. < %@ page  language = "java"   pageEncoding = "gb2312"   
  2.     import = "com.myerp.jichu.publicclass.*"   import = "java.sql.*"   
  3.     contentType = "text/html;charset=GB2312" % >   
  4. < %@ page  
  5.     import = "com.myerp.jichu.caozuo.*,java.io.*, java.util.*, java.text.*" % >   
  6. < jsp:directive.page   import = "java.util.Date"   />   
  7.   
  8.   
  9.   
  10. < %  
  11. //String path  =  request .getContextPath();  
  12. //String basePath  =  request .getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  13. String zygx_id = request .getParameter("zygxid");  
  14. String zygxurl = request .getParameter("zygxurl");  
  15. String zygxYwjm = request .getParameter("zygxywjm");  
  16.   
  17. zygxurl zygxurl  = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名  
  18.   
  19. Str str = new  Str();  
  20. int zygxid = str .parseInt(zygx_id);  
  21.   
  22. %>   
  23.   
  24. < %--      
  25. 直接在JSP页面中进行文件下载的代码(改 Servlet 或者     
  26. JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向     
  27. out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据     
  28. 库中读取也可以的.     
  29. 需传三个参数 newname,name,path     
  30. --%>      
  31.     
  32. < %!//If returns true, then should return a 304 (HTTP_NOT_MODIFIED)     
  33.     public static boolean checkFor304(HttpServletRequest req, File file) {     
  34.         //   We'll do some handling for CONDITIONAL GET (and return a 304)     
  35.         //   If the client has set the following headers, do not try for a 304.     
  36.         //     pragma: no-cache     
  37.         //     cache-control: no-cache     
  38.         if ("no-cache".equalsIgnoreCase(req.getHeader("Pragma"))     
  39.                 || "no-cache".equalsIgnoreCase(req.getHeader("cache-control"))) {     
  40.             //  Wants specifically a fresh copy      
  41.         } else {     
  42.             //   HTTP 1.1 ETags go first     
  43.             String thisTag  =  Long .toString(file.lastModified());     
  44.             String eTag  =  req .getHeader("If-None-Match");     
  45.             if (eTag != null) {     
  46.                 if (eTag.equals(thisTag)) {     
  47.                     return true;     
  48.                 }     
  49.             }     
  50.             //   Next, try if-modified-since     
  51.             DateFormat rfcDateFormat  =  new  SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");     
  52.             Date lastModified  =  new  Date(file.lastModified());     
  53.             try {     
  54.                 long ifModifiedSince  =  req .getDateHeader("If-Modified-Since");     
  55.                 // log.info("ifModifiedSince:"+ifModifiedSince);      
  56.                 if (ifModifiedSince != -1) {     
  57.                     long lastModified lastModifiedTime  = lastModified.getTime();     
  58.                     // log.info("lastModifiedTime:" + lastModifiedTime);      
  59.                     if (lastModifiedTime < = ifModifiedSince) {     
  60.                         return true;     
  61.                     }     
  62.                 } else {     
  63.                     try {     
  64.                         String s  =  req .getHeader(" If-Modified-Since ");     
  65.                         if (s != null) {     
  66.                             Date ifModifiedSinceDate  =  rfcDateFormat .parse(s);     
  67.                             // log.info("ifModifiedSinceDate:" + ifModifiedSinceDate);      
  68.                             if (lastModified.before(ifModifiedSinceDate)) {     
  69.                                 return true;     
  70.                             }     
  71.                         }     
  72.                     } catch (ParseException e) {     
  73.                         // log.warn(e.getLocalizedMessage(), e);      
  74.                     }     
  75.                 }     
  76.             } catch (IllegalArgumentException e) {     
  77.                 //  Illegal date/time header format.     
  78.                 //  We fail quietly, and return false.     
  79.                 //  FIXME: Should really move to ETags.      
  80.             }     
  81.         }     
  82.         return false;     
  83.     }%>      
  84. < %     
  85.   
  86.     String filePath  =  application .getRealPath("zygxq/"+zygxurl);//zygxurl为保存的文件名  
  87.       
  88.     boolean isInline  =  false ; //  是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,     
  89.     //  那么文件将被打开, 否则会提示下载)     
  90.     //  清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去     
  91.     //  如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错     
  92.     //  java.lang.IllegalStateException: getOutputStream() has already been called for     
  93.     //  this response,      
  94.     out.clear();     
  95.     //  {{{ BEA Weblogic 必读     
  96.     //  修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题     
  97.     //  关于文件下载时采用文件流输出的方式处理:     
  98.     //  加上response.reset(),并且所有的%> 后面不要换行,包括最后一个;     
  99.     //  因为Application Server在处理编译jsp时对于%> < %之间的内容一般是原样输出,而且默认是PrintWriter,     
  100.     //  而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,     
  101.     //  就会发生:getOutputStream() has already been called for this response的错误     
  102.     //  详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270    
  103.     //  而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件     
  104.     // 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。     
  105.     //  同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去      
  106.     response.reset();     
  107.     //  }}}      
  108.     try {     
  109.         java.io.File f  =  new  java.io.File(filePath);     
  110.         if (f.exists() && f.canRead()) {     
  111.             //  我们要检查客户端的缓存中是否已经有了此文件的最新版本, 这时候就告诉     
  112.             //  客户端无需重新下载了, 当然如果不想检查也没有关系      
  113.             if (checkFor304(request, f)) {     
  114.                 //  客户端已经有了最新版本, 返回 304      
  115.                 response.sendError(HttpServletResponse.SC_NOT_MODIFIED);     
  116.                 return;     
  117.             }     
  118.             //  从服务器的配置来读取文件的 contentType 并设置此contentType, 不推荐设置为     
  119.             //  application/x-download, 因为有时候我们的客户可能会希望在浏览器里直接打开,     
  120.             //  如 Excel 报表, 而且 application/x-download 也不是一个标准的 mime type,     
  121.             //  似乎 FireFox 就不认识这种格式的 mime type      
  122.             String mimetype  =  null ;     
  123.             mimetype  =  application .getMimeType(filePath);     
  124.             if (mimetype  == null) {     
  125.                 mimetype  =  "application/octet-stream;charset=gb2312" ;     
  126.             }     
  127.             response.setContentType(mimetype);     
  128.             //  IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件!      
  129.             String ua  =  request .getHeader("User-Agent"); //  获取终端类型      
  130.             if (ua  == null)     
  131.                 ua  =  "User-Agent:Mozilla/4.0(compatible; MSIE 6.0;)" ;     
  132.             boolean isIE  =  ua .toLowerCase().indexOf("msie") != -1; //  是否为 IE      
  133.             if (isIE && !isInline) {     
  134.                 mimetype  =  "application/x-msdownload" ;     
  135.             }     
  136.             //  下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名     
  137.             //  转换为 gb2312 编码      
  138.             String downFileName  =  new  String(f.getName().getBytes(),"gb2312");     
  139.             String inlineType  =  isInline  ? "inline" : "attachment"; //  是否内联附件     
  140.             //  or using this, but this header might not supported by FireFox     
  141.             // response.setContentType("application/x-download");      
  142.             response.setHeader("Content-Disposition", inlineType+";filename =\""+zygxYwjm+"\"");//zygxYwjm为客户看到的下载文件名  
  143.             response.setContentLength((int) f.length()); //  设置下载内容大小      
  144.             byte[] buffer  =  new  byte[4096]; //  缓冲区      
  145.             BufferedOutputStream output  =  null ;     
  146.             BufferedInputStream input  =  null ;     
  147.             try {     
  148.                 output  =  new  BufferedOutputStream(response.getOutputStream());     
  149.                 input  =  new  BufferedInputStream(new FileInputStream(f));     
  150.                 int n  = (-1);     
  151.                 while ((n  =  input .read(buffer, 0, 4096))  >  -1) {     
  152.                     output.write(buffer, 0, n);     
  153.                 }     
  154.                 response.flushBuffer();     
  155.             } catch (Exception e) {     
  156.             } //  用户可能取消了下载      
  157.             finally {     
  158.                 if (input != null)     
  159.                     input.close();     
  160.                 if (output != null)     
  161.                     output.close();     
  162.             }     
  163.         }     
  164.         return;     
  165.     } catch (Exception ex) {     
  166.         ex.printStackTrace();      
  167.     }     
  168.     //  如果下载失败了就告诉用户此文件不存在      
  169.     response.sendError(404);     
  170. %>     
<%@ page language="java" pageEncoding="gb2312"
	import="com.myerp.jichu.publicclass.*" import="java.sql.*"
	contentType="text/html;charset=GB2312"%>
<%@ page
	import="com.myerp.jichu.caozuo.*,java.io.*, java.util.*, java.text.*"%>
<jsp:directive.page import="java.util.Date" />



<%
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String zygx_id=request.getParameter("zygxid");
String zygxurl=request.getParameter("zygxurl");
String zygxYwjm=request.getParameter("zygxywjm");

zygxurl = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名

Str str=new Str();
int zygxid=str.parseInt(zygx_id);

%>

<%--    
直接在JSP页面中进行文件下载的代码(改 Servlet 或者   
JavaBean 的话自己改吧), 支持中文附件名(做了转内码处理). 事实上只要向   
out 输出字节就被认为是附件内容, 不一定非要从文件读取原始数据, 从数据   
库中读取也可以的.   
需传三个参数 newname,name,path   
--%>   
  
<%!//If returns true, then should return a 304 (HTTP_NOT_MODIFIED)   
    public static boolean checkFor304(HttpServletRequest req, File file) {   
        //   We'll do some handling for CONDITIONAL GET (and return a 304)   
        //   If the client has set the following headers, do not try for a 304.   
        //     pragma: no-cache   
        //     cache-control: no-cache   
        if ("no-cache".equalsIgnoreCase(req.getHeader("Pragma"))   
                || "no-cache".equalsIgnoreCase(req.getHeader("cache-control"))) {   
            //  Wants specifically a fresh copy    
        } else {   
            //   HTTP 1.1 ETags go first   
            String thisTag = Long.toString(file.lastModified());   
            String eTag = req.getHeader("If-None-Match");   
            if (eTag != null) {   
                if (eTag.equals(thisTag)) {   
                    return true;   
                }   
            }   
            //   Next, try if-modified-since   
            DateFormat rfcDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");   
            Date lastModified = new Date(file.lastModified());   
            try {   
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");   
                // log.info("ifModifiedSince:"+ifModifiedSince);    
                if (ifModifiedSince != -1) {   
                    long lastModifiedTime = lastModified.getTime();   
                    // log.info("lastModifiedTime:" + lastModifiedTime);    
                    if (lastModifiedTime <= ifModifiedSince) {   
                        return true;   
                    }   
                } else {   
                    try {   
                        String s = req.getHeader(" If-Modified-Since ");   
                        if (s != null) {   
                            Date ifModifiedSinceDate = rfcDateFormat.parse(s);   
                            // log.info("ifModifiedSinceDate:" + ifModifiedSinceDate);    
                            if (lastModified.before(ifModifiedSinceDate)) {   
                                return true;   
                            }   
                        }   
                    } catch (ParseException e) {   
                        // log.warn(e.getLocalizedMessage(), e);    
                    }   
                }   
            } catch (IllegalArgumentException e) {   
                //  Illegal date/time header format.   
                //  We fail quietly, and return false.   
                //  FIXME: Should really move to ETags.    
            }   
        }   
        return false;   
    }%>   
<%   

    String filePath = application.getRealPath("zygxq/"+zygxurl);//zygxurl为保存的文件名
    
    boolean isInline = false; //  是否允许直接在浏览器内打开(如果浏览器能够预览此文件内容,   
    //  那么文件将被打开, 否则会提示下载)   
    //  清空缓冲区, 防止页面中的空行, 空格添加到要下载的文件内容中去   
    //  如果不清空的话在调用 response.reset() 的时候 Tomcat 会报错   
    //  java.lang.IllegalStateException: getOutputStream() has already been called for   
    //  this response,    
    out.clear();   
    //  {{{ BEA Weblogic 必读   
    //  修正 Bea Weblogic 出现 "getOutputStream() has already been called for this response"错误的问题   
    //  关于文件下载时采用文件流输出的方式处理:   
    //  加上response.reset(),并且所有的%>后面不要换行,包括最后一个;   
    //  因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,   
    //  而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,   
    //  就会发生:getOutputStream() has already been called for this response的错误   
    //  详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270  
    //  而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件   
    // 下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。   
    //  同时这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去    
    response.reset();   
    //  }}}    
    try {   
        java.io.File f = new java.io.File(filePath);   
        if (f.exists() && f.canRead()) {   
            //  我们要检查客户端的缓存中是否已经有了此文件的最新版本, 这时候就告诉   
            //  客户端无需重新下载了, 当然如果不想检查也没有关系    
            if (checkFor304(request, f)) {   
                //  客户端已经有了最新版本, 返回 304    
                response.sendError(HttpServletResponse.SC_NOT_MODIFIED);   
                return;   
            }   
            //  从服务器的配置来读取文件的 contentType 并设置此contentType, 不推荐设置为   
            //  application/x-download, 因为有时候我们的客户可能会希望在浏览器里直接打开,   
            //  如 Excel 报表, 而且 application/x-download 也不是一个标准的 mime type,   
            //  似乎 FireFox 就不认识这种格式的 mime type    
            String mimetype = null;   
            mimetype = application.getMimeType(filePath);   
            if (mimetype == null) {   
                mimetype = "application/octet-stream;charset=gb2312";   
            }   
            response.setContentType(mimetype);   
            //  IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件!    
            String ua = request.getHeader("User-Agent"); //  获取终端类型    
            if (ua == null)   
                ua = "User-Agent:Mozilla/4.0(compatible; MSIE 6.0;)";   
            boolean isIE = ua.toLowerCase().indexOf("msie") != -1; //  是否为 IE    
            if (isIE && !isInline) {   
                mimetype = "application/x-msdownload";   
            }   
            //  下面我们将设法让客户端保存文件的时候显示正确的文件名, 具体就是将文件名   
            //  转换为 gb2312 编码    
            String downFileName = new String(f.getName().getBytes(),"gb2312");   
            String inlineType = isInline ? "inline" : "attachment"; //  是否内联附件   
            //  or using this, but this header might not supported by FireFox   
            // response.setContentType("application/x-download");    
            response.setHeader("Content-Disposition", inlineType+";filename=\""+zygxYwjm+"\"");//zygxYwjm为客户看到的下载文件名
            response.setContentLength((int) f.length()); //  设置下载内容大小    
            byte[] buffer = new byte[4096]; //  缓冲区    
            BufferedOutputStream output = null;   
            BufferedInputStream input = null;   
            try {   
                output = new BufferedOutputStream(response.getOutputStream());   
                input = new BufferedInputStream(new FileInputStream(f));   
                int n = (-1);   
                while ((n = input.read(buffer, 0, 4096)) > -1) {   
                    output.write(buffer, 0, n);   
                }   
                response.flushBuffer();   
            } catch (Exception e) {   
            } //  用户可能取消了下载    
            finally {   
                if (input != null)   
                    input.close();   
                if (output != null)   
                    output.close();   
            }   
        }   
        return;   
    } catch (Exception ex) {   
        ex.printStackTrace();    
    }   
    //  如果下载失败了就告诉用户此文件不存在    
    response.sendError(404);   
%>  


黑色头发:http://heisetoufa.iteye.com/
分享到:
评论

相关推荐

    mtc.rar_MTc_jsp_jsp 文件管理_mtc.jsp_文件管理

    最后,“mtc.jsp”是JSP文件的具体名称,可能是该项目的主要入口或者用于实现文件管理功能的关键页面。 【描述解析】 描述中提到“JSP版文件管理,可以管理系统所有盘的文件。”这揭示了项目的核心特性,即它是一个...

    jsp 文件管理器.rar_jsp_jsp 文件_jsp文件_文件管理

    JSP文件管理器是一个应用程序,它允许用户通过Web界面查看、上传、下载、删除和管理服务器上的文件。这样的系统在共享文件、协作工作或远程访问文件时非常有用。 ### JSP核心概念 1. **页面元素**:JSP页面由静态...

    免费的 JSP多文件上传的组件.ZIP_JSP上传_jsp_jsp 上传_jsp多文件上传_jsp文件上传

    标签进一步强调了关键词“jsp上传”、“jsp多文件上传”和“jsp文件上传”,这些都与文件上传的特定场景有关。在JSP中处理多文件上传意味着组件需要能够处理一个请求中包含的多个文件,并且可能支持并发上传,以提高...

    JSP_JTBC_CMS(MYSQL).zip_JTBC_JTBC_CMS_cms java_cms文件系统_jsp cms m

    这些文件通常与JSP页面配合工作,以呈现动态内容。 7. **jsp_cms**:这个标签暗示了CMS系统的核心部分是用JSP编写的,强调了系统的后端逻辑和视图层是基于Java技术的。 8. **mysql_**:此标签可能表明系统对MySQL...

    jsp_BBS.rar_bbs jsp_jsp bbs_jsp_bbs_jsp的bbs论坛

    2. "BBS" - 这可能是论坛项目的源代码目录,包含JSP文件、Servlet、CSS、JavaScript、数据库配置等相关文件。通常,JSP项目会包括如login.jsp(登录页面)、post.jsp(发帖页面)、forum.jsp(论坛首页)等文件,...

    jspsmartupload组件源码.zip_ jspSmartUpload_jsp_jsp 上传文件_jspSmartUplo

    **JSpsmartupload组件**是一个基于Java的上传文件解决方案,主要应用于JSP(Java Server Pages)环境中。这个组件提供了一种简单且强大的方式来处理用户通过网页上传的文件。在标题和描述中提到的,该组件的核心是用...

    jspupload.rar_jspuplo_jspupload source_下载文件

    【标题】"jspupload.rar_jspuplo_jspupload source_下载文件" 是一个与Java Servlet Pages (JSP)相关的上传下载组件的源代码包。这个组件,名为jspupload,是一个专门为JSP开发的工具,它允许用户在Web应用程序中...

    jsp--upload.rar_jsp 文件_upload.jsp _文件上传

    在这个名为"jsp--upload.rar"的压缩包中,我们重点关注的是文件上传功能,具体体现在"upload.jsp"这个文件上。 文件上传是Web应用中的常见需求,它允许用户将本地文件传输到服务器,以便于存储、处理或共享。在JSP...

    BBS.rar_bbs jsp sql_jsp_jsp bbs sql_jsp sql_jsp 酒店管理

    通常,在JSP项目中,"BBS"可能是一个目录,包含着如HTML、CSS、JavaScript、JSP文件、图片资源、配置文件等,以及可能的数据库连接配置和SQL脚本。 综上所述,这个系统是一个基于JSP的BBS论坛,专门为酒店管理场景...

    JSP_bbs.rar_bbs jsp_bbs jsp_jsp b_jsp bbs

    JSP文件在服务器端被编译为Servlet,然后由Web服务器执行,生成HTML响应给客户端。JSP的核心优势在于它将表现层(HTML)与业务逻辑(Java)分离,实现了良好的可维护性和可扩展性。 二、BBS系统概述 BBS,即...

    jsp_bbs.rar_bbs j_jsp_jsp bbs_jsp 论坛 系统_jsp论坛系统

    【标题】"jsp_bbs.rar_bbs j_jsp_jsp bbs_jsp 论坛 系统_jsp论坛系统" 涉及的核心知识点主要围绕JSP(Java Server Pages)技术构建一个BBS(Bulletin Board System,即论坛系统)进行展开。JSP是一种基于Java的...

    jsp.rar_jsp_jsp Statistics_jsp chart_jsp 选课_毕业设计

    【压缩包子文件的文件名称列表】"学生课绩管理系统jsp+servlet+javaBean+sql_server"表明项目可能采用了MVC(Model-View-Controller)架构,其中JSP作为视图层,Servlet处理请求和业务逻辑,JavaBean作为模型层,...

    SWFUpload_JSP_多文件上传

    4. **upload.jsp**:JSP文件,处理上传请求并保存文件。 5. **CSS和图片文件**:用于美化UI和指示上传状态。 6. **可能的示例配置文件**:如SWFUpload的配置JSON文件,定义上传参数。 为了使这个Demo工作,你需要在...

    jsp.zip_jsp_jsp spy 2010 pudn_jsp spy 2010 pu_pudn jsp spy 2010

    JSP文件会被Web容器(如Apache Tomcat)编译成Servlet,然后执行生成HTML响应返回给客户端。 在`jsp_spy_2010`中,"spy"通常指的是监控或者探测功能,可能包含了一些用于远程管理和监控服务器状态的脚本。这些脚本...

    JSP做的BBS,程序较简单.rar_bbs jsp_bbs jsp_jsp_jsp bbs

    "www.pudn.com.txt" 可能包含关于项目来源或下载链接的信息,而"JSP做的BBS,程序较简单"可能是项目的源代码文件或者相关文档,它会详细解释如何运行、部署和理解这个JSP BBS系统。 JSP BBS系统的实现通常涉及以下...

    goodsshop.rar_JSP Server2000_goodsshop_jsp_jsp sql_jsp sql tomca

    【标题】"goodsshop.rar_JSP Server2000_goodsshop_jsp_jsp sql_jsp sql tomcat" 指的是一个基于JSP(JavaServer Pages)技术的网上商城系统,该系统构建在SQL SERVER 2000数据库管理和Apache Tomcat应用服务器之上...

    jsp页面实现文件的下载功能

    在这个场景下,我们关注的是如何在JSP页面中实现文件的下载功能。这个功能在很多网站上都常见,例如提供文档、软件或其他资源的下载服务。下面我们将详细探讨如何实现这一功能。 首先,为了创建一个下载链接,你...

    在jsp中使用smartupload组件上传文件.rar_SmartUpload jsp_jsp 上传_jsp 上传文件_sma

    SmartUpload是一个强大的JSP文件上传组件,它简化了在JSP中处理文件上传的过程。本篇文章将深入探讨如何在Windows环境下使用SmartUpload组件在JSP中实现文件上传功能。 首先,我们需要了解SmartUpload组件的基本...

    j2ee学习基本功 jsp_DAO jsp_Servlet jsp_sql jsp_smartupload

    JSP文件会被编译成Servlet,然后由Web服务器执行。 2. **DAO(Data Access Object)模式**:DAO是一种设计模式,它的主要目的是提供一个接口,用于应用程序与数据库之间的交互,隔离了业务逻辑和数据访问细节。DAO...

    jsp.rar_JSP 论坛源代码_bbs jsp_bbs jsp_jsp 论坛_论坛

    【标题】"jsp.rar_JSP 论坛源代码_bbs jsp_bbs jsp_jsp 论坛_论坛" 暗示了这个压缩包包含了一个基于JSP(Java Server Pages)技术构建的论坛系统源代码。JSP是Java平台上的动态网页技术,它允许开发人员将静态HTML与...

Global site tag (gtag.js) - Google Analytics