- 浏览: 337089 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
弦月001:
我目前也是碰到这样的情况,在jsp里面没有问题,但在free ...
Spring+Freemarker(国际化) -
laj12347:
zhangsw_00 写道我参照你的方法,配置环境,在jsp文 ...
Spring+Freemarker(国际化) -
yctan:
hi,能不能把发送邮件的代码也贴一下啊。
用webdav协议访问exchange邮件服务器,下载附件的问题 -
maketc:
楼上正解,这个问题也被郁闷了半天,试过重启tomcat、ecl ...
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re -
masuweng:
楼上正解,这个问题曾被郁闷了半天
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re
编程思路:下面的UploadServlet.java ,其主要功能为从InputStream 中读取文件内容,将上传文件保存在根目录下,且文件名与上传文件的文件名一致。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class UploadServlet extends HttpServlet
{
//default maximum allowable file size is 1000k
static final int MAX_SIZE = 1024000;
//instance variables to store root and success message
String rootPath, successMessage;
/** *//**
* init method is called when servlet is initialized.
*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
//get path in which to save file
rootPath = config.getInitParameter("RootPath");
if (rootPath == null)
{
rootPath = "/";
}
/**//*Get message to show when upload is complete. Used only if
a success redirect page is not supplied.*/
successMessage = config.getInitParameter("SuccessMessage");
if (successMessage == null)
{
successMessage = "File upload complete!";
}
}
/** *//**
* doPost reads the uploaded data from the request and writes
* it to a file.
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)
{
ServletOutputStream out=null;
DataInputStream in=null;
FileOutputStream fileOut=null;
try
{
/**//*set content type of response and get handle to output
stream in case we are unable to redirect client*/
response.setContentType("text/plain");
out = response.getOutputStream();
//get content type of client request
String contentType = request.getContentType();
out.println("\ncontentType= " + contentType);
//make sure content type is multipart/form-data
if(contentType != null && contentType.indexOf(
"multipart/form-data") != -1)
{
//open input stream from client to capture upload file
in = new DataInputStream(request.getInputStream());
//get length of content data
int formDataLength = request.getContentLength();
out.println("\nContentLength= " + formDataLength);
//allocate a byte array to store content data
byte dataBytes[] = new byte[formDataLength];
//read file into byte array
int bytesRead = 0;
int totalBytesRead = 0;
int sizeCheck = 0;
while (totalBytesRead < formDataLength)
{
//check for maximum file size violation
sizeCheck = totalBytesRead + in.available();
if (sizeCheck > MAX_SIZE)
{
out.println("Sorry, file is too large to upload.");
return;
}
编程技巧说明:
首先定义上传文件最大字节为1024K(1M),上传文件保存在根目录(/)下,从请求的InputStream 读取实体数据,根据请求头 Content-Type 和contenLength 等值,从实体数据中解析出表单Form 数据中的filename 和Content- Type 等值,然后将实体数据中真正属于上传文件的内容保存到服务器上的根目录文件中。
其中用到涉及中文输出:
String fileStr=new String(dataBytes,"ISO8859_1");
fileOut=new FileOutputStream(rootPath+fileName);
fileOut.write(fileStr.getBytes("ISO8859_1"),0,fileStr.legth());
UploadFile.html 的源代码如下:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<title>Upload a File</title>
</head>
<body>
<h1>文件上传 </h1>
<h2>提示:您的浏览器必须能支持文件上传!</h2>
<form action="servlet/uploadServlet" method="POST" enctype="multipart/form-data">
<div align="left">
<pre>发送文件:<input type="file" size="40" name="upl-file"> </BR>
<input type="submit" value="开始发送" now>
<input type="reset" value="重 设"></pre>
</div>
</form>
</body>
</html>
小结:
(1) Servlet 编程要求读者已经掌握了Java 语言程序设计,最好对面向对象也有一定的了解。Java 语言程序设计最主要的是对Java 的类库的使用,同样掌握Servlet 编程也要求熟练使用Sun 公司提供的JSDK。
(2) 一个好的Servlet 程序必须要考虑得全面。由于Servlet 在服务器上执行,为客户提供服务,有时可能会有多个客户同时向一个服务器发请求,这就要求Servlet 程序必须能够保证良好的并发性。允许Servlet 并发执行,就要解决Servlet 中变量和同步访问以及共享的问题,尤其要特别注意服务器的一些昂贵的资源。另一方面,Servlet 要把处理结果返回给客户,要求Servlet 充分考虑响应的速度和响应结果的简洁明了,同时对客户的错误请求有一定的容错性。
(3) 解决Servlet 中文输出问题
当Servlet 输出的文档中有中文时,需要在Servlet 中使用下面的语句来指明:
response.setContentType("text/html;charset=gb2312");
在JSP中使用:
<%@page contentType="text/html;charset=gb2312"%>
这两者是等效的。
如果在Servlet 中文显示有问题,可从以下几方面来考虑:
* 修改区域设置---在控制面板中选择区域设置,如设为英语(美国)。
* 在编译Servlet 时加入代码选项,如:javac -encoding iso8859-1 ghqServlet.java
* 在源程序中加入编码转换函数,如:out.println(new String("请输入用户名").getBytes("GBK"),"ISO8859_1"));
或者使用下面的方法:
String Str="请输入用户名";
Byte[] tempByte=Str.getBytes("ISO8859_1");
String tempStr=new String(tempByte);
这样tempStr 中的中文就可以正确显示了。
由于Servlet 采用不同的引擎,其中文的解决方法可能不同;因此,当出现中文显示问题时,建议一定要多实验,最终总会得到解决。
(4) Java Servlet 程序弥补了 Applet 程序的不足, Servlet 主要应用在HTTP Servlet 接收请求 (HttpServletRequest接口)和产生响应(HttpServletResponse接口)、使用Cookies 及会话管理 (HttpSession 接口)应用、Java Servlet 在网络上的编程应用如利用Servlet 上传和下载文件、Servlet 的数据库编程、在Servlet 中发送和接受邮件以及Java Servlet 在RMI和XML等方面的应用,因此Servlet 的编程应用还是比较广泛的。
通常 Servlet 可以使用以下的方法调用:
* 客户通过访问 Servlet 产生的文档来调用
Server 得到一个访问文档的请求后,查找配置参数,就会发现所需文档不是一个静态文档,而是由 Servlet 对象产生的,于是服务器就会把请求传给 Servlet,Servlet 调用 "service" 方法产生输出。这种方法与传统的调用 CGI 的方法类似。
* 直接通过 URL 调用 Servlet
客户(浏览器)使用以下格式的 URL 调用:
http://Servlet_Host_Name/servlet/<servlet URL>
<servlet URL>是指向 Servlet 位置的普通的URL,它的格式如下所示:
name?para1=value1¶2=value2...
其中,name 是 Servlet 的名字,"?" 后面跟的是一串参数,para1 是第一个参数名,value1是它的值,para1 是第二个参数名,value2是它的值,以此类推。通常Servlet 存放的位置可能与服务器不在同一台机器上,这时服务器就要动态加载、初始化和执行 Servlet 类。
* 通过 SSI(Server-Side Includes) 标志调用
任何一个以.sthml 为扩展名的文件都是服务器要分析的文件。在该文件中,如果出现了Servlet标志,那么服务器就会运行该Servlet,并把它的输出结果插入标志所指示的地方。
* 把 Servlet 放在/servlet/目录下
如果一个 Servlet 的类文件被放在/servlet/目录下,那么就可以直接使用它的类名调用它。
* 通过 Filter Chain 调用
这种方法一般要把 Servlet 配置成当一个特定的 MIME 类型被设置为响应时再调用。
但Servlet 也有它的缺点:
* 在复杂的HTML 网页中,加入的动态部分如果用Servlet 来处理的话,那对程序员来说简直是一场噩梦。
* Servlet 要进行编译、放入执行码等复杂的调用过程。
正是由于Servlet存在的缺点,才出现使用JSP 技术来解决上面的问题,这也正是JSP 的优点。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class UploadServlet extends HttpServlet
{
//default maximum allowable file size is 1000k
static final int MAX_SIZE = 1024000;
//instance variables to store root and success message
String rootPath, successMessage;
/** *//**
* init method is called when servlet is initialized.
*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
//get path in which to save file
rootPath = config.getInitParameter("RootPath");
if (rootPath == null)
{
rootPath = "/";
}
/**//*Get message to show when upload is complete. Used only if
a success redirect page is not supplied.*/
successMessage = config.getInitParameter("SuccessMessage");
if (successMessage == null)
{
successMessage = "File upload complete!";
}
}
/** *//**
* doPost reads the uploaded data from the request and writes
* it to a file.
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)
{
ServletOutputStream out=null;
DataInputStream in=null;
FileOutputStream fileOut=null;
try
{
/**//*set content type of response and get handle to output
stream in case we are unable to redirect client*/
response.setContentType("text/plain");
out = response.getOutputStream();
//get content type of client request
String contentType = request.getContentType();
out.println("\ncontentType= " + contentType);
//make sure content type is multipart/form-data
if(contentType != null && contentType.indexOf(
"multipart/form-data") != -1)
{
//open input stream from client to capture upload file
in = new DataInputStream(request.getInputStream());
//get length of content data
int formDataLength = request.getContentLength();
out.println("\nContentLength= " + formDataLength);
//allocate a byte array to store content data
byte dataBytes[] = new byte[formDataLength];
//read file into byte array
int bytesRead = 0;
int totalBytesRead = 0;
int sizeCheck = 0;
while (totalBytesRead < formDataLength)
{
//check for maximum file size violation
sizeCheck = totalBytesRead + in.available();
if (sizeCheck > MAX_SIZE)
{
out.println("Sorry, file is too large to upload.");
return;
}
编程技巧说明:
首先定义上传文件最大字节为1024K(1M),上传文件保存在根目录(/)下,从请求的InputStream 读取实体数据,根据请求头 Content-Type 和contenLength 等值,从实体数据中解析出表单Form 数据中的filename 和Content- Type 等值,然后将实体数据中真正属于上传文件的内容保存到服务器上的根目录文件中。
其中用到涉及中文输出:
String fileStr=new String(dataBytes,"ISO8859_1");
fileOut=new FileOutputStream(rootPath+fileName);
fileOut.write(fileStr.getBytes("ISO8859_1"),0,fileStr.legth());
UploadFile.html 的源代码如下:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<title>Upload a File</title>
</head>
<body>
<h1>文件上传 </h1>
<h2>提示:您的浏览器必须能支持文件上传!</h2>
<form action="servlet/uploadServlet" method="POST" enctype="multipart/form-data">
<div align="left">
<pre>发送文件:<input type="file" size="40" name="upl-file"> </BR>
<input type="submit" value="开始发送" now>
<input type="reset" value="重 设"></pre>
</div>
</form>
</body>
</html>
小结:
(1) Servlet 编程要求读者已经掌握了Java 语言程序设计,最好对面向对象也有一定的了解。Java 语言程序设计最主要的是对Java 的类库的使用,同样掌握Servlet 编程也要求熟练使用Sun 公司提供的JSDK。
(2) 一个好的Servlet 程序必须要考虑得全面。由于Servlet 在服务器上执行,为客户提供服务,有时可能会有多个客户同时向一个服务器发请求,这就要求Servlet 程序必须能够保证良好的并发性。允许Servlet 并发执行,就要解决Servlet 中变量和同步访问以及共享的问题,尤其要特别注意服务器的一些昂贵的资源。另一方面,Servlet 要把处理结果返回给客户,要求Servlet 充分考虑响应的速度和响应结果的简洁明了,同时对客户的错误请求有一定的容错性。
(3) 解决Servlet 中文输出问题
当Servlet 输出的文档中有中文时,需要在Servlet 中使用下面的语句来指明:
response.setContentType("text/html;charset=gb2312");
在JSP中使用:
<%@page contentType="text/html;charset=gb2312"%>
这两者是等效的。
如果在Servlet 中文显示有问题,可从以下几方面来考虑:
* 修改区域设置---在控制面板中选择区域设置,如设为英语(美国)。
* 在编译Servlet 时加入代码选项,如:javac -encoding iso8859-1 ghqServlet.java
* 在源程序中加入编码转换函数,如:out.println(new String("请输入用户名").getBytes("GBK"),"ISO8859_1"));
或者使用下面的方法:
String Str="请输入用户名";
Byte[] tempByte=Str.getBytes("ISO8859_1");
String tempStr=new String(tempByte);
这样tempStr 中的中文就可以正确显示了。
由于Servlet 采用不同的引擎,其中文的解决方法可能不同;因此,当出现中文显示问题时,建议一定要多实验,最终总会得到解决。
(4) Java Servlet 程序弥补了 Applet 程序的不足, Servlet 主要应用在HTTP Servlet 接收请求 (HttpServletRequest接口)和产生响应(HttpServletResponse接口)、使用Cookies 及会话管理 (HttpSession 接口)应用、Java Servlet 在网络上的编程应用如利用Servlet 上传和下载文件、Servlet 的数据库编程、在Servlet 中发送和接受邮件以及Java Servlet 在RMI和XML等方面的应用,因此Servlet 的编程应用还是比较广泛的。
通常 Servlet 可以使用以下的方法调用:
* 客户通过访问 Servlet 产生的文档来调用
Server 得到一个访问文档的请求后,查找配置参数,就会发现所需文档不是一个静态文档,而是由 Servlet 对象产生的,于是服务器就会把请求传给 Servlet,Servlet 调用 "service" 方法产生输出。这种方法与传统的调用 CGI 的方法类似。
* 直接通过 URL 调用 Servlet
客户(浏览器)使用以下格式的 URL 调用:
http://Servlet_Host_Name/servlet/<servlet URL>
<servlet URL>是指向 Servlet 位置的普通的URL,它的格式如下所示:
name?para1=value1¶2=value2...
其中,name 是 Servlet 的名字,"?" 后面跟的是一串参数,para1 是第一个参数名,value1是它的值,para1 是第二个参数名,value2是它的值,以此类推。通常Servlet 存放的位置可能与服务器不在同一台机器上,这时服务器就要动态加载、初始化和执行 Servlet 类。
* 通过 SSI(Server-Side Includes) 标志调用
任何一个以.sthml 为扩展名的文件都是服务器要分析的文件。在该文件中,如果出现了Servlet标志,那么服务器就会运行该Servlet,并把它的输出结果插入标志所指示的地方。
* 把 Servlet 放在/servlet/目录下
如果一个 Servlet 的类文件被放在/servlet/目录下,那么就可以直接使用它的类名调用它。
* 通过 Filter Chain 调用
这种方法一般要把 Servlet 配置成当一个特定的 MIME 类型被设置为响应时再调用。
但Servlet 也有它的缺点:
* 在复杂的HTML 网页中,加入的动态部分如果用Servlet 来处理的话,那对程序员来说简直是一场噩梦。
* Servlet 要进行编译、放入执行码等复杂的调用过程。
正是由于Servlet存在的缺点,才出现使用JSP 技术来解决上面的问题,这也正是JSP 的优点。
发表评论
-
手动将class打包成jar包方法
2010-09-10 00:41 2761<!-- ------------------ --&g ... -
教你用Java生成RSS 简单实用
2010-09-10 00:40 3244<!-- ------------------ --&g ... -
代码的坏味道
2010-06-29 13:10 15451. Duplicated Code(重 ... -
java 获取客户端ip mac地址
2010-02-23 15:47 2902转自:http://hi.baidu.com/coolcode ... -
java中输出流OutputStream类应用实例
2010-02-04 15:30 5194OutputStream类 该类是字节输出流的抽象类,定义了输 ... -
大幅优化myeclipse的速度&关闭自动更新
2010-02-01 21:24 1386去除不需要加载的模块 一个系统20%的功能往往能够满足80% ... -
JAVA线程实例-----卖票
2010-01-08 15:44 1943package test; import java. ... -
如何学习Hibernate
2009-12-21 09:28 882Hibernate入门容易,掌握精通我也不敢自夸。我第 ... -
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re
2009-12-16 22:13 3172Tomcat 部署,在部署可能会出现以下问题: Deploy ... -
Java 的JDBC 数据库连接池实现方法
2009-12-16 01:10 1301关键字: Java, JDBC, Connection Poo ... -
jdbc PreparedStatement的用法
2009-12-15 21:51 40334jdbc(java database connectivity ... -
用java获取文件夹的大小
2009-12-14 09:15 2416/** * <p> * Created on ... -
JavaBean实现多文件上传的两种方法
2009-12-10 10:32 1006摘要:本文介绍了J ... -
通过 http 协议上传文件
2009-12-10 10:07 20761、概述 在最初的 http ... -
自学Javabean迅速成为Java高手
2009-12-10 09:17 782很多网友咨询学习Java有 ... -
response.setContentType()的String参数及对应类型
2009-12-09 13:43 2438response.setContentType()的Strin ... -
Apache Commons fileUpload实现文件上传
2009-10-19 00:15 1223Apache的commons-fileupload.jar可方 ... -
Postfix邮件服务器架设笔记
2009-08-26 06:57 1626# 安装步骤1、安装操作系统 2、安装postfixadmin ... -
3分钟安装配置Postfix邮件服务器
2009-08-26 06:51 2986Linux邮件服务器通常使用sendmail,在网上googl ... -
RedHat AS4.0 轻松搭建Postfix 邮件服务器系统
2009-08-26 06:46 4508RedHat AS4.0 轻松搭建Postfix 邮件服务器系 ...
相关推荐
本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...
假如一个场景,用户上传文件,某些用户网速较慢,同时存在100个这样的用户,如果BIO且最大线程设为100会导致线程用完。NIO怎么来解决这个问题? 本实例采用tomcat8作为容器,开启异步servlet读写事件,解决高并发IO...
servlet 上传文件流保存到数据库
Servlet实现文件上传与下载 Servlet 文件上传与下载
ajax异步文件上传,servlet处理
jsp与servlet文件上传代码,可以上传中文文件名,不乱码 jsp与javaBean文件上传代码,但上传中文文件名乱码 刚写完的。
Servlet上传文件并显示进度条
上载文件.轻松搞定.java Servlet上传文件.
JAVA_servlet的文件上传案例
servlet上传文件详细解析 大家好好看
使用commons-fileupload 做的一个简单的基于servlet的文件上传的例子
java 写的文件上传下载的例子,可以做简单图片文件服务器
Servlet中文件上传和下载,页面使用jsp里面实例化对象使用Javabean
该资源利用开源upload文件包,成功实现文件上传与下载
本工程用于借助Servlet3.0实现文件上传 本工程编码方式:UTF-8 注意: 1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C...
利用cos.jar 通过Servlet实现文件上传至服务器
vue,servlet3.0、文件上传
自己用servlet写的文件上传及下载功能带进度条 主要用到两个jar:commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar 内容介绍: com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 ...
使用Servlet实现文件的上传与下载Demo
servlet多文件上传(带进度条的),参考实例用servlet自己弄的