当前位置:文档之家› 用 Servlet 进行文件上传的原理和实现

用 Servlet 进行文件上传的原理和实现

用 Servlet 进行文件上传的原理和实现
用 Servlet 进行文件上传的原理和实现

用Servlet 进行文件上传的原理和实现

Servlet 是用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。使用 Servlet 可以方便地处理在 HTML 页面表单中提交的数据,但 Servlet 的 API 没有提供对以 mutilpart/form-data 形式编码的表单进行解码的支持,因而对日常应用中经常涉及到到文件上传等事务无能为力。

如何用 Servlet 进行文件的上传,必须编程实现。

一、基本原理

通过 HTML 上载文件的基本流程如下图所示。

浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi 程序)将上传的内容进行解码了,提取出 HTML 表单中的信息,将文件数据存入磁盘或数据库。

二、各过程详解

A)填写表单并提交

通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST 方法。在 HTML 代码中,在

标签中添加以下代码可以页面上显示一个选择文件的控件。

在页面中显示如下(可能随浏览器不同而不同)

可以直接在文本框中输入文件名,也可以点击按钮后弹出供用户选择文件的对话框。

B)浏览器编码

在向服务器端提交请求时,浏览器需要将大量的数据一同提交给 Server 端,而提交前,浏览器需要按照 Server 端可以识别的方式进行编码,对于普通的表单数据,这种编码方式很简单,编码后的结果通常是 field1=value2&field2=value2&…的形式,如name=aaaa&Submit=Submit。

这种编码的具体规则可以在 rfc2231 里查到,通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种编码方式解码的支持,只需要调用 ServletRequest 类中的方法就可以得到用户表单中的字段和数据。

这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data"的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和文件一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有Content-Type 属性,然后就是数据本身。

这里,我们可以编写一个简单的 Servlet 来看到浏览器到底是怎样编码的。

实现流程:

?重载 HttpServlet 中的 doPost 方法

?调用 request.getContentLength() 得到 Content-Length ,并定义一个与 Content-Length 大小相等的字节数组 buffer 。

?从HttpServletRequest 的实例 request 中得到一个 InputStream, 并把它读入 buffer 中。

?使用 FileOutputStream 将 buffer 写入指定文件。

代码清单

// ReceiveServlet.java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

//示例程序:记录下Form提交上来的数据,并存储到Log文件中

public class ReceiveServlet extends HttpServlet

{

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws IOException, ServletException

{

//1

int len = request.getContentLength();

byte buffer[] = new byte[len];

//2

InputStream in = request.getInputStream();

int total = 0;

int once = 0;

while ((total < len) && (once >=0)) {

once = in.read(buffer,total,len);

total += once;

}

//3

OutputStream out=new BufferedOutputStream( new FileOutputStream("Receive.log",true)); byte[] breaker="\r\nNewLog: -------------------->\r\n".getBytes();

System.out.println(request.getContentType());

out.write(breaker,0,breaker.length);

out.write(buffer);

out.close();

in.close();

}

}

在使用 Opera 作为浏览器测试时,从指定的文件( Receive.log )中可以看到如下的内容

--_OPERAB__-T/DQLi2fn47+D52OOrpdrz

Content-Disposition: form-data; name="id"

id00

--_OPERAB__-T/DQLi2fn47+D52OOrpdrz

Content-Disposition: form-data; name="file3"; filename="Autoexec.bat"

Content-Type: application/octet-stream

@echo off

prompt $d $t [ $p ]$_$$

--_OPERAB__-T/DQLi2fn47+D52OOrpdrz--

这里 _OPERAB__-T/DQLi2fn47+D52OOrpdrz 就是浏览器指定的分界符,不同的浏览器有不同的确定分界符的方法,但都需要保证分界符不会在文件内容中出现。

下面是用 IE 进行测试的结果

-----------------------------7d137a26e18

Content-Disposition: form-data; name="name"

123

-----------------------------7d137a26e18

Content-Disposition: form-data; name="introduce"

I am...

I am..

-----------------------------7d137a26e18

Content-Disposition: form-data; name="file3"; filename="C:\Autoexec.bat"

Content-Type: application/octet-stream

@echo off

prompt $d $t [ $p ]$_$$

SET PATH=d:\pf\IBMVJava2\eab\bin;%PATH%;D:\PF\ROSE98I\COMMON

-----------------------------7d137a26e18--

