Javaweb基础案例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Javaweb基础案例
各个⽂件所在⽬录
通过HTTPServlet获取
ServletContext context = this.getServletContext();
获取⽂件的服务器路径
web⽬录下的资源访问
String realPath = context.getRealPath("/b.txt");
System.out.println(realPath);
web-INF⽬录下的资源访问
String a = Context.getRealPath("/web-INF/a.txt");
src⽬录下的资源访问
String a1 = context.getRealPath("/WEB-INF/classes/a.txt");
⽂件下载
1. 页⾯显⽰下载链接
2. 将对应的⽂件转换为字节流(Servlet)
1. 获取请求参数,⽂件名称
2. 找到⽂件服务器路径并使⽤字节流关联
3. 设置response响应头
1. 设置响应头类型 content-type (获取⽂件的mime类型)
2. 设置响应头-打开⽅式 content-disposition; attachment:附件⽂件名称:filename
4. 解决中⽂⽂件名问题
1. 获取user-agent请求头
2. 使⽤⼯具类⽅法编码⽂件名即可
5. 将输⼊的数据写出到输出流中
1. 字节数组作为缓冲区
<!-- 获取图⽚的链接并将⽂件的地址传⼊下⾯的Servlet中-->
<a href="/day15_response_war_exploded/downloadServlet?filename=数据库.jpg">图⽚</a>
<a href="/day15_response_war_exploded/downloadServlet?filename=1.3gp">视频</a>
/** ⽂件下载(显⽰⽂件下载提⽰)
* 1.获取请求参数,⽂件名称
* 2.使⽤字节码输⼊流加载⽂件进内存
* 3.设置response的响应头(3.1设置响应头类型 content-type和3.2设置响应头打开⽅式 content-disposition; attachment:附件⽂件名称:filename 4.解决中⽂⽂件名乱码问题(使⽤⼯具类))
* 5.将输⼊流的数据写出到输出流中
**/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数,⽂件名称
String filename = request.getParameter("filename");
//2.使⽤字节码输⼊流加载⽂件进内存
//2.1找到⽂件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2⽤字节流关联
FileInputStream fis = new FileInputStream(realPath);
// ⾄此已获得字节流⽂件 fis
//3.设置response的响应头将⽂件以什么形式下载
//3.1设置响应头类型 content-type
//获取⽂件的mime类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//3.2设置响应头打开⽅式 content-disposition; attachment:附件⽂件名称:filename
//4.解决中⽂⽂件名问题
//1.获取user-agent请求头包含浏览器信息
String agent = request.getHeader("user-agent");
//2.使⽤⼯具类⽅法编码⽂件名即可
filename = DownLoadUtils.getFileName(agent,filename);
response.setHeader("content-disposition","attachment;filename="+filename);
//5.将输⼊流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
//字节数组作为缓冲区
byte[] buffer = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(buffer)) != -1){
sos.write(buffer,0,len);
}
fis.close();
}
}
//⼯具类
//解决下载⽂档中⽂乱码的问题
// 主要是获取浏览器的名称,选择合适的编码⽅式
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// ⽕狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
验证码⽣成
设置时间戳 :
<script>
/* 《验证码》
* 分析:
* 点击超链接或者图⽚,需要换⼀张
* 1.给超链接和图⽚绑定单机事件
* 2.重定向设置图⽚的src属性
* */
window.onload = function() {
//1.获取对象图⽚
var img= document.getElementById("checkCode");
//2.绑定单机事件
img.onclick = function() {
//加时间戳
var date = new Date().getTime();
img.src = "/day15_response_war_exploded/checkCodeServlet?"+ date;
}
}
</script>
<img id="checkCode" src="/day15_response_war_exploded/checkCodeServlet" />
<a id="change" href="">看不清,换⼀张?</a>
创建验证码图⽚对象,设置背景颜⾊、画笔、画边框、获取随机字符、写验证码、画⼲扰线,将图⽚显⽰
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
//1.创建⼀对象,在内存中图⽚(验证码图⽚对象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图⽚
//2.1填充背景颜⾊
//画笔对象
Graphics g = image.getGraphics();
//设置画笔颜⾊
g.setColor(Color.pink);
//背景⾊
g.fillRect(0,0,width, height);
//2.2画边框 --> 四边形
g.setColor(Color.blue);
g.drawRect(0,0,width-1, height-1);
//2.3写验证码
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456879"; //⽣成随机⾓标
Random random = new Random();
for (int i = 1; i <=4; i++) {
int index = random.nextInt(str.length());
//获取随机字符
char c = str.charAt(index);
//2.3写验证码
g.drawString(c+"",width/5*i,height /2);
}
//2.4画⼲扰线
g.setColor(Color.yellow);
//随机⽣成坐标点
for (int i = 1; i <= 10; i++) {
int x1= random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//3.将图⽚显⽰到页⾯上
ImageIO.write(image,"jpg",response.getOutputStream());
}。