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) {
sce. getServletContext ( ) . setAttribute ( "count" , new HashMap < String , Integer > ( ) ) ;
}
}
1.3 配置监听器
< 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-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-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>
< dispatcher> REQUEST</ dispatcher>
< dispatcher> INCLUDE</ dispatcher>
< dispatcher> FORWARD</ dispatcher>
</ 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 ( ) ) ) ;
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 ( ) ) ) ;
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 > ( ) ;
ServletFileUpload upload= new ServletFileUpload ( new DiskFileItemFactory ( ) ) ;
List < FileItem > list;
try {
list = upload. parseRequest ( req) ;
} catch ( FileUploadException e) {
throw new RuntimeException ( e) ;
}
for ( FileItem fileItem : list) {
if ( fileItem. isFormField ( ) ) {
map. put ( fileItem. getFieldName ( ) , fileItem. getString ( "utf-8" ) ) ;
} else {
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) ;
}
}
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一二三四区六七八九十男女老少上下多少春夏秋冬东西南北张王李赵" ;
BufferedImage bin= new BufferedImage ( 200 , 40 , BufferedImage . TYPE_INT_RGB ) ;
Graphics2D g= bin. createGraphics ( ) ;
g. setColor ( Color . WHITE ) ;
g. fillRect ( 1 , 1 , 198 , 38 ) ;
String yzm= "" ;
for ( int i = 0 ; i < 4 ; i++ ) {
yzm+= str. charAt ( ( int ) ( Math . random ( ) * str. length ( ) ) ) ;
}
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 ) ) ;
}
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 ) {
req. setAttribute ( "message" , message) ;
req. getRequestDispatcher ( "/jsp/teacher/login.jsp" ) . forward ( req, resp) ;
return ;
}
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 {
req. setCharacterEncoding ( "UTF-8" ) ;
String fileName= req. getParameter ( "sphoto" ) ;
String type= req. getServletContext ( ) . getMimeType ( fileName) ;
resp. setHeader ( "Content-Type" , type) ;
resp. setHeader ( "Content-Disposition" , "attachment;filename=" + URLEncoder . encode ( "下载" + fileName, "utf-8" ) ) ;
String path= req. getServletContext ( ) . getRealPath ( "/imgs/" + fileName) ;
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 测试