这里 ---------------------------7d137a26e18 作为分界符。关于分界符的规则可以概况为两条:

?除了最后一个分界符,每个分界符后面都加一个 CRLF 即 '\u000D' 和 '\u000A', 最后一个分界符后面是两个分隔符"--"

?每个分界符的开头也要加一个 CRLF 和两个分隔符("-")。

浏览器采用默认的编码方式是 application/x-www-form-urlencoded ,可以通过指定 form 标签中的 enctype 属性使浏览器知道此表单是用 multipart/form-data 方式编码如:

< form action="/servlet/ReceiveServlet" ENCTYPE="multipart/form-data" method=post >

C)提交请求

提交请求的过程由浏览器完成的,并且遵循 HTTP 协议,每一个从浏览器端到服务器端的一个请求,都包含了大量与该请求有关的信息,在 Servlet 中,HttpServletRequest 类将这些信息封装起来,便于我们提取使用。

在文件上载和表单提交的过程中,有两个关心的问题,一是上载的数据是是采用的那种方式的编码,这个问题的可以从

Content-Type 中得到答案,另一个是问题是上载的数据量有多少即 Content-Length ,知道了它,就知道了 HttpServletRequest 的实例中有多少数据可以读取出来。

这两个属性,我们都可以直接从 HttpServletRequest 的一个实例中获得,具体调用的方法是 getContentType() 和getContentLength() 。

Content-Type 是一个字符串,在上面的例子中,增加

System.out.println(request.getContentType());

可以得到这样的一个输出字符串:

multipart/form-data;boundary=---------------------------7d137a26e18

前半段正是编码方式,而后半段正是分界符;

任务分解上述的字符串,取出分界符。

通过 String 类中的方法,我们可以把这个字符串分解,提取出分界符。

String contentType = request.getContentType( );

int start = contentType.indexOf("boundary=");

int boundaryLen = new String("boundary=").length();

String boundary = contentType.substring(start+boundaryLen);

boundary = "--" + boundary;

判断编码方式可以直接用 String 类中的 startsWith 方法判断。

if(contentType==null || !contentType.startsWith("multipart/form-data"))

这样,我们在解码前可以知道:

编码的方式是否是multipart/form-data

数据内容的分界符

数据的长度

我们可以用类似于 ReceiveServlet 中的方式将这个请求的输入流读入一个长度为 Content-Length 的字节数组,接下来就是将这个字节数组里的内容全部提取出来了。

D)解码

解码对我们来说是整个上载过程最繁琐的一个步骤,经过以上的流程,我们可以得到一个包含有所有上载数据的一个字节数组和一个分界符,通过对 Receive.log 分析,还可以得到每个数据段中的分界符。

而我们要得到以下内容:

?提交的表单中的各个字段以及对应的值

?如果表单中有 file 控件,并且用户选择了上载文件,则需要分析出字段的名称、文件在浏览器端的名字、文件的 Content-Type 和文件的内容。

字节数组的内容可以分解如下:

具体解码过程也可以分为两个步骤:

?将上载的数据分解成数据段,每个数据段对应着表单中的一个 Input 区。

?对每个数据段,再进行分解,提出上述要求得到的内容。

这两个步骤主要的操作有两个,一个是从一个数组中找出另一个数组的位置,类似于 String 类中的 indexOf 的功能,另一个是从一个数组中提取出另一个数组,类似于 String 类中的 substring 的功能,为此我们可以专门写两个方法,实现这种功能。

int byteIndexOf (byte[] source,byte[] search,int start)

byte[] subBytes(byte[] source,int from,int end)

为了便于使用,可以从这两个方法中衍生出下列方法

int byteIndexOf (byte[] source,String search,int start) 以一个 String 作为搜索对象参数String subBytesString(byte[] source,int from,int end) 直接返回一个 String

int bytesLen(String s) 返回字符串转化为字节数组后,字节数组的长度

这样,从一个字节数组中,根据标记提取出另一个字节数组可以表示如下:

假设我们已经将数据存入字节数组 buffer 中,分界符存入 String boundary 中

int pos1=0; //pos1 记录在buffer 中下一个 boundary 的位置

//pos0,pos1 用于 subBytes 的两个参数

int pos0=byteIndexOf(buffer,boundary,0);

//pos0 记录 boundary 的第一个字节在buffer 中的位置

do

