友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

JSP入门教程(DOC格式)-第15部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


载文件,也可以点击删除删除文件。  



                                   103 / 148  


…………………………………………………………Page 104……………………………………………………………

                                                 



                                                                                                    



请看一下这里的 temp 和 upload 目录,mons…fileupload 会把从请求中接收 

到的文件临时保存在 temp 目录下等待处理,我们可以使用write()方法将临时 

文件移动到我们指定的目录,也可以直接用 delete()方法删除。  



upload 目录是上传文件的存放目录,上传成功的文件最后都会保存到这个目录 

下。  



                                                                                                                 



为了使用 mons…fileupload 处理上传文件,需要把两个依赖包放到 

WEB…INF/lib 目录下。  



                                                                                      



这样就能在 UploadServlet。java 中使用 mons…fileupload 了,处理上传的 

save()方法如下:  



public void save(HttpServletRequest request;HttpServletResponse  

response)  

    throws Exception {  

    String temp = getServletContext()。getRealPath(〃/temp〃); // 上传时 

存放临时文件的目录  

    String uploadDir = getServletContext()。getRealPath(〃/upload〃); //  

上传文件存放的目录  

    DiskFileUpload diskFileUpload = new DiskFileUpload();  



                                             104 / 148  


…………………………………………………………Page 105……………………………………………………………

                                         



    diskFileUpload。setSizeMax(1*1024*1024); // 设置允许用户上传文件大 

小;单位 :字节  

    diskFileUpload。setSizeThreshold(4096);  // 设置最多只允许在内存中 

存储的数据;单位 :字节  

    diskFileUpload。setRepositoryPath(temp); // 设置一旦文件大小超过 

getSizeThreshold()的值时数据存放在硬盘的目录  

  

    //开始读取上传信息  

    List fileItems = diskFileUpload。parseRequest(request);  

    Iterator iter = fileItems。iterator(); // 依次处理每个上传的文件  

  

    while  (iter。hasNext()) {  

        FileItem item = (FileItem) iter。next(); // 忽略其他不是文件域 

的所有表单信息  

        if  (!item。isFormField()) {  

            String name = item。getName(); // 获取上传文件名;包括路径  

            name = name。substring(name。lastIndexOf(〃”) + 1); // 从全 

路径中提取文件名  

            long size = item。getSize();  

            if  (name != null && !name。equals(〃〃) && size != 0) {  

                String filePath = System。currentTimeMillis() + 〃_〃 +  

name;  

                item。write(new File(uploadDir; filePath));  

  

                Upload upload = new Upload();  

                upload。setFileName(name);  

                upload。setFilePath(〃upload/〃 + filePath);  

                upload。setFileSize(size);  

                upload。setAddDate(new Date());  

  

                list。add(upload);  

            }  

        }  

    }  

    response。sendRedirect(〃index。jsp〃);  

}   



getServletPath()。getRealPath(〃/temp〃)将得到“tomcat 安装目录 + /webapps  

+ /temp”,这是我们获得服务器下目录下唯一方法,得到了这个完整路径后才 

可以决定将文件保存到什么地方。  



处理文件上传的第一步是创建一个 DiskFileUpload,为它设置临时目录,文件 

大小限制,内存缓存的大小。  



                                      105 / 148  


…………………………………………………………Page 106……………………………………………………………

                                    



得到 DiskFileUpload 实例后,调用 parseRequest(request)解析请求,解析的 

结果是一个列表,因为我们可能上传多个问题见。  



现在可以循环得到的列表处理每一个FileItem,如果 isFormField()返回 false, 

表示当前 FileItem 对应一个上传的文件,下面就能从 FileItem 中获得文件名和 

文件大小,最后调用 write()方法写入 upload 目录下。  



调用 write()之后,temp 目录下对应的临时文件自动会被删除,如果想保存文件 

的具体信息,还需要进行另外的处理,这里我们使用的是一个自定义 javabean, 

每次上传成功后会创建一个 Upload,将文件名,文件保存的路径,文件大小, 

上传时间加入 UploadServlet 中定义的 list 变量中,下次执行 

upload。do?method=list 请求的时候会将其中保存的数据显示到 list。jsp 中。 

当然如果服务器重启后内存中的数据就会丢失,实际开发时我们需要将上传信息 

保存到数据库中。  



11。2。 浏览器部分的设置  



文件上传需要客户端与服务器端配合工作,客户端的浏览器必须将文件内容附加 

到 http 协议请求中,这样服务器才能处理。  



浏览器端有几点需要注意的。  



   1。  使用 method=〃GET〃。  



      表单默认使用 method=〃GET〃提交请求,GET 方式的请求是没有请求体 

       (body)的,所有参数都将附加到url 后传递给服务器。  



                                                                   



      文件上传需要将二进制数据放到请求体(body)中,所以我们必须指定表 

      单使用 method=〃POST〃。  



                                  106 / 148  


…………………………………………………………Page 107……………………………………………………………

                                                                 



                                                                                                                 



2。  为表单设置 enctype=〃multipart/form…data〃。  



      不设置 enctype 的情况表单只会把文件名传递到服务器,enctype 的效果 

      是把本地文件以二进制的形式附加到请求的 body 中,供服务器接收解析。  



                                                                                                                 



                                                          107 / 148  


…………………………………………………………Page 108……………………………………………………………

                                              



                            第 12 章 导出文件  



注意  



超越 contentType=〃text/html〃,servlet 不只可以生成 text/html 类型的 html 

文本,也可以生成 image/jpeg 类型的图片,http 支持的所有文件格式都可以通 

