现在的位置: 首页 > 综合 > 正文

Servlet实现计数器之ServletContext方法

2013年10月20日 ⁄ 综合 ⁄ 共 2689字 ⁄ 字号 评论关闭

昨天贴了一个实现计数器的方法,但显然每次用户登录时都去读写文件的方法是不明智的,效率不高,并发性也是问题。。。

于是乎,有了用ServletContext解决之的办法:

关于ServletContext:它是保存在服务器端,可以被所有用户访问的数据。

Cookie是保存在客户端的,Session是保存在服务器上的,但Session又不是多个客户端共用的。
因此,还需要提供一个多个客户端在服务器上的共享区。------ServletContext

它也是一张表,由名字和值构成。
1.得到ServletContext实例:
this.getServletContext();

2.添加属性:
setAttribute(String name,Object ob);
getAttribute(String name); return Object 

3.删除
removeAttribute(String name)

生命周期:从创建开始,到服务器关闭时结束。

示例:存放
public class StudyServletContext  extends HttpServlet{
@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
res.setContentType("text/html;charset=gbk");
PrintWriter pw = null;
try {
pw = res.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
ServletContext sc = this.getServletContext();
sc.setAttribute("myInfo", "他是顺平");
pw.println("给ServletContext赋值");
}
@Override
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}

读取:
public class StudyServletContext2  extends HttpServlet{
@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
PrintWriter pw = null;
res.setContentType("text/html;charset=gbk");
try {
pw = res.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
ServletContext sc = this.getServletContext();
String s = (String)sc.getAttribute("myInfo");
pw.println("得到ServletContext的值为:" + s);
}
@Override
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
再配置好web.xml,直接访问就可以了。
注意:由于它会长时间的保存在服务器,会占用内存,因此我们最好不要向ServletContext中添加过大数据。

好,然后说正题:计数的程序:

/**
 * 在Counter1中,用户每登录一次,就要操作一个文件,效率太低了
 *
 * 想到Servlet的生命周期,可以在init()方法中初始化servletcontext中属性times对应的值 
 * 中途就可以通过不断修改servletcontext就可以 了。
 * 在destroy方法中,一次性将context中的值写入文件中
 * 
 */
@Override
public void init(){
System.out.println("init is running..");

try{
FileReader fr = new FileReader("f:/counter.txt");
BufferedReader br = new BufferedReader(fr);
String tmp = br.readLine();
this.getServletContext().setAttribute("visitTimes", tmp);///后面是对象,把int转化 
br.close();
}catch(Exception e){
e.printStackTrace();
}
}

@Override
public void doGet(HttpServletRequest req,HttpServletResponse res){
String times = this.getServletContext().getAttribute("visitTimes").toString();
int iTimes = Integer.parseInt(times) + 1;
////////////对于int类型,没有toString方法,所以用 + ""
this.getServletContext().setAttribute("visitTimes", iTimes + "");
}

////destroy在服务器关闭时执行

     @Override
public void destroy(){
System.out.println("destroy....");
try{
FileWriter fw = new FileWriter("f:/counter.txt");
BufferedWriter bw = new BufferedWriter(fw);
String s = (String)this.getServletContext().getAttribute("visitTimes");
bw.write(s);
bw.close();
}catch(Exception e){
e.printStackTrace();
}
}

在页面上:

pw.println("该网页被访问了" + this.getServletContext ().getAttribute("vistiTimes").toString() + "次");

Servlet获得主机名和IP

System.out.println(req.getRemoteAddr());///获得ip
System.out.println(req.getRemoteHost());//获得主机名

抱歉!评论已关闭.