这里要明确的是,每一个web应用,拥有一个唯一的ServletContext,当应用启动时创建,当应用关闭时销毁。
ServletContext可用于在同一个Web项目中,共享资源。
一、网页点击量
这里主要就是使用到了一个getServletContext()的方法来新建一个ServletContext的对象,该对象里面有一个count属性,就是用来记录访问量的,我们要获取这个属性,并且赋值,修改值
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ContextServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
ServletContext context=getServletContext();
Integer count = (Integer) context.getAttribute("count");
if (count==null){
count=1;
} else {
count++;
}
getServletContext().setAttribute("count", count);
out.println("网站访问量:"+getServletContext().getAttribute("count"));
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
我们可以写两个相同的,改下名字就就好,在index.jsp中为另一个Servlet再写一个链接,然后到网页中去分别访问这两个,你会发现访问次数不会被清空,而且两边是捆绑的。原因就在于tomcat服务器没有关闭的,关了之后会清空,若不想清空,你可以将访问次数保存到文件中去。Servlet其实相当于是一个单例。
二、留言板
留言板其实还是使用到了getServletContext()方法,getServletContext()就是获取一个ServletContext对象,然后获取其中的一个属性值名为msgs,就是他目前所包含的信息。
这里要注意的是记得要获取留言者的ip地址,这个是必要的一步,以后做项目也必须要这样做,获取ip地址的方法是String ip=request.getRemoteAddr();。
这里我们还使用了getServletContext()方法获取对象使用getInitParameter()去web.xml中获取其中的全局参数
web.xml中加上这一句,与里面的servlet标签要是兄弟关系,不是包含关系
<span style="font-size:14px;"><context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param></span>
具体的代码如下:
<span style="font-size:14px;">package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.org.apache.bcel.internal.generic.SIPUSH;
public class ChatServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
//显示留言板
//读取当前用户的留言
//request.setCharacterEncoding("utf-8");
//获取servletContext的初始化参数 。注意,用this.getInitParameter()获取到的是servlet的初始化参数
String charset=getServletContext().getInitParameter("charset");
request.setCharacterEncoding(charset);
//记得读取留言之前必须要获取留言者的ip
String ip=request.getRemoteAddr();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
String time=sdf.format(new Date());
String msg=request.getParameter("msg");
String msgs=(String) getServletContext().getAttribute("msgs");
if (msgs==null){
msgs="";
}
if (msg!=null&&!msg.trim().equals("")){
if (msgs==null||msgs.equals("")){
msgs=time+" "+ip+": "+msg;
} else {
msgs=msgs+"<br/>"+time+" "+ip+": "+msg;
}
getServletContext().setAttribute("msgs", msgs);
}
String div="<div style='border:1px solid red; width:600px; height:400px; overflow:auto'>"+msgs+"</div>";
out.println(div);
//当前用户的留言表单
out.println("<hr/>");
String form="<form action='chat' method='post'>" +
"留言<input type='text' name='msg'/>" +
"<input type='submit' value='发送'/>" +
"</form>";
out.println(form);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}</span>
三、图片浏览
本例模拟的是浏览器浏览服务器指定目录下的图片
这里还是使用了getServletContext()方法获取ServletContext的对象,操控上下文
<span style="font-size:14px;">package cn.hncu.servlets;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowImgsServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
//※※※获取服务器项目根目录下的imgs文件夹下的所有图片文件名
String realPath=getServletContext().getRealPath("/imgs");//参数是:项目根目录下的imgs文件夹
//上一句返回的是:资源的绝对路径,即带盘符的路径,如:D:\apache-tomcat-7.0.30\webapps\servletDemo2\imsgs
File file=new File(realPath);
//防范一下
if (!file.exists()||!file.isDirectory()){
return;
}
String[] fileNames=file.list();
for (String fileName:fileNames){
String img="<img width=200 height=200 src='imgs/"+fileName+"'/>";
out.println(img);
}
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}</span>