(1) get,post数据的请求
get,post数据的响应
(2) 文件上传
文件下载
(3) 文字转图片,验证码简单实现
图片下载
一. get,post数据的请求与响应
对loginServlet发起POST请求
<! doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" >
<title>登录</title>
</head>
<body>
<form action="login" method="POST">
<table>
<tr>
<td>User Name:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" name="submit"></td>
<td><input type="reset" name="reset"></td>
</tr>
</table>
</form>
</body>
</html>
Web服务器接受到POST请求之后:
1. request.setCharacterEncoding("utf-8");设置请求数据的编码,防止中文乱码;
2. request.getParameter("username");获取请求参数;
3. response.setContentType("text/html;charset=utf-8");设置响应体编码
4. PrintWriter out = response.getWriter();
out.println("name: "+name+"<br>"); 返回给浏览器数据;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
System.out.println(getServletContext().getRealPath("hehe"));
//处理中文乱码问题
String name = request.getParameter("username");
String pwd = request.getParameter("password");
System.out.println("name: "+name);
System.out.println("password: "+pwd);
//GET,POST数据响应
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("name: "+name+"<br>");
out.println("password: "+pwd+"<br>");
out.close();
}
关于POST,GET请求与响应中出现的乱码问题处理
1. APPWeb获取GET请求参数乱码问题
因为GET的参数已经被Tomcat预处理过,所以只能通过字符串转编码 new String( name.getBytes("ISO-8859-1"), "UTF-8" );
2. APPWeb获取POST请求参数乱码问题
(1) html页面设置 meta http-equiv="Content-Type" content="text/html" 保证传输的参数为UTF-8编码。
(2) APPWeb端默认编码是ISO-8859-1编码,我们需要设置为request.setCharacterEncoding("utf-8");即可
3. 浏览器显示响应乱码问题
响应体设置编码:response.setContentType("text/html;charset=utf-8");
二. 文件上传与下载
文件上传功能
/**
* 上传文件步骤:
*
* 1. 在public void init( ServletConfig config ) throws ServletException 中设置上传文件目录
* 2. 创建DiskFileItemFactory对象;
* 2.1 设置硬盘写数据时的缓存区大小 factory.setSizeThreshold(10*1024);
* 2.2 设置临时目录 factory.setRepository(new File(tempFilePath));
* 3. 创建文件上传对象:
* 3.1 ServletFileUpload upload = new ServletFileUpload( factory ); //factory为DiskFileItemFactory对象;
* 3.2 设置允许上传文件的最大尺寸,超过就会报异常upload.setSizeMax(100*1024*1024);
* 4. upload对象 解析request,将上传的数据,文件转变为FileItem列表 List parseRequest = (List)upload.parseRequest(request);
* 5. 根据item.isFormField()判断是普通的表单,还是文件,来进行不同的解析;
* 6. 普通的表单处理
* String name = item.getFieldName(); //获取表单项的name
String value=null;
value = new String( item.getString().getBytes("ISO-8859-1"), "UTF-8" );
7. 文件表单处理
//获取上传到服务器的路径
String filename = item.getName();
System.out.println( filename );
int index = filename.lastIndexOf("\\");
//截取出文件名
filename = filename.substring(index+1, filename.length() );
long fileSize = item.getSize(); //文件的大小
if( filename.endsWith("") && fileSize==0 ) {
return;
}
File uploadFile = new File( filePath+"/"+filename );
System.out.println( uploadFile.getPath() );
//将客户端上传的文件写入到指定路径的文件中
item.write(uploadFile);
* */
代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
//定义向客户端发送响应正文的out
PrintWriter out = response.getWriter();
out.println("<html><head><title>上传成功</title></head><body>");
//创建一个基于硬盘的FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置向硬盘写数据时所用的缓存区大小,此处为4k
factory.setSizeThreshold(10*1024);
//设置临时目录
factory.setRepository(new File(tempFilePath));
//创建一个文件上传处理器
ServletFileUpload upload = new ServletFileUpload( factory );
//设置允许上传的文件的最大尺寸 100M
upload.setSizeMax(100*1024*1024);
try {
List parseRequest = (List)upload.parseRequest(request);
int length = parseRequest.size();
for( int i=0; i<length; i++ ) {
FileItem item = (FileItem)parseRequest.get(i);
if( item.isFormField() ) { //普通的表单嘻嘻
processFromField( item, response.getWriter() );
}else { //上传的是文件信息
try {
processUploadedFile( item , response.getWriter() );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} //从request取出表单数据
out.println("<a href=\"/helloApp/upload.jsp\">继续上传文件</a> "
+ "<a href=\"/helloApp\">查看下载列表</a>");
out.println("</body></html>");
}
/** 上传的是普通的表单数据 */
private void processFromField( FileItem item, PrintWriter out ) {
String name = item.getFieldName(); //获取表单项的name
String value=null;
try {
value = new String( item.getString().getBytes("ISO-8859-1"), "UTF-8" );
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //获取表单项的value
}
/** 上传的Item是 文件 */
private void processUploadedFile( FileItem item, PrintWriter out ) throws Exception {
//获取上传到服务器的路径
String filename = item.getName();
System.out.println( filename );
int index = filename.lastIndexOf("\\");
//截取出文件名
filename = filename.substring(index+1, filename.length() );
long fileSize = item.getSize(); //文件的大小
if( filename.endsWith("") && fileSize==0 ) {
return;
}
File uploadFile = new File( filePath+"/"+filename );
System.out.println( uploadFile.getPath() );
//将客户端上传的文件写入到指定路径的文件中
item.write(uploadFile);
out.println( filename+" is saved <br>" );
out.println( "The size of "+filename + " is "+fileSize +""
+ "<br>");
}
文件下载功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名来下载文件
String fileName = request.getParameter("fileName");
System.out.println("需要下载的文件: "+fileName);
//1.获取Store下的文件内容
InputStream in = getServletContext().getResourceAsStream("/store/"+fileName);
if ( in == null ) {
response.getWriter().println("文件不存在!");
return;
}
OutputStream out = response.getOutputStream(); //因为是文件,所以采用字节流传输数据,可以防止二进制丢失
int length = in.available();
//2.设置请求头 1.设置MIMIE 2.设置content-length 3.设置content-disposition attachment
response.setHeader("Content-Type", "application/force-download");
response.setHeader("Content-Length", ""+length );
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));
//3.输出流
byte[] buffer = new byte[512];
int byteReadSize = -1;
while( (byteReadSize = in.read(buffer)) != -1 ) {
out.write(buffer, 0, byteReadSize );
}
out.close(); //传输完成
}
三. 文字转图片,生成验证码
/**
* servlet将文字生成图片步骤:
* (1) 设置MIME类型为 image/jpeg
* response.setContentType("image/jpeg");//设置MIME类型
*
* (2) 创建画布,设置画布的大小
* BufferedImage image = new BufferedImage(12*length, 16, BufferedImage.TYPE_INT_RGB);
*
* (3) 获取画布的画笔
* Graphics g = image.getGraphics();
* 设置当前画笔颜色
* g.setColor(Color.getColor("#CCCCCC"));
* 画一个黑色矩形当做背景
* g.fillRect(0, 0, 12*length, 16); //在画布上画个黑色的矩形,因为值一样,所以完全占据画布大小;
* 画线条
* int width = 12*length;
int height = 16;
g.drawLine(1, 1, width, height);
g.drawLine(1, height, width, 1);
画文字
//设置字体
g.setColor(Color.green);
Font font = new Font("Couorie", Font.BOLD, 14);
g.setFont(font);
char c;
for( int i=0; i<length; i++ ) {
c = count.charAt(i);
g.drawString(c+"", i*12+1, 14);
关闭
g.dispose();
(4) image转成图片文件,并且输出给浏览器
ImageIO.write(image, "jpeg", out);
out.close();
* */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* servlet将文字生成图片
*
*
* */
String count = "123456789";
if( count==null ) { count = "1"; }
int length = count.length();
response.setContentType("image/jpeg");//设置MIME类型
ServletOutputStream out = response.getOutputStream(); //字节流输出对象
//1. 创建一个位于缓存中的画布,长度为12*length, 高为16.
BufferedImage image = new BufferedImage(12*length, 16, BufferedImage.TYPE_INT_RGB);
//2. 获取Graphics画笔
Graphics g = image.getGraphics();
//设置画笔颜色
g.setColor(Color.getColor("#CCCCCC"));
//3.画一个灰色的矩形 长度为12*length,高度为16
g.fillRect(0, 0, 12*length, 16); //在画布上画个黑色的矩形,因为值一样,所以完全占据画布大小;
//再次设置画笔颜色
g.setColor(Color.red);
//设置*
int width = 12*length;
int height = 16;
g.drawLine(1, 1, width, height);
g.drawLine(1, height, width, 1);
//设置字体
g.setColor(Color.green);
Font font = new Font("Couorie", Font.BOLD, 14);
g.setFont(font);
char c;
for( int i=0; i<length; i++ ) {
c = count.charAt(i);
g.drawString(c+"", i*12+1, 14);
}
g.dispose();
ImageIO.write(image, "jpeg", out);
out.close();
}
—————– 本篇博客已完结 ———————