servletContext讲解:可以把它想像成一个共用的空间可以被使用:
使用servletContext:
1、如何得到servletContext实例,this.getServletContext();
2、你可以把它想像成一张表,这个和Session非常相似,每一行就是一个属性;
添加属性:setAttrubute(String name,object ob);
得到值:getAttribute(String name)返回object;
删除属性:removeAttribute(String name)
3、生命周期
servletContext中的属性的生命周期从创建开始,到服务器关闭面结束。
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class ServletContextTest1 extends HttpServlet{
//处理get请求
//req:用于获得客户端(浏览器)的信息
//res:用于向客户端(浏览器)返回信息
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res){
try
{
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
//1、得到servletContext
ServletContext sc=this.getServletContext();
//2、添加属性
sc.setAttribute("myInfo","我是顺平");
pw.println("给servlet context 中添加一个属性myInfo,该属性对应值是一个字符串我是顺平<br>");
//比较session
HttpSession hs=req.getSession(true);
hs.setAttribute("test","中国人");
hs.setMaxInactiveInterval(60*3);
pw.println("向Session中添加一个test属性他的值是中国人<br>");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
//演示如何在servlet中操作文件,演示如何读取文件的内容
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class ServletContextTest2 extends HttpServlet{
//处理get请求
//req:用于获得客户端(浏览器)的信息
//res:用于向客户端(浏览器)返回信息
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res){
try
{
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
//1、得到servletContext
ServletContext sc=this.getServletContext();
//得到属性和它的值
String info=(String)sc.getAttribute("myInfo");
pw.println("从servletContext中得到属性myinfo,它的对应值为我是顺平");
//比较session
HttpSession hs=req.getSession(true);
String val=(String)hs.getAttribute("test");
pw.println("session 中的test="+val+"<br>");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
2、servlet中操作文件:
因为servlet 本来就是一个java文件,因此servlet 中操作文件和普通java文件操作是一样的。
//演示如何在servlet中操作文件,演示如何读取文件的内容
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class ServletFileTest1 extends HttpServlet{
//处理get请求
//req:用于获得客户端(浏览器)的信息
//res:用于向客户端(浏览器)返回信息
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res){
try
{
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
//创建一个FileReader
FileReader f=new FileReader("f:\\myCounter.txt");
//把FileReader 转换成BufferedReader
BufferedReader bw=new BufferedReader(f);
//读出一行数据
String numval=bw.readLine();
bw.close();
pw.println("从文件中读取的数据是:"+numval);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
//演示如何在servlet中操作文件,演示如何写入文件的内容
package com.tsinghua;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class ServletFileTest2 extends HttpServlet{
//处理get请求
//req:用于获得客户端(浏览器)的信息
//res:用于向客户端(浏览器)返回信息
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res){
try
{
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
//创建一个Filewriter看内存数据-->磁盘文件(写入,输出)
//看内存数据<--磁盘文件(读入,输入)
FileWriter f=new FileWriter("f:\\myCounter1.txt");
//FileReader f=new FileReader("f:\\myCounter.txt");
BufferedWriter bw=new BufferedWriter(f);
//BufferedReader bw=new BufferedReader(f);
//在文件中写入数据
bw.write("123");
//关闭文件流
bw.close();
pw.println("在文件中写入数据!");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
3、网站计数器
在网站建设中经常会统计某个网页被点击(浏览次数)把这个功能 叫做计数器
网站计数器是针对所有用户的,因此我们的实现方法有以下方案:
1、当某个用户访问该网页时,就在数据库中增一次
2、使用servletContext当服务器启动时可以通过文件计数
//登录控制文件的servlet
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
Connection ct = null;
ResultSet rs = null;
Statement sm = null;
try{
//服务器接收login页面发来的用户名和密码,要用到req。
String u = req.getParameter("username");//此处填写组件名
String p = req.getParameter("passwd");//此处填写组件名
//调用UserBeanCl (1)创建一个对象
UserBeanCl ubc=new UserBeanCl();
//(2)使用UserBeanCl的方法
if(ubc.checkUser(u,p)){
System.out.println("用户合法");
//合法用户
String keep=req.getParameter("keep");
if(keep!=null){
//1将用户名和密码保存在客户端(cookie)
//创建
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);
}
HttpSession hs = req.getSession(true);
hs.setMaxInactiveInterval(20);
hs.setAttribute("pass","ok");
//连接登录后的欢迎界面
//sendRedirect的作用是跳转界面
//3\==============添加网页访问次数的功能=============
//这是从文件中读取数据
//创建一个FileReader
FileReader f=new FileReader("f:\\myCounter.txt");
//把FileReader 转换成BufferedReader
BufferedReader br=new BufferedReader(f);
//读出一行数据
String numval=br.readLine();
br.close();
//将读取的数字转换成int型
int times=Integer.parseInt(numval);
//增加一次
times++;
// 这是将新的次数写回去
//创建一个Filewriter看内存数据-->磁盘文件(写入,输出)
//看内存数据<--磁盘文件(读入,输入)
FileWriter fw=new FileWriter("f:\\myCounter.txt");
BufferedWriter bw=new BufferedWriter(fw);
//在文件中写入数据
bw.write(times+"");
//关闭文件流
bw.close();
res.sendRedirect("wel?username="+u+"&passwd="+p);//该处填写域名
}
else
{//返回登录页面
res.sendRedirect("login");//该处填写域名
}
}
catch(Exception ex){
ex.printStackTrace();
}
finally
{
try
{
if(rs!=null)
{
rs.close();
}
if(sm!=null)
{
sm.close();
}
if(ct!=null)
{
ct.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
}
//欢迎界面
//登录界面
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import java.util.*;
public class Wel extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
//业务逻辑
Connection ct=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
//得到session防止非法登录
HttpSession hs = req.getSession(true);
String myname = (String)hs.getAttribute("pass");
String u = req.getParameter("username");
String p = req.getParameter("passwd");
//1、================//读取Cookie==================
String name="";
String passwd="";
if(myname == null)
{
//如果session中没有用户信息,再看看有没有cookie信息
//从客户端得到所有的Cookie
Cookie [] allCookies=req.getCookies();
int i=0;
//如果allCookies不为空……
if(allCookies!=null){
//从中取出Cookie
for(i=0;i<allCookies.length;i++){
//依次取出Cookie
Cookie temp=allCookies[i];
if(temp.getName().equals("myname")){
//得到Cookie的值
name=temp.getValue();
}
else if(temp.getName().equals("mypasswd")){
passwd=temp.getValue();
}
}
if(name.equals("")&&!passwd.equals("")){
//到loginCl中验证
res.sendRedirect("logincl?username="+name+"&passwd="+passwd);
return;
}
}
//返回登录界面
res.sendRedirect("login?info=error1");
return;
}
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
pw.println("<body><center>");
//显示图片
pw.println("<img src=imgs/2.jpg ><br>");
pw.println("wellcome! "+u+" your password="+p);
pw.println("你的用户名是:"+u);
//3\=========添加网页访问次数的功能============
//这是从文件中读取数据
//创建一个FileReader
FileReader f=new FileReader("f:\\myCounter.txt");
//把FileReader 转换成BufferedReader
BufferedReader br=new BufferedReader(f);
//读出一行数据
String numval=br.readLine();
br.close();
//=========分页功能===============
int pageSize=3;//一页显示几条记录
int pageNow=1;//希望显示第几页
//动态的接收pageNow
String sPageNow=req.getParameter("pageNowok");
if(sPageNow!=null){
pageNow=Integer.parseInt(sPageNow);
}
//调用userBeancl
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getResultByPage(pageNow,pageSize);
//设置表头
pw.println("<table border=1>");
pw.println("<tr><th>id</th><th>name</th><th>passwd</th><th>mail</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.getMail()+"</td>");
pw.println("<td>"+ub.getGrade()+"</td>");
pw.println("</tr>");
}
pw.println("</table>");
//做个超链接
pw.println("<br><a href=login>返回重新登陆</a></br>");
//上一页
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("该网页被访问了"+numval+"次");
pw.println("</center></body>");
}
catch(Exception ex){
ex.printStackTrace();
}
}
}