11_upload_download练习

1 修改jsp项目 实现每个页面访问量统计

1.1 分析

获取每次请求的url 判断url是不是.jsp结尾 是就统计::map
map是application域属性
map创建给application生死监听器:::项目一启动map就存在
map数据统计::放在过滤器中

1.2 创建servletcontext的生死监听器 初始化map

package com.zhiyou100.listener;

import java.util.HashMap;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ApplicationLifeListener   implements ServletContextListener{

	

	public void contextInitialized(ServletContextEvent sce) {
		  //项目启动执行的方法:在application域中创建一个map统计每个jsp的访问量
		  sce.getServletContext().setAttribute("count", new HashMap<String, Integer>());
	}

}

1.3 配置监听器

<!-- 配置application的生死监听器 -->
<listener>
    <listener-class>com.zhiyou100.listener.ApplicationLifeListener</listener-class>
</listener>

1.4 创建过滤器 过滤所有的jsp的请求

package com.zhiyou100.filer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class RequestCountFilter  implements Filter{

	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		  HttpServletRequest req=(HttpServletRequest)arg0;
		  String path=req.getServletPath();
		  System.out.println("请求的路径是:"+path); 
		  HashMap<String, Integer> count=(HashMap<String, Integer>)req.getServletContext().getAttribute("count");
		  count.put(path, count.get(path)==null?1:(count.get(path)+1));
		  arg2.doFilter(req, arg1);//放行
	}	
}

1.5 配置过滤器

  <!-- 配置filter -->
  <filter>
     <filter-name>countFilter</filter-name>
     <filter-class>com.zhiyou100.filer.RequestCountFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>countFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

1.6 统计页面的数据展示:count.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">
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示每个页面的访问量</title>
</head>
<body>
    <!-- 展示application中map的值 -->
    <c:forEach items="${applicationScope.count}" var="entity">
         ${entity.key}:::访问的次数是:::${entity.value}<br/>
    </c:forEach>
</body>
</html>

1.7 测试

只有当客户端请求的url是xxx.jsp时  过滤器才拦截
如果是请求转发/请求包含到xxx.jsp 不拦截 不合理
  • 对过滤器的配置进行修改
<!-- 配置filter -->
<filter>
    <filter-name>countFilter</filter-name>
    <filter-class>com.zhiyou100.filer.RequestCountFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>countFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
    <dispatcher>ERROR</dispatcher>  <!-- 如果是出错跳转到jsp 拦截 -->
    <dispatcher>REQUEST</dispatcher><!-- 如果是直接请求jsp 拦截 -->
    <dispatcher>INCLUDE</dispatcher><!-- 如果是请求包含到jsp 拦截 -->
    <dispatcher>FORWARD</dispatcher><!-- 如果是请求转发到jsp 拦截 -->
</filter-mapping>

2 修改jsp项目实现学生头像的文件上传

2.1 修改数据库 添加列sphoto

ALTER TABLE student ADD sphoto VARCHAR(100) DEFAULT '1.jpeg';

2.2 创建文件夹imgs 添加文件1.jpeg

在这里插入图片描述

2.3 修改student实体类 添加属性sphoto

public class Student implements Serializable {
	private  Integer sid;
	private String sname;
	private String sex;
	private Float score;
	private Date sbirth;
	private Boolean sdy;
	private String sphoto;
    ...
    public String getSphoto() {
		return sphoto;
	}
	public void setSphoto(String sphoto) {
		this.sphoto = sphoto;
	}
}

2.4 更改studentDao

增改查的时候加上sphoto列
package com.zhiyou100.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.zhiyou100.entity.Student;
import com.zhiyou100.util.JdbcUtil;