{

pos0+=boundaryLen;

//记录boundary后面第一个字节的下标

pos1=byteIndexOf(buffer,boundary,pos0);

if (pos1==-1)

break;

pos0+=2; //考虑到boundary后面的 \r\n

PARSE[(subBytes(buffer,pos0,pos1-2));]

//考虑到boundary后面的 \r\n

pos0=pos1;

}while(true);

其中 PARSE 部分是对每一个数据段进行解码的方法,考虑到 Content-Disposition 等属性,首先定义一个 String 数组

String[] tokens={"name=\"",

"\"; filename=\"",

"\"\r\n",

"Content-Type: ",

"\r\n\r\n"

};

对于一个不是文件的数据段,只可能有 tokens 中的第一个元素和最后一个元素,如果是一个文件数据段,则包含所有的元素。第一步先得到 tokens 中每个元素在这个数据段中的位置

int[] position=new int[tokens.length];

for (int i=0;i < tokens.length ;i++ )

{

position[i]=byteIndexOf(buffer,tokens[i],0);

}

第二步判断是否是一个文件数据段,如果是一个文件数据段则 position[1] 应该大于0,并且 postion[1] 应该小于 postion[2] 即position[1] > 0 && position[1] < position[2] 如果为真,则为一个文件数据段,

1.得到字段名

String name =subBytesString(buffer,position[0]+bytesLen(tokens[0]),position[1]);

2.得到文件名

String file= subBytesString(buffer,position[1]+bytesLen(tokens[1]),position[2]);

3.得到 Content-Type

String contentType=subBytesString(buffer,position[3]+bytesLen(tokens[3]),position[4]);

4.得到文件内容

byte[] b=subBytes(buffer,position[4]+bytesLen(tokens[4]),buffer.length);

否则,说明数据段是一个 name/value 型的数据段,

且name 在 tokens[0] 和 tokens[2] 之间,value 在 tokens[4]之后

//1.得到 name

String name =subBytesString(buffer,position[0]+bytesLen(tokens[0]),position[2]);

//2.得到 value

FileHolder

封装一个文件数据段,可以从中提取文件名, Content-Type 和文件内容等属性。接口如下:

参考资料

?RFC1867 Form-based File Upload in HTML

?RFC2045/2046 MIME (Multipurpose Internet Mail Extensions) ?RFC1806 The Content-Disposition Header

?RFC2388 Returning Values from Forms: multipart/form-data

基于Java Web的猜歌游戏设计与实现(含源文件)

本科毕业论文(设计)题目:基于Java Web的猜歌游戏设计与实现 姓名: 学号: 专业:计算机科学与技术 院系:信息工程学院 指导老师: 职称学位:讲师/硕士 完成时间:2015年5月 教务处制

安徽新华学院本科毕业论文(设计)独创承诺书 本人按照毕业论文(设计)进度计划积极开展实验(调查)研究活动,实事求是地做好实验(调查)记录,所呈交的毕业论文(设计)是我个人在导师指导下进行的研究工作及取得的研究成果。据我所知,除文中特别加以标注引用参考文献资料外,论文(设计)中所有数据均为自己研究成果,不包含其他人已经发表或撰写过的研究成果。与我一同工作的同志对本研究所做的工作已在论文中作了明确说明并表示谢意。 毕业论文(设计)作者签名: 日期:

基于Java Web的猜歌游戏设计与实现 摘要 随着社会的不断发展,越来越多的人面临的压力越来越大,人们渴望随时随地都能放松自我。然而游戏正成为人们释放压力,放松自己最行之有效的娱乐方式之一。而基于Java Web的猜歌游戏以其界面美观,操作简单,对硬件要求低等优点将会备受大家的青睐。系统通过数据库对用户基本信息和歌曲信息进行统一管理,借助经典的框架Servlet对数据进行处理,又选择了前端一些功能强大的插件对数据进行展示,将猜歌与游戏很好的结合起来,意在给用户创造了一个良好的交互平台。为了更好地管理和维护本系统,系统还专门设置了管理员角色和用户角色。管理员主要的任务在于对用户上传的歌曲进行审核。而用户则是享受猜歌的乐趣,使得猜歌游戏能够稳定、高效地运行。 为了增强游戏的趣味性,告别了原始猜歌游戏的不灵活性。该系统通过用户上传歌曲功能时时更新数据库,使得歌曲不断地更新,玩家与玩家之间可以互相分享歌曲。随着网络的发展,该游戏还存在大量地后续研究工作。 关键词:猜歌;游戏;数据;Servlet框架;Java Web

