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());

}
原文地址:https://www.cnblogs.com/lihaijia/p/14406440.html