过 servlet 生成。  



如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章: 

第 13 章 剖析 el 表达式。  



    1。  了解如何使用 servlet 生成图片。  

    2。  了解设置 contentType 使 servlet 生成不同格式的文件。  



12。1。 图片校验码  



进入首页,会显示一个彩色图形验证码,用户根据图片上的文字输入文本框。  



                                                                          



如果输入错误,会提示输入与图片文字不同,并更新验证码。  



                                                                          



                                          108 / 148  


…………………………………………………………Page 109……………………………………………………………

                                       



输入正确会显示成功信息。  



                                                              



彩色验证码用来防止恶意程序自动发送垃圾消息,或者是恶意程序循环尝试登录 

密码。人眼可以根据图片了解验证码的内容,但如果是程序就需要扫描图片分析 

图片中的内容,为了加大程序分析破解的难度,我们还为图片准备了干扰用的背 

景颜色,并随便修改文字的颜色。这些都是为了加大程序破解的难度。  



现在所有的注意力都集中到如何动态生成校验用的图片,看一下 index。jsp 中的 

代码。  



  



大家可能感到奇怪了,这里 img 标签对应的是一个静态 jpg 图片,为什么每次刷 

新显示的图片内容都不同呢?仔细检查 12…01 目录下我们也看不到captcha。jpg 

这个图片,这个图片到底是从哪里得到的呢?  



如我们之前所谈到的第 3。4。2 节  “forward 导致找不到图片”,在 html 里包 

含的图片,css 样式表,js 脚本,视频等等外部资源,都需要浏览器再次向服务 

器发起请求。现在我们进行的请求是一个名叫 captcha。jpg 的图片,而服务器上 

并没有这个图片,从 web。xml 里的配置可以看到如下配置。  



  

    CaptchaServlet  

    anni。CaptchaServlet  

  

  

    CaptchaServlet  

    /captcha。jpg  

  

          



在这里,名叫/captcha。jpg 的请求会交给CaptchaServlet 处理。虽然这个请求 

看起来很像一个实际存在的文件,可服务器接收到这个请求之后并没有去磁盘上 

找这个文件,而是根据 web。xml 中配置把request 发送给 CaptchaServlet 并等 

待它做出响应。  



                                    109 / 148  


…………………………………………………………Page 110……………………………………………………………

                                       



请大家注意,jsp 和 servlet 并不是只能返回 html 格式的数据,实际上它们可 

以生成任意格式的数据,比如这里我们就用 servlet 生成了一个图片。正如我们 

之前讨论 forward 时提到的,第 3。4。2 节  “forward 导致找不到图片”,浏览 

器只是向服务器发送了一个请求,这个请求的地址是/captcha。jpg 还是 

/index。jsp 并没有什么区别,在服务器看来他们仅仅是一个字符串而已,接收 

到请求后服务器先去按照 web。xml 中的配置做映射,将请求交给对应的 servlet 

处理,如果 web。xml 中没有对应这个请求的映射,才会去磁盘查找是否有这么一 

个文件,找到文件则输出到响应中传回客户端,如果找不到就返回经典的 404(找 

不到访问资源)。  



其实我们使用的/check。do 也是一样的道理,你在服务器上找不到名叫 check。do 

的文件,它只是一个指向CheckServlet 的道标,告诉服务器调用CheckServlet 

处理这个请求,请记住,这些仅仅是请求,你永远不知道服务器会返回给你什么。  



代码请大家参考 12…01/WEB…INF/src/CaptchaServlet。java,因为 img 只可能通 

过 GET 方式发送请求,所以我们仅仅定义了 doGet()方法。  



public void doGet(HttpServletRequest request; HttpServletResponse  

response)  

    throws ServletException; IOException {  

  

    //设置页面不缓存  

    response。setHeader(〃Pragma〃; 〃No…cache〃);  

    response。setHeader(〃Cache…Control〃; 〃no…cache〃);  

    response。setDateHeader(〃Expires〃; 0);  

  

    // 在内存中创建图象  

    int width = 60; height = 20;  

    BufferedImage image = new BufferedImage(width; height;  

BufferedImage。TYPE_INT_RGB);  

  

    // 获取图形上下文  

    Graphics g = image。getGraphics();  

  

    //生成随机类  

    Random random = new Random();  

  

    // 设定背景色  

    g。setColor(getRandColor(200; 250));  

    g。fillRect(0; 0; width; height);  

  

    //设定字体  

    g。setFont(new Font(〃Times New Roman〃; Font。PLAIN; 18));  

  



                                    110 / 148  


…………………………………………………………Page 111……………………………………………………………

                                         



    //画边框  

    //g。setColor(new Color());  

    //g。drawRect(0; 0; width  1; height 1);  

  

  

    // 随机产生 155条干扰线,使图象中的认证码不易被其它程序探测到  

    g。setColor(getRandColor(160; 200));  

    for  (int i = 0; i 《 155; i++) {  

        int x = random。nextInt(width);  

        int y = random。nextInt(height);  

        int xl = random。nextInt(12);  

        int yl = random。nextInt(12);  

        g。drawLine(x;y;x+xl;y+yl);  

    }  

  

    // 取随机产生的认证码 (4位数字)  

    String sRand = 〃〃 ;  

    for  (int i = 0;i 《 4; i++) {  

        String rand = String。valueOf(random。nextInt(10));  

        sRand += rand;  

        // 将认证码显示到图象中  

        // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接 

生成  

        g。setColor(new Color(20 + random。nextInt(110); 20 +  

random。nextInt(110); 20 + rand
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!