基于UML的_JSP_ServletWeb应用程序设计_教学案例

111 基于UML的“JSP/Servlet Web应用程序 设计”教学案例 刘洁 (武汉软件工程职业学院,湖北 武汉 430033) 摘 要:关键词:UML软件建模;MVC模式;JSP/Servlet Web应用程序设计;教学案例;登录验证模块 本文针对“JSP/Servlet Web应用程序设计”课程中传统教学法存在的弊端,通过“用户登录验证模块”的教学案例设 计讲解如何采用UML软件建模来整合课程内容、重构课程体系。使学生能够将眼光不仅仅拘泥在程序设计的代码细节上,同时也理解软件工程思想,融会贯通所学知识为己所用。 1 “JSP/Servlet Web应用程序设计”课程教学现状 针对于当前软件人才的需求现状,目前高职院校的软件专业开始主要培养面向“软件蓝领”岗位的高技能应用型人才,开始注重“面向应用,突出能力”,开设了各种关于Java的应用课程,试图提高计算机软件专业高职生的行业竞争力。我院也针对市场需求对软件开发专业课程体系进行不断完善,逐渐形成了一个直接面向软件企业Java开发岗位的系列课程。如Java初级程序设计、Java高级程序设计、JSP/Servlet Web应用程序设、Web应用程序编码—Struts、软件开发项目实训等。 但如何将这一系列课程有效地进行组织,使培养的学生能够更好地适应企业Java软件开发岗位的能力需求,是Java课程群要解决的主要问题。以“JSP/Servlet Web应用程序设计”为例,它是Java课程体系中承上启下的核心课程,它的教学效果直接影响到后续课程的教学。然而,目前该课程的教学存在着以下几点不足,严重影响学生能力的培养。 (1)从课程体系来看,由于高职院校的学制较短,软件开发专业通常在低年级学过一门程序语言之后,尚未熟练理解运用,而直接接触Web 应用程序编码,很多语法和机制难以理解,继而影响学习效果。 (2)从教学方式来看,仍采用的是传统的教学方法,在分析基于Java体系的Web应用程序的知识结构时,采用循序渐进地讲授一门课程的知识点,学生按部就班地学习知识点的方式,而这种教学方法过于强调语法,学生往往在学了一堆语法知识点后对如何开发实际项目还是很茫然。 (3)从市面教材来看,它们有一个共性:纯粹的语法,没有软件工程思想的体现或是纯粹案例项目,却没有知识点的体现。 除此之外,开设此门课程的时间一般在第二学年上学期或下学期,此时学生已完成了“Java程序设计”“网页设计”“数据库程序设计”“计算机网络”等基础课程的学习,但每门课程之间相互独立、割裂。在这种教学体系下,学生虽然也可照着教材,或教师指导完成一些小实例或小项目,但是作为整个课程来说,这些实例或小项目是孤立的、彼此没有联系的,课程之间更没有任何联系,对于学生而言无法理解每门课程在整个课程体系中的地位和作用,学生掌握的知识也是零散的,不系统的,缺乏对课程体系的整体把握,影响教学效果。 2 基于UML的“JSP/Servlet Web应用程序设计”的教学思路 针对当前教学过程中存在的现状,讲解“JSP/Servlet Web 应用程序设计”课程不能再以课件为中心,照“屏”宣科。而需尽量保证知识推理过程需板书,老师边写边讲,使学生与教师思想同步。关键知识点上需要使用案例,且所有代码都在真实的开发环境上开发,通过教师的引导,在师生交互过程中完成编码工作。 除去关键知识点的讲解,针对学生情况,打破原有的知识分块模式,遵循先够用后升华的原则,通过选择一个常见的网站项目,将具有代表性的任务贯穿在整个教学过程中,例如日常实际上网中经常使用的功能,如保存cookie、防止用户非法登录、验证码、网上投票,网络购物等。各个知识点沿着项目主线展开,根据项目的每个模块整理出相关的知识点要素,重新组建各个知识环,环环相扣,避免了知识点零散,脱离实际应用的弊病。学生容易理解,易于掌握,同时也清楚明白整个网站构建所需的架

Struts1.2实现单文件上传讲解

