整体步骤如下:
一、创建Dynamic Web Project项目。
二、在该项目的WebContent中创建login.jsp的jsp文件,然后在WEB-INF的lib文件夹中保存servlet-api.jar,引入jar包。
三、在Java Resources的scr中创建servlet文件,名为LoginServlet.java。
四、login.jsp为html内容,form表单的action指向servlet文件,此处为./+LoginServlet(servlet文件名),代码如下:
<%@ 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="./LoginServlet">
<input placeholder="请输入用户名" name="user_name"/>
<input type="submit" value="登陆" />
</form>
</body>
</html>
五、在servlet文件中重写doGet方法或者doPost方法:
1 . 重写doGet方法(只能传数据),此时form表单不需要改样式,通过name来获取标签的值,详解见注释:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("user_name");
//文本框、密码框、文本域、下拉列表、单选等直接调用getParameter(name值)方法,括号中为html标签的name。
System.out.println(username);
//username就代表输入框的内容或者单选的value值,此时控制台会出现username的值。
//多选时调用getParameterValues(name值)方法,然后用for循环遍历就可以得到多选的value值了。
/*String [] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}*/
}
2 . 重写doPost方法(可以传数据和文件):需要粘贴commons-io-2.4.jar和commons-fileupload-1.2.1.jar到lib文件夹,然后引入jar包,详解见注释:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(request)){//1、判断当前form表单的编码方式是不是为enctype="multipart/form-data"
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
servletFileUpload.setFileSizeMax(1024*1024*6*10);
List<FileItem> fileItemList = null;
try {
fileItemList = servletFileUpload.parseRequest(request);//2、将form表单中每个携带数据的标签转换成每个FileItem对象并存到集合中
} catch (FileUploadException e) {
e.printStackTrace();
request.setAttribute("message", "文件太大,上传失败");
request.getRequestDispatcher("result.jsp").forward(request, response);
return;
}
for(FileItem fileItem : fileItemList){//3、获取form表单所携带的数据
if(fileItem.isFormField()){//为true表示为非文件类型的标签
String key = fileItem.getFieldName();//summary
String value = fileItem.getString();//summary对相的数据
System.out.println(key+":"+value);
}else{//文件类型
try {
String oldFileName = fileItem.getName();
String fileNameSuffix=oldFileName.substring(oldFileName.lastIndexOf("."));
//获取文件后缀fileNameSuffix。
System.out.println(fileNameSuffix);
String fileNamePrefix = UUID.randomUUID().toString();
//获取一个ID作为新文件的名字,这是为了防止文件名相同而无法多次保存。
// fileItem.write(new File("D:\\"+fileNamePrefix+fileNameSuffix));//未发布路径
String path = "D:/";//将文件存到D盘(可以自行修改)。
fileItem.write(new File(path+fileNamePrefix+fileNameSuffix));//发布路径
System.out.println(path+fileNamePrefix+fileNameSuffix);
} catch (Exception e) {
e.printStackTrace();
}
}
}
request.setAttribute("message", "文件上传成功");
request.getRequestDispatcher("result.jsp").forward(request, response);
//创建一个result.jsp文件,内容只有${message },这样就可以将"文件上传成功"输出到屏幕。
}else{
request.setAttribute("message", "当前form表单enctype属性的属性值非multipart/form-data");
request.getRequestDispatcher("result.jsp").forward(request, response);
}
}
运用doPost方法需要将form表单的格式更改下:
(1)method方法默认为get,所以在doGet方法时不需要添加method=“get”,但是在运用doPost方法时,就需要修改method的值为post。
(2)需要在form表单中添加 enctype=“multipart/form-data” 。
<form action="./LoginServlet" method="post" enctype="multipart/form-data">
<input placeholder="请输入用户名" name="user_name"/>
<input type="file" name="picture" >
<input type="submit" value="登陆" />
</form>
网页形式如下:
登录后会显示:
在D盘中会有上传的文件: