(一)ServletContext的讲解和使用
(二)servlet中如何操作文件
(三)增加网站计数器

(一)ServletContext的讲解和使用

什么是ServletContext

可以理解成一个公用的空间,可以被所有的客户访问。

怎么使用ServletContext
1.得打实例
2.得到属性
3.生命周期

//向ServletContext中添加属性
package com.tingwei;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;public class ServletContextTest1 extends HttpServlet {public void doGet(HttpServletRequest req,HttpServletResponse res){//业务逻辑try {//中文乱码处理res.setContentType("text/html;charset=gbk");PrintWriter pw=res.getWriter();//1.得到servletContextServletContext sc=this.getServletContext();//2.添加属性sc.setAttribute("myInfo", "My name is Tom");pw.println("给servlet context中添加一个属性 myInfo,属性对应的值是  My name is Tom");//与session比较,区别在于打开另外一个浏览器得不到session中的属性HttpSession hs=req.getSession(true);hs.setAttribute("test","are you ok?");hs.setMaxInactiveInterval(3*60);pw.println("<br>向session中添加一个test属性,其值为 are you ok?");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}
}
//从ServletContext中得到属性
package com.tingwei;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;public class ServletContextTest2 extends HttpServlet {public void doGet(HttpServletRequest req,HttpServletResponse res){//业务逻辑try {//中文乱码处理res.setContentType("text/html;charset=gbk");PrintWriter pw=res.getWriter();//1.得到servletContextServletContext sc=this.getServletContext();//2.得到属性String info=(String)sc.getAttribute("myInfo");pw.println("得到servlet context一个属性 myInfo,其值为  "+info);//比较sessionHttpSession hs=req.getSession(true);String val=(String)hs.getAttribute("test");pw.println("<br>session 中的test="+val+"<br>");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}
}

(二)servlet中操作文件

//演示如何在servlet中操作文件
//演示如何读取文件
package com.tingwei;
import java.io.*;import javax.servlet.http.*;public class ServletFileTest1 extends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){try {//中文乱码处理res.setContentType("text/html;charset=gbk");PrintWriter pw=res.getWriter();FileReader f=new FileReader("f:\\myCounter.txt");BufferedReader br=new BufferedReader(f);String numVal=br.readLine();//读出一行数据br.close();//读完记得关闭pw.println("从文件中读取的数据是: "+numVal);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}
}
//演示如何在servlet中操作文件
//演示如何向磁盘写文件
package com.tingwei;
import java.io.*;import javax.servlet.http.*;public class ServletFileTest2 extends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){try {//中文乱码处理res.setContentType("text/html;charset=gbk");PrintWriter pw=res.getWriter();FileWriter f=new FileWriter("f:\\myCounter.txt");BufferedWriter bw=new BufferedWriter(f);//在文件中写入数据bw.write("123");bw.close();//读完记得关闭,最好在finally关闭pw.println("在文件中写入了数据");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}
}

ServletContext的用处
1.网站计数器
2.网站在线用户的显示
3.简单的在线聊天系统

总之涉及到不同用户共享数据,而这些数据量不大,同时又不希望写入数据库,可以考虑使用ServletContext来实现

网站计数器
什么是计数器
在网站建设中,经常会统计某个网页点击量,我们把这个功能叫做计数器
怎么实现呢?

可以根据刷新次数,也可以根据登录次数,或者ip来决定访问次数,但要避免频繁的操作文件,操作数据库。

package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){try {//中文乱码处理res.setContentType("text/html;charset=gbk");PrintWriter pw=res.getWriter();//返回登录界面pw.println("<html>");pw.println("<body>");pw.println("<img src=imgs/image2.jpg width=200><br>");pw.println("<h>登录界面</h>");pw.println("<form action=logincl method=post>");pw.println("用户名:<input type=text name=username><br>");pw.println("密码:<input type=password name=passwd><br>");pw.println("<input type=checkbox name=keep value=2>两周内不在重新登录<br>");pw.println("<input type=submit value=login><br>");pw.println("</form>");pw.println("</body>");pw.println("</html>");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public void doPost(HttpServletRequest req,HttpServletResponse res){this.doGet(req, res);}
}
//用户验证Servlet
package com.tingwei;
import javax.servlet.http.*;import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){ //业务逻辑try {//接收用户名和密码String u=req.getParameter("username");String p=req.getParameter("passwd");//调用UserBeanCl,1.创建对象,2.使用方法UserBeanCl ubc=new UserBeanCl();//验证if(ubc.checkUser(u, p)){//合法用户String keep=req.getParameter("keep");//将用户名和密码保存在客户端cookieif(keep!=null){Cookie name=new Cookie("myname",u);Cookie pass=new Cookie("mypasswd",p);//设置时间name.setMaxAge(14*24*3600);pass.setMaxAge(14*24*3600);//回写到客户端res.addCookie(name);res.addCookie(pass);}//将验证成功的信息写入sessionHttpSession hs=req.getSession(true);//修改session的存在时间 单位shs.setMaxInactiveInterval(30);hs.setAttribute("uname", u);//创建一个FileReaderFileReader fr=new FileReader("f:\\myCounter.txt");BufferedReader br=new BufferedReader(fr);String numVal=br.readLine();br.close();int times=Integer.parseInt(numVal);times++;FileWriter fw=new FileWriter("f:\\myCounter.txt");BufferedWriter bw=new BufferedWriter(fw);bw.write(times+"");bw.close();res.sendRedirect("wel");}else{//不合法,跳转到Loginres.sendRedirect("login");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public void doPost(HttpServletRequest req,HttpServletResponse res){this.doGet(req, res);}
}
package com.tingwei;
import javax.servlet.http.*;import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class Wel extends HttpServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){//得到sessionHttpSession hs=req.getSession();String myName=(String)hs.getAttribute("uname");String name="";String password="";PrintWriter pw=null;Connection ct=null;PreparedStatement ps=null;ResultSet rs=null;String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb";String user="sa";String passwd="tingwei";String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";try {//判断if(myName==null){//如果session中没有用户信息,再看看cookie中有没有Cookie [] allCookies=req.getCookies();int i=0;//如果allCookies不为空if(allCookies!=null){//从中取出cookiefor(i=0;i<allCookies.length;i++){//依次取出Cookie tmp=allCookies[i];if(tmp.getName().equals("myname")){//得到cookie信息name=tmp.getValue();}else if(tmp.getName().equals("pass")){password=tmp.getValue();}}//forif(!name.equals("")&&!password.equals("")){res.sendRedirect("logincl?username="+name+"&passwd="+password);}}//if cookie//返回登录界面res.sendRedirect("login?info=error1");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}//===分页的功能===int pageSize=3;int pageNow=1;//希望显示第几条记录//动态的接收pageNowString sPageNow=req.getParameter("pageNowOk");if(sPageNow!=null){//用户首次进入wel页面pageNow=Integer.parseInt(sPageNow);}//调用UserBeanClUserBeanCl ubc=new UserBeanCl();ArrayList al=ubc.getResultByPage(pageNow, pageSize);//得到从logincl传递的用户名String u=req.getParameter("uname");//得到从logincl传递的密码String p=req.getParameter("upass");try {//中文乱码处理res.setContentType("text/html;charset=gbk");pw=res.getWriter();    pw.println("<body><center>");pw.println("<img src=imgs/image2.jpg width=200><br>");pw.println("welcome,hello "+u+" pass="+p);pw.println("<br><a href=login>返回重新登录</a>");//添加网页访问次数功能//创建一个FileReaderFileReader fr=new FileReader("f:\\myCounter.txt");BufferedReader br=new BufferedReader(fr);String numVal=br.readLine();br.close();pw.println("<table border=1");pw.println("<tr><th>id</th><th>name</th><th>passwd</th><th>email</th><th>grade</th></tr>");for(int i=0;i<al.size();i++){UserBean ub=(UserBean)al.get(i);pw.println("<tr>");pw.println("<td>"+ub.getUserId()+"</td>");pw.println("<td>"+ub.getUserName()+"</td>");pw.println("<td>"+ub.getPasswd()+"</td>");pw.println("<td>"+ub.getMial()+"</td>");pw.println("<td>"+ub.getGrade()+"</td>");pw.println("</tr>");}pw.println("</table>");if(pageNow!=1)//上一页pw.println("<a href=wel?pageNowOk="+(pageNow-1)+">上一页</a>");//显示超链接for(int i=pageNow;i<=pageNow+4;i++){pw.println("<a href=wel?pageNowOk="+i+">"+i+"</a>");}int pageCount=ubc.getPageCount();//下一页if(pageNow!=pageCount)pw.println("<a href=wel?pageNowOk="+(pageNow+1)+">下一页</a>");pw.println("<br>该网页被访问了"+numVal+"次");pw.println("</center></body>");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public void doPost(HttpServletRequest req,HttpServletResponse res){this.doGet(req, res);}
}

实现网站计数器(2)

进一步减少对文件的操作,回忆servlet的生命周期,可以在init()方法初始化servletcontext对应的初始值
可以在destroy()方法中,一次性将servletcontext中属性times对应的值写入文件中,呵呵,这样就可以减少对文件的操作次数
显示访问网站用户的ip,主机信息等

Servlet教程第6讲笔记相关推荐

  1. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  2. react render没更新_web前端教程分享React学习笔记(一)

    web前端教程分享React学习笔记(一),React的起源和发展:React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写 ...

  3. 信息系统项目管理师教程考点精讲之项目成本管理

    希赛小编为大家整理了几篇信息系统项目管理师教程考点精讲,以下是有关第八章项目成本管理的内容. 可控和不可控的成本应该分别估算和预算. 在某些项目上,特别是小型项目,成本估算和预算可被视为一个过程.项目 ...

  4. Python编程系列教程第12讲——属性和方法

    视频地址:http://v.youku.com/v_show/id_XNTgyOTg4NjQ4.html 普及网络安全知识,推动信息技术发展. 为祖国的网络安全撑起一片蓝天,为网络安全爱好者构建一方家 ...

  5. Python编程系列教程第16讲——拷贝自身到系统目录

    分享知识,分享快乐,收获友谊,收获财富! 大家好,我是数字雨,QQ:798033502 http://itbook.taobao.com/ 今天给大家带来的教程是<Python编程系列教程第16 ...

  6. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  7. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  8. 深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器

     深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器 UFLDL即(unsupervised feature learning & deep learning).这是斯坦福网站上的一篇 ...

  9. 视觉SLAM总结——视觉SLAM十四讲笔记整理

    视觉SLAM总结--视觉SLAM十四讲笔记整理 说明 基础知识点 1. 特征提取.特征匹配 (1)Harris (2)SIFT (3)SUFT (4)ORB (5)特征匹配 2. 2D-2D:对极约束 ...

  10. python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...

    变量进阶(理解) - 黑马程序员<Python入门教程完整版>笔记 目标变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用变量 和 数据 都是保存在 内存 中的 在 Py ...

最新文章

  1. Linux IP怎么设置
  2. Leaflet中通过setStyle实现图形样式编辑
  3. shell脚本小技巧
  4. 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
  5. java 递归从子节点删除父节点_LeetCode450. 删除二叉搜索树中的节点
  6. cdn节点人少延迟高_如何正确配置CDN高速缓存,避免越用越慢的尴尬
  7. (pytorch-深度学习系列)pytorch实现线性回归
  8. 为什么有些女孩在发现渣男的真面目以后,还喜欢他们?
  9. pg数据库 设置不区分大小写_pg数据库表名、字段名大小写问题
  10. 看故事也能长知识,CPU的工作原理原来这么简单!
  11. 计算机的算数逻辑单元控制单元统称为,算术控制单元
  12. C#编程,byte 与 int 相互转换
  13. 搜索进阶-迭代加深搜索
  14. linux下xz格式,linux下 x.tar.xz格式文件的解压方法
  15. 什么叫冷备用状态_什么是热备用状态?
  16. 少儿编程c语言 难度,c语言很难学吗
  17. 云服务器BBC销售渠道,云服务器bbc
  18. 图像处理方向常用网站
  19. 阿里云团队畅谈图片服务架构演进
  20. [附源码]Java计算机毕业设计SSM菜鸟驿站快递分发系统

热门文章

  1. 全面综合的管理平台,让所有网络都有管理员
  2. 概率论:集合、假设检验、分布、矩阵、估计
  3. python有关数据结构问题
  4. mongodb 启动 WARNING: soft rlimits too low, transparent_hugepage/enabled is 'always'. never
  5. Confluence 6 PostgreSQL 输入你的数据库细节
  6. EasyAndroid基础集成组件库之:EasyReflect 优雅的反射功能库
  7. Spark Mllib里数据集如何取前M行(图文详解)
  8. easyui missingMessage
  9. 修改表结构的执行效率
  10. cocos2d Labels and Fonts 标签和字体