Struts1 文件上传 在Web程序中的上传文件的功能一般会使用标签在客户端显示输入要上传的文件名的用户接口。如果读者使用过JSP/Servlet来处理客户端上传的文件就会知道,实现这个功能并不是很容易。而在Struts中为我们提供了一种机制,可以非常方便地将客户端上传的文件保存在服务端。 在Struts Html标签库中提供了一个标签,可以和FormFile类型的属性一起使用。通过这个属性返回的FormFile对象,就可以很方便地获得上传文件的InputStream对象,并做进一步地处理。 在Struts中,一个FormFile对象代表一个上传的文件。FormFile实际上是一个接口,我们可以在org.apache.struts.upload包中找到这个接口。FormFile接口有如下五个常用的方法: 1. getInputStream()方法 这个方法用于获得上传文件的java.io.InputStream对象,我们可以从这个InputStream对象中读取上传文件的数据,并将其写到服务端指定的路径下。 2. getFileData()方法 这个方法用于将上传文件的整个内容放到一个byte类型的数组中,如果上传文件的尺寸比较小的话,使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中。 3. getFileName()方法 这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)。 4. getFileSize()方法 这个方法用于获得上传文件的字节数。 5. destroy()方法 用于销毁所有和当前上传文件相关的资源。 下面的例子演示了如何使用标签和FormFile对象来上传单个文件。实现这个例子需要如下六步: 【第1步】建立上传文件的JSP页面 在目录中建立一个uploadFile.jsp文件,代码如下:

应用Servlet实现购物车

应用Servlet实现购物车 具体实现过程 1、创建封装商品信息的值JavaBean---------GoodsSingle package com.yxq.valuebean; public class GoodsSingle { private String name; //保存商品名称 private float price; //保存商品价格 private int num; //保存商品购买数量public String getName() { return name; } public void setName(String name) { https://www.doczj.com/doc/1c13368540.html, = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; }

public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } } 2、创建工具JavaBean-------- MyTools 实现字符型数据转 换为整型及乱码处理 package com.yxq.toolbean; import java.io.UnsupportedEncodingException; public class MyTools { public static int strToint(String str){ //将String型数据转换为int型数据的方法 if(str==null||str.equals("")) str="0"; int i=0; try{ i=Integer.parseInt(str); //把str 转换成

用 Servlet 进行文件上传的原理和实现

用Servlet 进行文件上传的原理和实现 Servlet 是用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。使用 Servlet 可以方便地处理在 HTML 页面表单中提交的数据,但 Servlet 的 API 没有提供对以 mutilpart/form-data 形式编码的表单进行解码的支持,因而对日常应用中经常涉及到到文件上传等事务无能为力。 如何用 Servlet 进行文件的上传,必须编程实现。 一、基本原理 通过 HTML 上载文件的基本流程如下图所示。 浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi 程序)将上传的内容进行解码了,提取出 HTML 表单中的信息,将文件数据存入磁盘或数据库。 二、各过程详解 A)填写表单并提交

通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST 方法。在 HTML 代码中,在 标签中添加以下代码可以页面上显示一个选择文件的控件。 在页面中显示如下(可能随浏览器不同而不同) 可以直接在文本框中输入文件名,也可以点击按钮后弹出供用户选择文件的对话框。 B)浏览器编码 在向服务器端提交请求时,浏览器需要将大量的数据一同提交给 Server 端,而提交前,浏览器需要按照 Server 端可以识别的方式进行编码,对于普通的表单数据,这种编码方式很简单,编码后的结果通常是 field1=value2&field2=value2&…的形式,如name=aaaa&Submit=Submit。 这种编码的具体规则可以在 rfc2231 里查到,通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种编码方式解码的支持,只需要调用 ServletRequest 类中的方法就可以得到用户表单中的字段和数据。 这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data"的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和文件一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有Content-Type 属性,然后就是数据本身。

jsp+servlet实例

jsp+servlet实例 开发环境myeclipse+tomcat6 1、先创建web project,项目名为RegisterSystem, 2、在WebRoot 目录下创建login.jsp文件,只需修改body中的内容,如下所示: username:
password:

