实验目的
- 掌握项目中验证码的实现;
- 掌握文件上传和下载功能的实现。
实验内容
创建一个Java W eb 应用,具有Xc ode.java 的S ervlet ,另外 : u pload.jsp 和do wnload . jsp 两个页面:
- 在 Xcode.j ava Servlet 中,生成验证码,并在 view.jsp 页面显示验证码的图片,通过s ession 保存验证码的答案;
- 在u pload.jsp 页面中(对应提交的Se rvlet 为U ploadServlet.java ),上传用户选择的文件至服务器端;
- 在d ownload . jsp 页面中(对应提交的Se rvlet 为D ownloadServlet.java ),显示(1)产生的验证码,用户输入正确验证码答案后点击下载链接,能够下载( 2 )中上传的页面。
界面如图:
java
Xcode.Java
package gdpu.com;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Xcode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
int width = 150;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(0, 0, width, height);
g.setColor(Color.white);
g.setFont(new Font("SimSum", Font.PLAIN,30));
int code=(int)(Math.random()*10000);
g.drawString(""+code, 10,28);
req.getSession().setAttribute("randStr", ""+code);
Random rnd=new Random();
for (int i = 0; i < 100; i++) {
int rx=rnd.nextInt(255);
int gx=rnd.nextInt(255);
int bx=rnd.nextInt(255);;
g.setColor(new Color(rx,gx,bx));
int x = rnd.nextInt(width);
int y = rnd.nextInt(height);
g.drawOval(x, y, 1, 1);
}
ImageIO.write(image, "JPG", resp.getOutputStream());
resp.getOutputStream().close();
}
}
java
Updownload.java
package gdpu.com;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
SmartUpload su = new SmartUpload();
ServletConfig sc = this.getServletConfig();
su.initialize(sc, req, resp);
try {
su.upload();
File file = su.getFiles().getFile(0);
//注意:文件路径需要根据实际环境修改
String filename=file.getFileName();
String filename_new=new String(filename.getBytes("GBK"),"UTF-8");
file.saveAs("C:\\Users\\黄培滇\\Desktop\\JavaWeb\\"+ filename_new, su.SAVE_PHYSICAL);
} catch (SmartUploadException e) {
e.printStackTrace();
}
System.out.println("上传成功");
resp.getWriter().print("success");
}
}
java
Download.java
package gdpu.com;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Response;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String str = (String) req.getSession().getAttribute("randStr");
System.out.println("randSt=r" + str);
String rndx = req.getParameter("randStr");
System.out.println("rndx=" + rndx);
// 判断验证码功能,留给同学思考补充完成
if (rndx != null && rndx.equals(str)) {
// 1.获得请求文件名
String fileName = req.getParameter("fileName");
// 2.设置文件MIME类型(指定要返回内容的类型)
resp.setContentType(getServletContext().getMimeType(fileName));
// 3.设置Content-Disposition(指定下载该文件时的文件名)
resp.setHeader("content-disposition", "attachment;filename=" + fileName);
// 4.读取目标文件,通过response将目标文件写到客户端
// 4.1 获取目标文件的绝对路径
String filePath = "C:\\Users\\黄培滇\\Desktop\\JavaWeb\\" + fileName; // 注意文件路径需要根据实际环境修改
// 4.2 读取文件
InputStream in = new FileInputStream(filePath);
// 4.3 输出文件
OutputStream out = resp.getOutputStream();
// 写文件
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
in.close();
out.close();
} else {
resp.getWriter().append("Verification code error !");
}
}
}
java
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>JavaWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>gdpu.com.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>translate</servlet-name>
<servlet-class>gdpu.com.Trans</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>translate</servlet-name>
<url-pattern>/translate.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Xcode</servlet-name>
<servlet-class>gdpu.com.Xcode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Xcode</servlet-name>
<url-pattern>/Xcode.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>gdpu.com.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/Upload.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Downloadx</servlet-name>
<servlet-class>gdpu.com.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Downloadx</servlet-name>
<url-pattern>/Download.html</url-pattern>
</servlet-mapping>
</web-app>
html
Upload.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
<form action="Upload.html" enctype="multipart/form-data" method="post">
<input type="file" name="myFile">
<input type="submit" value="上传" style="width:100px;">
</form>
</body>
</html>
html
Download.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
<img src="./Xcode.html" />
<form method="Get" action="Download.html">
文件名:
<input type="text" name="fileName"><br>
验证码:<input type="text" name="randStr"><br>
<input type="submit" value="下载"/>
</form>
</body>
</html>
html
部分参考代码:
download.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
<img src="./Xcode.html" />
<form method="Get" action="Download.html">
文件名:
<input type="text" name="fileName"><br>
验证码:<input type="text" name="randStr"><br>
<input type="submit" value="下载"/>
</form>
</body>
</html>
Xcode.java
package com.gdpu;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Xcode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
int width = 150;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.red);
g.fillRect(0, 0, width, height);
g.setColor(Color.white);
g.setFont(new Font("SimSum", Font.PLAIN,30));
int code=(int)(Math.random()*10000);
g.drawString(""+code, 10,28);
req.getSession().setAttribute("randStr", ""+code);
Random rnd=new Random();
for (int i = 0; i < 100; i++) {
int rx=rnd.nextInt(255);
int gx=rnd.nextInt(255);
int bx=rnd.nextInt(255);
g.setColor(new Color(rx,gx,bx));
int x = rnd.nextInt(width);
int y = rnd.nextInt(height);
g.drawOval(x, y, 1, 1);
}
ImageIO.write(image, "JPG", resp.getOutputStream());
resp.getOutputStream().close();
}
}
upload.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
<form action="Upload.html" enctype="multipart/form-data" method="post">
<input type="file" name="myFile">
<input type="submit" value="上传" style="width:100px;">
</form>
</body>
</html>
DownloadServlet.java
package com.gdpu;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String str = (String) req.getSession().getAttribute("randStr");
System.out.println("randSt=r" + str);
String rndx = req.getParameter("rndx");
System.out.println("rndx=" + rndx);
// 判断验证码功能,留给同学思考补充完成
// 1.获得请求文件名
String fileName = req.getParameter("fileName");
// 2.设置文件MIME类型(指定要返回内容的类型)
resp.setContentType(getServletContext().getMimeType(fileName));
// 3.设置Content-Disposition(指定下载该文件时的文件名)
resp.setHeader("content-disposition", "attachment;filename=" + fileName);
// 4.读取目标文件,通过response将目标文件写到客户端
// 4.1 获取目标文件的绝对路径
String filePath = "d: /"+ fileName; //注意文件路径需要根据实际环境修改
// 4.2 读取文件
InputStream in = new FileInputStream(filePath);
// 4.3 输出文件
OutputStream out = resp.getOutputStream();
// 写文件
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
in.close();
out.close();
}
}
UploadServlet.java
package com.gdpu;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
SmartUpload su = new SmartUpload();
ServletConfig sc = this.getServletConfig();
su.initialize(sc, req, resp);
try {
su.upload();
File file = su.getFiles().getFile(0);
//注意:文件路径需要根据实际环境修改
file.saveAs("d:/"+ file.getFileName(), su.SAVE_PHYSICAL);
} catch (SmartUploadException e) {
e.printStackTrace();
}
System.out.println("上传成功");
resp.getWriter().print("success");
}
}
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>vx</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Xcode</servlet-name>
<servlet-class>com.gdpu.Xcode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Xcode</servlet-name>
<url-pattern>/Xcode.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>com.gdpu.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/Upload.html</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Downloadx</servlet-name>
<servlet-class>com.gdpu.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Downloadx</servlet-name>
<url-pattern>/Download.html</url-pattern>
</servlet-mapping>
</web-app>