Servlet表单提交和文件上传
前端页面
首页:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
超链接传参
<a href="/Stage5ProcessingForms/ProcessingServlet?name=阿林&age=20">Servlet处理超链接</a>
<!--
<a href="/ProcessingServlet">Servlet处理超链接</a>
href部分有斜杠表示根目录,没有指明哪个项目,会报404
改正办法:加上上下文路径href="/Stage5ProcessingForms/ProcessingServlet"
或者把斜杠去掉href="ProcessingServlet"
-->
<hr>
普通表单传参
<!-- method属性如果不写的话,默认是get方式 -->
<form action="ProcessingServlet" method="post">
名称:<input name="name"><br>
<!-- input type不写默认为text -->
年龄:<input name="age"><br>
<input type="reset" value="取消">
<input type="submit" value="提交">
</form>
<hr>
文件上传表单
<form action="UploadServlet" method="post" enctype="multipart/form-data">
名称:<input name="name"><br>
年龄:<input name="age"><br>
<!-- file:文件上传栏 -->
上传:<input type="file" name="file"><br>
<input type="reset" value="取消">
<input type="submit" value="提交">
</form>
<hr>
获取Request中的信息,操作系统,版本号等
<a href="RequestInfoServlet">显示Request信息</a>
</body>
</html>
Other.jsp :表单传值到serlvet
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="OtherServlet" method="post">
<input type="hidden" name="hidden" value="test"><br>
性别:<input type="radio" name="gender" value="男" checked="true">男
<input type="radio" name="gender" value="女">女<br>
课程:<input type="checkbox" name="course" value="C">C
<input type="checkbox" name="course" value="Java">Java
<input type="checkbox" name="course" value="JavaEE">JavaEE<br>
城市:<select name="city">
<option value="上海">上海</option>
<option value="北京">北京</option>
<option value="宜昌">宜昌</option>
</select><br>
<input type="reset" value="取消">
<input type="submit" value="提交">
</form>
</body>
</html>
web.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Stage5ProcessingForms</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.glin.servlet.UploadServlet</servlet-class>
<multipart-config>
<!-- 设置表单上传最大的值 1024的整数倍 -->
<max-file-size>51200</max-file-size>
<!-- 表单上传的最大的请求数,一般要大于表单上传最大的值 -->
<max-request-size>52224</max-request-size>
<!-- 文件上传最小的值 -->
<file-size-threshold>4096</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet部分
ProcessingServlet : 超链接传参和普通表单传参
package com.glin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ProcessingServlet")
public class ProcessingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//超链接传参
request.setCharacterEncoding("utf-8");//在doget里面不起作用
String name=request.getParameter("name");
/*name=new String(name.getBytes("ISO8859-1"), "UTF-8");//字符串本身的方法把字符串本身转换成字节形再转换成目标编码*/
String age=request.getParameter("age");
System.out.println("name:"+name);
System.out.println("age:"+age);
//response.setContentType("text/html;charset=utf-8");
//处理乱码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getWriter().write("name:"+name+",age:"+age);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//普通表单传参
//request.setCharacterEncoding("utf-8");//在dopost里面有效
String name=request.getParameter("name");
name=new String(name.getBytes("ISO8859-1"), "UTF-8");//字符串本身的方法把字符串本身转换成字节形再转换成目标编码
String age=request.getParameter("age");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getWriter().write("name:"+name+",age:"+age);
}
}
UploadServlet : 文件上传
package com.glin.servlet;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Iterator;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import sun.print.resources.serviceui_sv;
/**
* @author glin5677
* @version 创建时间:2018年3月8日 下午6:24:37
* 类说明
*/
/*@WebServlet("/UploadServlet")*/
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*req.setCharacterEncoding("utf-8");
String name=req.getParameter("name");
String age=req.getParameter("age");
String file=req.getParameter("file");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("name:"+name+"<br/>age:"+age+"<br/>file:"+file);
*/
//process(req,resp);
process2(req, resp);
}
//javaee6.0以前,采用封装方法进行处理文件上传,通过request获取流,然后把文件信息打印出来
private void process(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//设置响应对象编码格式
resp.setContentType("text/html;charset=utf-8");
//通过请求对象获取一个输入流,流的类型是ServeltInputStream类型
ServletInputStream sis=req.getInputStream();
//缓存new一个字节数组,缓存大小定义为1024
byte[] buf=new byte[1024];
//定义标准位置变量,整形的值
int flag=0;
//通过循环来读取流里面的内容,readLine()方法一次读一行,并且把读到的内容放到字节数组里面
//readLine(buf,0,1024)把讲到的内容存到buf里面,从第0个位置读取,一次读1024个字节,当值不为-1时说明还有内容,为-1时说明值为空
while ((flag=sis.readLine(buf, 0, 1024))!=-1) {
//将字节数组buf里面的内容转换成字符串,通过字符串的构造方法,从第0位置,到第flag位置
String line=new String(buf, 0, flag);
//通过响应对象得到输出流把读到的字符串对象写到页面上,每读写一行加上一个换行
resp.getWriter().write(line+"<br/>");
}
//关闭流
sis.close();
}
//javaee6.0以后,通过提供的功能把表单上传里面的内容单独取出来,也可以去处理用户上传的文件
public void process2(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException{
resp.setContentType("text/html;charset=utf-8");
String name=req.getParameter("name");
String age=req.getParameter("age");
resp.getWriter().write("name:"+name+",age:"+age+"<br>");
//处理上传的文件
Part part=req.getPart("file");
//得到上传文件的名字
/*
* 这种方式获取不了
* String formElementName = part.getName();
* resp.getWriter().write("formElementName:"+formElementName+"<br>");
* */
//通过方法获取文件名,并把文件内容和文件名写到页面上
/*
String fileName=getFileName(part);
resp.getWriter().write("fileName:"+fileName+"<br>");
//通过输入流获取上传文件的内容
InputStream is=part.getInputStream();
byte[] buf=new byte[1024];
int flag=0;
while ((flag=is.read(buf, 0, 1024))!=-1) {
String line=new String(buf, 0, flag);
resp.getWriter().write(line+"<br>");
}
is.close();
*/
//把上传的文件保存到服务器
saveUpload(part);
//在页面上提示文件上传成功
resp.getWriter().write("文件上传成功");
}
private void saveUpload(Part part) {
//获取上传的文件名
String fileName=getFileName(part);
//通过给文件名添加前缀和系统时间纳秒数再加上文件名来避免上传的文件名冲突
fileName="glin_"+System.nanoTime()+"_"+fileName;
//通过项目的上下文来 获取服务器保存文件的路径
ServletContext cxt=getServletContext();
String realPath=cxt.getRealPath("/");
//得到tomcat部署项目的路径,上传文件默认上传到这个路径下
//System.out.println(realPath);
//自定义文件上传到项目部署路径下的一个文件夹下
File file=new File(realPath+"upload");
//如果文件路径不存在,则创建这个文件路径
if (!file.exists()) {
file.mkdirs();
}
//构建要保存的文件,保存路径和保存名字为参数
File upFile=new File(file,fileName);
//得到一个输出流、输出流和字节数组,写数据的速度比较快一点
FileOutputStream fos=null;
InputStream is=null;
byte[] buf=new byte[1024];
int flag=-1;
try {
fos=new FileOutputStream(upFile);
is=part.getInputStream();
while ((flag=is.read(buf, 0, 1024))!=-1) {
fos.write(buf, 0, flag);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭IO流,先关输出流,再关输入流
if (fos!=null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is !=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//获取上传文件名的方法
private String getFileName(Part part) {
/*
//获取所有头的集合,通过集合得到一个迭代器,迭代器里面处理的是String字符串
Iterator<String> it=part.getHeaderNames().iterator();
//如果迭代器有元素则进入循环
while (it.hasNext()) {
//得到元素头的名字
String name=it.next();
//把名字和对应的值打印在控制台,值通过part.getHeader(name)来获取
System.out.println(name+":"+part.getHeader(name));
}
//控制台得到的头信息如下:
//content-disposition:form-data; name="file"; filename="新建文本文档.txt"
//content-type:text/plain
*/
//通过位置描述的头的名称获取后面的值,再通过值里面的字符串截取出来上传的文件名
String header=part.getHeader("content-disposition");
//对字符串通过filename=进行切分
String[] arr=header.split("filename=");
//把获取到的数组取最后一个元素,把双引号用空去替换掉,但双引号要通过转译字符处理
//System.out.println(arr[arr.length-1].replace("\"", ""));
return arr[arr.length-1].replace("\"", "");
}
}
RequestInfoServlet :获取Request信息
package com.glin.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author glin5677
* @version 创建时间:2018年3月9日 下午1:20:22
* 类说明
*/
@WebServlet("/RequestInfoServlet")
public class RequestInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//将所有数据保存在一个StringBuilder里面
StringBuilder sb=new StringBuilder();
sb.append("request中信息:<br>");
sb.append("用户请求的uri地址 request uri:").append(req.getRequestURI()).append("<br/>");
sb.append("获取内容的长度 content length:").append(req.getContentLength()).append("<br>");
sb.append("请求的方法的名称 method:").append(req.getMethod()).append("<br>");
//获取所有请求头的名字,放在一个枚举对象里,里面的类型都是字符串
Enumeration<String> emt =req.getHeaderNames();
sb.append("<hr>-----------headers------------<br>");
//判断枚举对象里面是否有下一个元素
while (emt.hasMoreElements()) {
String name=emt.nextElement();
sb.append(name).append("-->").append(req.getHeader(name)).append("<br>");
}
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(sb.toString());
}
}
OtherServlet : 单选、复选传值
package com.glin.servlet;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author glin5677
* @version 创建时间:2018年3月9日 下午2:10:54
* 类说明
*/
@WebServlet("/OtherServlet")
public class OtherServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String hidden=req.getParameter("hidden");
String gender=req.getParameter("gender");
String city=req.getParameter("city");
String[] courses=req.getParameterValues("course");
resp.setContentType("text/html;charset=utf=8");
resp.getWriter().write("hidden:"+hidden+"<br>gender:"+gender+"<br>city:"+city+"<br>course:"+Arrays.toString(courses));
}
}