3、在scr目录下的com.ht.servlet编写AcountBean.java文件,代码如下:package com.ht.servlet; public class AccountBean { private String username = ""; private String password = ""; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { https://www.doczj.com/doc/1c13368540.html,ername = username; } } 4、在scr目录下的com.ht.servlet编写servlet类CheckAccount.java文件,代码如下: package com.ht.servlet; import java.io.IOException;

上传文件详细设计

文件上传详细设计 1.用户界面 2.前端控制 ●声明控制器:uploadCtrl 2.1.上传文件 ●功能:实现本地文件保存到服务器中。 ●参数:FormData()对象 ●返回值:??? ●实现://在【uploadCtrl】作用域内声明保存文档属性的方法。 1.声明上传文件对象file 1.1声明文件信息对象file message 2.声明文件上传事件btn_upload_onclick() //1.获取文件对象 //1.调用数据接口【/ZenithThinkTank-1.0.0/servlet/FileCommand】,post提交文件对象file,获取{“file”:{"filetype":"docx","filename":”知识管理概要设计”,"files ize":"500","filepath":“/filepath"}}JSON格式 //2.将结果赋值到【uploadCtrl】作用域内的【file message】对象。

2.2.获取文档分类 ●功能:实现获取文档分类树的展示和选择。 ●参数:parentid ●返回值:??? ●实现://在【uploadCtrl】作用域内声明获取文档分类的方法。 1.声明kind对象 2.声明自动获取分类 2.1声明自动获取分类方法 $scope.auto_kind() 2.2声明保存文件信息 //1.调用数据接口【/ZenithThinkTank-1.0.0/thinktank/api/1.0/kno/i】,p ost提交filemessage参数,获得Json字符串{“msg”:”success”,”state”:” 1”} 2.3分类加载数据方法 //1.调用数据接口【/ZenithThinkTank-1.0.0/thinktank/api/1.0/kind/s/'p arentid】,post提交参数,获{“kind”:{“kindn ame”:”””案件库”, “k indId”:”-1”}} JSON格式 2.4.选择分类 //2. 将结果赋值到【uploadCtrl】作用域内的【kindlist】对象。

Java文件上传下载

主要方法介绍 上传 // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 上传初始化 su.initialize(pageContext); // 限制每个上传文件的最大长度。 su.setMaxFileSize(10000); // 限制总上传数据的长度。 su.setTotalMaxFileSize(20000); // 设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。 su.setAllowedFilesList("doc,txt"); // 设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat, //jsp,htm,html扩展名的文件和没有扩展名的文件。 su.setDeniedFilesList("exe,bat,jsp,htm,html,,"); // 上传文件 su.upload(); // 将上传文件全部保存到指定目录 int count = su.save("/upload"); 下载 // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(pageContext); // 设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开它。扩展名为pdf时, //浏览器将用acrobat打开。 su.setContentDisposition(null); // 下载文件 su.downloadFile("/upload/test.doc"); ***************************************************************************************************** ***************** 应用实例: 用户只能上传图片格式的文件实例

JSP+JavaBean+Servlet工作原理实例讲解

JSP+JavaBean两层结构的开发应该是比较熟悉的,也比较好理解。 但是有一点必须要清楚就是用户通过浏览器来发送网页的请求,此请求到达服务器后在服务器端查找对应的网页,如果是首次请求(第二次就不用解释执行了),对于JSP来说要生成Servlet,然后通过Servlet引擎来执行Servlet,把调用JavaBean的结果嵌入到页面中返回给用户的浏览器。 JSP+JavaBean+Servlet三层结构的实质是多了一个Controller:Servlet来分发客户端浏览器的请求。如果把起控制器作用的Servlet的作用理解为对客户端的请求进行预处理对理解Servlet 将有很大的帮助。通过web.xml配置文件可以找到用户请求和特定的Servlet的对应关系,每个Servlet都有一个特定的Servlet对象与之对应,所以说处理用户请求的就是一个继承自HttpServlet的Servlet对象。 与具体的Servlet对象关联,第二部分主要用来配置请求由哪个Servlet处理,Servlet名字的关联,处理请求就与具体Servlet处理对象关联起来,比如说,客户端浏览器发来/newsmain的请求,它由ms1 servlet进行处理,通过ms1就能找到相对应的serlet对象news.FirstAction,即/newsmain->ms1->news.FirstAction,这也就是配置文件的意义所在。到现在懂得了用户/newsmain请求会被news.FirstAction类的对象进行处理,所以说,要看懂程序就要看懂FirstAction

通过这个实现可以看到,当服务器收到客户端请求执行News.SearchNewsTitle(db)的操作,然后把返回值通过session.setAttribute放到session里,然后通过resp.sendRedirect(target)间接转移到newsMain.jsp,这样在newsMain.jsp里通过session.getAttribute函数就可以得到在存储在session里的对应值。 回过头来就容易看出JSP+JavaBean两层结构和JSP+JavaBean+Servlet三层结构的不同了,两层结构必须把预处理放在JSP中进行,比如说News.SearchNewsTitle(db),三层结构先把预处理在Servlet里进行了,然后相当于把这个处理结果通过Session返回给JSP,让JSP更关注于界面的显示。

java实现图片或文件的上传功能实现代码

java实现图片或文件的上传功能具体思路及代码 一、思路 文件是如何从本地发送到服务器的呢? 首先,我们创建一个新的web工程,在工程的WebRoot目录下新建一个upload文件夹,这样当我们将该工程部署到服务器上时,服务器便也生成个upload文件夹,用来存放上传的资源。 然后,在WebRoot目录下新建一个jsp文件,主要实现的作用就是选择上传的文件,提交至servlet来进行处理 详细代码如下:一个form将文件信息通过post方式传送到指定的servlet 二、代码 复制代码代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> "> My JSP 'upload.jsp' starting page

请选择上传的图片或文件:

servlet+JSP实现用户登录功能

servlet+JSP实现用户登录功能 一、Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。 这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML、Xpath、Servlet、jsp的知识点都串联起来。 二、创建MVC架构的Web项目 在MyEclipse中新创建一个webmvcframework项目,导入项目所需要的开发包(jar包),创建项目所需要的包,在java 开发中,架构的层次是以包的形式体现出来的

一个良好的JavaWeb项目架构应该具有以上的11个包,这样显得层次分明,各个层之间的职责也很清晰明了,搭建JavaWeb项目架构时,就按照上面的1~11的序号顺序创建包:domain→dao→dao.impl→service→service.impl→web.controller→web.UI→web.filter→web.listener→util→junit.test,包的层次创建好了,项目的架构也就定下来了,当然,在实际的项目开发中,也不一定是完完全全按照上面说的来创建包的层次结构,而是根据项目的实际情况,可能还需要创建其他的包,这个得根据项目的需要来定了 在src目录(类目录)下面,创建用于保存用户数据的xml文件(DB.xml) 在WEB-INF目录下创建一个pages目录,pages目录存放系统的一些受保护(不允许用户直接通过URL地址访问)的jsp 页面,用户要想访问这些受保护的jsp页面,那么只能通过me.gacl.web.UI这个包里面的Servlet 创建好的项目如下图(图-1)所示: 图-1

JavaWeb应用实例servlet实现oracle基本增删改查(精)

Java Web 应用实例 servlet实现oracle 基本增删改查 分类:JAVA WEB应用实例2012-08-31 16:51 3515人阅读评论(0 收藏举报 https://www.doczj.com/doc/1c13368540.html,/a542214712/article/details/7924444 很久没有写博客了,可能是太懒散,不愿意把时间花在这上面,可是我心里还是知道写博客的重要性的,所以从今天开始,我将与大家分享一下我学JAVA WEB写的一些小实例,我个人是不太喜欢书本上的晦涩的概念的,所以我花了更多的时间在一些应用实例上,我觉得这样的学习方式很适合我,由简到繁,由浅入深 废话不多话,开始我们的第一个实例: servlet实现oracle 基本增删改查 开发环境:JDK7 +Myeclipse10+tomcat7.0+oracle 11g 首先附上数据库创建脚本: [sql]view plaincopy 1. create table student( 2. id VARCHAR2(50 PRIMARY KEY NOT NULL, 3. name varchar2(50 NOT NULL, 4. calssGrent varchar2(50 NOT NULL , 5. result varchar(12 NOT NULL 6. ; 7. insert into student(id,name,calssGrent,result values(perseq.nextval,'张三 ','33','98' 下图为代码结构图和功能演示界面做的比较糟糕只为实现功能:

MMC_01.java 页面 //主界面提供添加,修改删除的方法 [java]view plaincopy 1. package org.lsy.servlet; 2. 3. import java.io.IOException; 4. import java.io.PrintWriter; 5. import java.sql.Connection; 6. import java.sql.DriverManager; 7. import java.sql.ResultSet; 8. import java.sql.Statement;

android上传图片至服务器=

android上传图片至服务器 本实例实现了android上传手机图片至服务器,服务器进行保存 服务器servlet代码 publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String temp=request.getSession().getServletContext().getRealPath("/") +"temp"; //临时目录 System.out.println("temp="+temp); String loadpath=request.getSession().getServletContext().getRealPath(" /")+"Image"; //上传文件存放目录 System.out.println("loadpath="+loadpath); DiskFileUpload fu =new DiskFileUpload(); fu.setSizeMax(1*1024*1024); // 设置允许用户上传文件大小,单位:字节 fu.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:字节 fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThresh old()的值时数据存放在硬盘的目录 //开始读取上传信息 int index=0; List fileItems =null; try{ fileItems = fu.parseRequest(reques t); System.out.println("fileItems="+fi leItems); } catch(Exception e) { e.printStackTrace(); } Iterator iter = fileItems.iterator(); // 依次处理每个上传的文件 while(iter.hasNext()) { FileItem item = (FileItem)iter.next();// 忽略其他不是文件域的所有表单信息

javaweb之servlet

第4天:javaweb之servlet 考查的知识点:servetl的生命周期 1.Serlvet生命周期有关的方法是() (难度B) A.init(ServletConfig config) B.service(ServletRequest request,ServletResponse response) C.destory() D.getServletName() 答案:ABC 考查的知识点:http请求 2.Http缺省的请求方式是() (难度A) A.PUT B.GET C.POST D.TRACE 答案:B 考查的知识点:servlet基础 3.HttpServlet中,用来处理GET请求的方法是() (难度A) A.doHead B.doGet C.doPost D.doPut 答案:B 考查的知识点:servlet的配置 5.在部署Servlet时,web.xml文件中标签包含哪些子标签() (难度 C) A. B. C. D. 答案:ABCD 考查的知识点:servlet基础 6.以下哪一个类可以获取Servlet的初始化参数() (难度B) A.Servlet B.ServletContext C.ServletConfig D.GenericServlet 答案:C

考查的知识点:servlet的生命周期 7. 在servlet的生命周期中,容器只会调用一次的方法是() (难度B) A.service B.getServletConfig C.init D.destroy 答案:CD 考查的知识点:doGet方法 8.给定一个Servlet的doGet方法中的代码片断() (难度B) request.setAttribute(“name”,”zhang”); response.sendRedirect(“http://localhost:8080/servlet/MyServlet”) 那么在MyServlet中可以使用哪个方法把属性name的值取出 A.String str=request.getAttribute(“name”); B.String str=(String)request.getAttribute(“name”); C.String str=request.getParameter(“name”); D.无法取出 答案:D 考查的知识点:http响应头信息 10.下面哪一个指明向客户端发送的请求正文的MIME类型() (难度B) A.Content-Type B.Content-Encoding C.Content-Length D.全是 答案:A 考查的知识点:Servlet的实现方式HttpServlet 11.在javaEE中,对于HttpServlet描述正确的是() (难度B) A.自定义的Servlet继承了HttpServlet类,一定要覆盖掉service方法 B.HttpServlet类扩展了GenericServlet类,实现了GenericServlet类的抽象方法 C.HttpServlet类中处理客户请求和响应时所使用的两个接口是HttpServletRequest 和HttpServletResponse D.自定义的Servlet继承HttpServlet类,一般只需要覆盖doPost或doGet方法,不 必覆盖service方法,service方法会调用doPost或doGet 答案:BCD 考查的知识点:servlet的配置url-pattern 12.Servlet中,下面关于url配置方式正确的是() (难度B) A./my B./my/* C./*.do D.*.do

WebUploader,Java大文件分片上传

Web大文件分片上传 Web环境中大文件上传不能再用form表单一次上传了,这样效率太低; 我在不断尝试SpringMVC环境下分片接受文件,最终失败;原因目测是SpringMVC、Struts 框架是不支持HTML5方式上传的(这类框架只能支持Form表单方式的文件上传,或者FLash) 那我们可以使用Servlet和SpringMVC结合集成方式实现大文件分片上传; 一、来看看我们的web.xml的配置 很明显两个servlet,上面一个配置的是SpringMVC的入口,下面servlet是视频上传; 他们俩的url-pattern不能冲突;

二、先来看看WebUploader的前端代码 以下是代码: <%@page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>