public class StudentDao {
	// 获取一个
	public Student getOneBySid(int sid) {
		Connection con = JdbcUtil.getCon();
		PreparedStatement pre = null;
		ResultSet set = null;
		Student stu = null;
		try {
			pre = con.prepareStatement("select * from student where sid=?");
			pre.setInt(1, sid);
			set = pre.executeQuery();
			if (set.next()) {
				stu = new Student(set.getInt("sid"), set.getString("sname"), set.getString("sex"),
						set.getFloat("score"), set.getDate("sbirth"), set.getBoolean("sdy"), set.getString("sphoto"));
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		JdbcUtil.close(con, pre, set);
		return stu;
	}

	// 删除一个
	public int deleteOne(int sid) {
		Connection con = JdbcUtil.getCon();
		PreparedStatement pre = null;
		int hang = 0;
		try {
			pre = con.prepareStatement("delete from student where sid=?");
			pre.setInt(1, sid);
			hang = pre.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		JdbcUtil.close(con, pre, null);
		return hang;
	}

	// 添加一个
	public int addOne(Student stu) {
		Connection con = JdbcUtil.getCon();
		PreparedStatement pre = null;
		int hang = 0;
		try {
			pre = con.prepareStatement("insert into student(sname,sex,score,sbirth,sdy,sphoto) values(?,?,?,?,?,?)");
			pre.setString(1, stu.getSname());
			pre.setString(2, stu.getSex());
			pre.setFloat(3, stu.getScore());
			pre.setDate(4, new java.sql.Date(stu.getSbirth().getTime()));// 把java.util.Date转化为java.sql.Date
			pre.setBoolean(5, stu.getSdy());
			pre.setString(6, stu.getSphoto());
			hang = pre.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		JdbcUtil.close(con, pre, null);
		return hang;
	}

	// 修改一个
	public int updateOne(Student stu) {
		Connection con = JdbcUtil.getCon();
		PreparedStatement pre = null;
		int hang = 0;
		try {
			pre = con.prepareStatement("update student set sname=?,sex=?,score=?,sbirth=?,sdy=?,sphoto=? where sid=?");
			pre.setString(1, stu.getSname());
			pre.setString(2, stu.getSex());
			pre.setFloat(3, stu.getScore());
			pre.setDate(4, new java.sql.Date(stu.getSbirth().getTime()));// 把java.util.Date转化为java.sql.Date
			pre.setBoolean(5, stu.getSdy());
			pre.setString(6, stu.getSphoto());
			pre.setInt(6, stu.getSid());
			hang = pre.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		JdbcUtil.close(con, pre, null);
		return hang;
	}

	// 获取所有
	public List<Student> getAll() {
		Connection con = JdbcUtil.getCon();
		PreparedStatement pre = null;
		ResultSet set = null;
		List<Student> list = new ArrayList<Student>();
		try {
			pre = con.prepareStatement("select * from student");
			set = pre.executeQuery();
			while (set.next()) {
				list.add(new Student(set.getInt("sid"), set.getString("sname"), set.getString("sex"),
						set.getFloat("score"), set.getDate("sbirth"), set.getBoolean("sdy"), set.getString("sphoto")));
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		JdbcUtil.close(con, pre, set);
		return list;
	}

}

2.5 更改jsp页面:manager.jsp

<table id="tab_student_list">
    <tr><th>学号</th><th>名字</th><th>性别</th><th>分数</th><th>生日</th><th>政治</th><th>头像</th><th>操作</th></tr>    
    <c:forEach  items="${requestScope.studentList}" var="stu">
        <tr>
            ...
            <td><img src="<c:url value='/imgs/${stu.sphoto}'/>"/></td>
            ...
        </tr>
    </c:forEach>
    ...
</table>
  • 样式
img{
   width:100px;
   height:100px;
}
  • 效果
    在这里插入图片描述

2.6 导入文件上传依赖的jar

在这里插入图片描述

2.7 修改添加页面:addOne.jsp

<form method="post" action="<c:url value='/student/add.do'/>" enctype="multipart/form-data">
    <table id="tab_student_add">
       ...
        <tr>
            <th>学生头像:</th>
            <td>
                <input type="file" name="sphotoImg"/>
            </td>
        </tr>
        ...
    </table>
</form>

2.8 修改addOne.do

package com.zhiyou100.servlet;
...

public class StudentAdd extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 获取请求参数
		req.setCharacterEncoding("UTF-8");
		Student student = new Student();
		Map<String, String> map=new HashMap<String, String>();//定义一个map 记录从文件上传的部件中获取的信息
		ServletFileUpload  upload=new ServletFileUpload(new DiskFileItemFactory());
		List<FileItem> list;
		try {
			list = upload.parseRequest(req);
		} catch (FileUploadException e) {
			throw new RuntimeException(e);
		}//解析req 获取组件对应的list
		for (FileItem fileItem : list) {
			if(fileItem.isFormField()){//普通组件
				map.put(fileItem.getFieldName(), fileItem.getString("utf-8"));
			}else{//文件域
				//把文件上传到imgs文件夹下
				String fileName=fileItem.getName();
				fileName=System.currentTimeMillis()+"_"+fileName;
				File muDi=new File(req.getServletContext().getRealPath("/imgs"), fileName);
				System.out.println(muDi.getAbsolutePath());
				FileOutputStream fout=new FileOutputStream(muDi);
				IOUtils.copy(fileItem.getInputStream(), fout);
				fout.close();
				map.put("sphoto", fileName);
			}
		}
		//把map中的信息装入student
		student.setSname(map.get("sname"));
		student.setScore(Float.parseFloat(map.get("score")));
		student.setSex(map.get("sex"));
		student.setSdy(Boolean.parseBoolean(map.get("sdy")));
		student.setSbirth(DateStrUtil.str2Date(map.get("sbirth")));
		student.setSphoto(map.get("sphoto"));
		// 调用数据库
		new StudentDao().addOne(student);
		 //删除成功 设置域属性 并再次回到管理页面
		req.setAttribute("message", "添加("+student.getSname()+")成功!");
		req.getRequestDispatcher("/jsp/student/manager.jsp").forward(req, resp);
		return;
	}
    ...
}

2.9 测试成功

在这里插入图片描述

  • 注意
如果添加学生1后  重启eclipse下的tomcat 发现1的头像 无法显示???为什么
因为新添加的头像文件保存在tomcat的imgs下 而不是保存在eclipse的imgs下 重启tomcat tomcat的以前的文件就删除了 重启后的文件和eclipse的内容一致

3 老师登录添加验证码

3.1 修改登录表单

<form method="post" action="<c:url value='/teacher/login.do'/>">
    <table id="tab_login">
        ...
        <tr>
            <th><img src="<c:url value='/teacher/yzm.do'/>" id="img_yzm"/></th>
            <td><input type="text" name="tyzm" value="123456"/></td>
        </tr>
        ...
    </table>
</form>
<script type="text/javascript">
    window.οnlοad=function(){
        document.getElementById("img_yzm").οnclick=function(){
            this.src="<c:url value='/teacher/yzm.do?n='/>"+Math.random();
        }
    }
</script>

3.2 创建生成验证码的servlet:/teacher/yzm.do

package com.zhiyou100.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

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 TeacherYzm extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str="123456789一二三四区六七八九十男女老少上下多少春夏秋冬东西南北张王李赵";
        //通过java生成一个验证码:步骤和画画完全相同
        //1 准备画布
        BufferedImage bin=new BufferedImage(200, 40, BufferedImage.TYPE_INT_RGB);//在内存中开辟空间画画
        //2 准备画笔
        Graphics2D g=bin.createGraphics();
        //3 蘸墨水 画背景
        g.setColor(Color.WHITE);
        g.fillRect(1, 1, 198, 38);
        //4 蘸墨水 写字符
        String yzm="";
        for (int i = 0; i < 4; i++) {
            yzm+=str.charAt((int)(Math.random()*str.length()));
        }
        //把验证码放入session域中  登录时可以获取并判断验证码是否正确
        req.getSession().setAttribute("sessionYzm", yzm);
        //设置字体
        g.setFont(new Font(null, Font.BOLD, 30));//第一个参数字体类型 第二个参数加粗/斜体 第三个参数字体大小
        for (int i = 0; i < yzm.length(); i++) {
            //每个字符不同的颜色
            g.setColor(new Color(100+(int)(Math.random()*150), 50+(int)(Math.random()*200), 150+(int)(Math.random()*100)));
            //画字符
            g.drawString(yzm.charAt(i)+"", 10+i*45, 34);
        }
        //添加一些干扰线
        for (int i = 0; i < (int)(Math.random()*10)+5; i++) {
            //每个字符不同的颜色
            g.setColor(new Color(200+(int)(Math.random()*50), 200+(int)(Math.random()*50), 150+(int)(Math.random()*100)));
            //画线
            g.drawLine(1, (int)(Math.random()*40), 200, (int)(Math.random()*40));
        }
        //5把内存缓冲区中的图片的信息通过response的输出流 响应给客户端
        ImageIO.write(bin, "JPEG", resp.getOutputStream());
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.3 修改登录derservlet:/teacher/login.do

package com.zhiyou100.servlet;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zhiyou100.dao.TeacherDao;
import com.zhiyou100.entity.Teacher;

public class TeacherLogin extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		  //获取请求参数
		  req.setCharacterEncoding("UTF-8");
		  String tname=req.getParameter("tname");
		  String tpwd=req.getParameter("tpwd");
		  String tyzm=req.getParameter("tyzm");
		//判断登录是否成功
		  String message=null;//定义引用记录错误信息
		  Teacher dbTeacher=null;
		  if(!tyzm.equals("1234")&&!tyzm.equals(req.getSession().getAttribute("sessionYzm"))){
			  //验证码错误
			  message="验证码错误!";
		  }else{
			  //访问数据库
			  TeacherDao teacherDao=new TeacherDao();
			  dbTeacher=teacherDao.getOneByTname(tname);
			  
			  if(dbTeacher==null){
				  //账号错误
				  message="用户名("+tname+")错误!";
			  }else if(!dbTeacher.getTpwd().equals(tpwd)){
				  //密码错误
				  message="密码错误!";
			  }
		  }
		  
		  if(message!=null){
			  //登录失败 回到登录页面
			  //一般情况下:jsp到jsp 请求包含::两个资源共同拼凑页面
			  // servlet到jsp::请求转发/重定向
			  //  请求转发是一次请求 可以使用request域对象
			  //  重定向是两次请求  不能使用request域对象
			  
			  //设置域属性
			  req.setAttribute("message", message);
			  req.getRequestDispatcher("/jsp/teacher/login.jsp").forward(req, resp);
			  return;
			  
		  }
		  //登录成功:跳转到学生管理页面 来展示所有学生的信息
		  //对登陆者的信息进行保存:使用session域
		  req.getSession().setAttribute("teacher", dbTeacher);
		  resp.sendRedirect("/java43_project_jsp_01/jsp/student/manager.jsp");
		  
	}
    ....
}

3.4 测试

在这里插入图片描述

4 点击学生头像 实现文件下载

4.1 修改manager.jsp

<table id="tab_student_list">
    <tr><th>学号</th><th>名字</th><th>性别</th><th>分数</th><th>生日</th><th>政治</th><th>头像</th><th>操作</th></tr>
    <c:forEach  items="${requestScope.studentList}" var="stu">
        <tr>
            ...
            <td><img src="<c:url value='/imgs/${stu.sphoto}'/>"  οnclick="downloadImg('${stu.sphoto}')"/></td>
            ...
        </tr>
    </c:forEach>
    <tr><th colspan="7"><a href="<c:url value='/'/>jsp/student/addOne.jsp">添加学生</a></th></tr>
</table>
<script type="text/javascript">
    function downloadImg(imgName){
        //请求servlet即可
        location.href="<c:url value='/student/downlaodSphoto.do?sphoto='/>"+imgName;
    }
</script>

4.2 创建servlet: 图片下载:/student/downlaodSphoto.do

package com.zhiyou100.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

public class StudentDownloadSphoto extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		 //获取请求参数?fileName
		   req.setCharacterEncoding("UTF-8");
		   String fileName=req.getParameter("sphoto");
		   //获取文件的大类型
		   String type=req.getServletContext().getMimeType(fileName);
		   //设置两个响应头之一Content-Type 指定响应的文件的类型:
		   resp.setHeader("Content-Type", type);
		   //设置两个响应头之一Content-Disposition 指定响应的文件以附件形式下载:
		   resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("下载"+fileName, "utf-8"));
		   
		   //获取imgs的真实路径
		   String path=req.getServletContext().getRealPath("/imgs/"+fileName);
		   //使用流读取源文件 通过response的输出流写出去
		   FileInputStream fin=new FileInputStream(path);
		   OutputStream out=resp.getOutputStream();
		   IOUtils.copy(fin, out);
		   fin.close();
	}

	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

4.3 测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值