JavaWeb动态网页的方法和代码
2012-10-30 15:54
141 查看
JavaWeb动态网页的方法和代码
1、getOutputStream与getWriter方法
•getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
•getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
•getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方
法。
•getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
•getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返,PrintWriter对象可以直接输出字符文本内容。
•Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
•Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
2、getOutputStream和getWriter方法的要点:
•PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输
出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。
•使用ServletOutputStream对象也能输出内容全为文本字符的网页文档,但是,如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。
•如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。
3、输出缓冲区的方法:
•setBufferSize方法
•getBufferSize方法
•flushBuffer方法
•reset方法
•isCommitted方法
缓冲区的代码
BufferedServlet.java文件:
(直接建立的Servlet文件。)
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 BufferedServlet extends HttpServlet {
public BufferedServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setBufferSize(0);
int len = response.getBufferSize();
System.out.println(len);
PrintWriter out = response.getWriter();
for(int i=0;i<len;i++){
out.println("a");
}
}
public void init() throws ServletException {
// Put your code here
}
}
4、<img>标签的三个重要特性
•一个包含有图像的网页文件中并没有包含真正的图像数据内容,而只是使用<img>标签指明了图像的URL地址。
举例:本网页已被浏览了<img src= "count.gif ">次
•<img>标签的src属性也可以指向当前页面所在WEB服务器之外的其他WEB服务器上的图像文件。
•浏览器并不关心<img>标签所需的图像数据在服务器端是如何产生,它只知道去访问src属性指定的URL资源,并把服务器返回的数据当作一个图像的内容来显示。服务器返回的图像数据可以直接从一个静态图像文件中读取,也可以通过Servlet程序在内存中动态创建。
5、免费页面访问计数器的实现原理
![](http://img.my.csdn.net/uploads/201210/30/1351583269_7695.jpg)
6、页面访问计数器实践
![](http://img.my.csdn.net/uploads/201210/30/1351583386_9092.png)
实现的代码:
建立一个Count.java, Servlet的文件:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.fastinfoset.sax.Properties;
public class Count extends HttpServlet {
public Count() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-Cache");
response.setHeader("Pragam", "no-Cache");
ServletOutputStream sos = response.getOutputStream();
BufferedImage image = new BufferedImage(80, 20,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
String value = getAccessCount(request);
int len = value.length();
if (len > 7) {
value = "9999999";
} else {
String tmp = "";// 临时变量
for (int i = 0; i < 7 - len; i++) {// 在前面补0
tmp = tmp + "0";
}
value = tmp + value;
}
g.drawString(value, 0, 18);
g.dispose();// 释放资源
ImageIO.write(image, "JPEG", sos);
}
private String getAccessCount(HttpServletRequest request) {
String pagekey = request.getHeader("referer");// 得到引用页面
if (pagekey == null) {
return "0";
}
Properties settings=new Properties();// 创建一个无默认值的空属性列表
String countFilepath = this.getServletContext().getRealPath(
"/count.txt");
try {
settings.load(new FileInputStream(countFilepath));// 从输入流中读取列表
} catch (Exception e) {
e.printStackTrace();
}
String count = "0";
count = settings.getProperty(pagekey);
if (count == null) {
count = "0";
}
int c = Integer.parseInt(count) + 1;
count = new Integer(c).toString();
settings.put(pagekey, count);
try {
settings.store(new FileOutputStream(countFilepath),
"the page is accessed:");// 存储
} catch (Exception e) {
// TODO: handle exception
}
return count;
}
public void init() throws ServletException {
// Put your code here
}
}
再建立一个Image.html文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Image.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
This is my HTML page. <br>
<image src="http://localhost:8080/myeTest/servlet/Count"></image>
</body>
</html>
1、getOutputStream与getWriter方法
•getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
•getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
•getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方
法。
•getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
•getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返,PrintWriter对象可以直接输出字符文本内容。
•Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
•Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
2、getOutputStream和getWriter方法的要点:
•PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输
出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。
•使用ServletOutputStream对象也能输出内容全为文本字符的网页文档,但是,如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。
•如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。
3、输出缓冲区的方法:
•setBufferSize方法
•getBufferSize方法
•flushBuffer方法
•reset方法
•isCommitted方法
缓冲区的代码
BufferedServlet.java文件:
(直接建立的Servlet文件。)
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 BufferedServlet extends HttpServlet {
public BufferedServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setBufferSize(0);
int len = response.getBufferSize();
System.out.println(len);
PrintWriter out = response.getWriter();
for(int i=0;i<len;i++){
out.println("a");
}
}
public void init() throws ServletException {
// Put your code here
}
}
4、<img>标签的三个重要特性
•一个包含有图像的网页文件中并没有包含真正的图像数据内容,而只是使用<img>标签指明了图像的URL地址。
举例:本网页已被浏览了<img src= "count.gif ">次
•<img>标签的src属性也可以指向当前页面所在WEB服务器之外的其他WEB服务器上的图像文件。
•浏览器并不关心<img>标签所需的图像数据在服务器端是如何产生,它只知道去访问src属性指定的URL资源,并把服务器返回的数据当作一个图像的内容来显示。服务器返回的图像数据可以直接从一个静态图像文件中读取,也可以通过Servlet程序在内存中动态创建。
5、免费页面访问计数器的实现原理
![](http://img.my.csdn.net/uploads/201210/30/1351583269_7695.jpg)
6、页面访问计数器实践
![](http://img.my.csdn.net/uploads/201210/30/1351583386_9092.png)
实现的代码:
建立一个Count.java, Servlet的文件:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.fastinfoset.sax.Properties;
public class Count extends HttpServlet {
public Count() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-Cache");
response.setHeader("Pragam", "no-Cache");
ServletOutputStream sos = response.getOutputStream();
BufferedImage image = new BufferedImage(80, 20,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
String value = getAccessCount(request);
int len = value.length();
if (len > 7) {
value = "9999999";
} else {
String tmp = "";// 临时变量
for (int i = 0; i < 7 - len; i++) {// 在前面补0
tmp = tmp + "0";
}
value = tmp + value;
}
g.drawString(value, 0, 18);
g.dispose();// 释放资源
ImageIO.write(image, "JPEG", sos);
}
private String getAccessCount(HttpServletRequest request) {
String pagekey = request.getHeader("referer");// 得到引用页面
if (pagekey == null) {
return "0";
}
Properties settings=new Properties();// 创建一个无默认值的空属性列表
String countFilepath = this.getServletContext().getRealPath(
"/count.txt");
try {
settings.load(new FileInputStream(countFilepath));// 从输入流中读取列表
} catch (Exception e) {
e.printStackTrace();
}
String count = "0";
count = settings.getProperty(pagekey);
if (count == null) {
count = "0";
}
int c = Integer.parseInt(count) + 1;
count = new Integer(c).toString();
settings.put(pagekey, count);
try {
settings.store(new FileOutputStream(countFilepath),
"the page is accessed:");// 存储
} catch (Exception e) {
// TODO: handle exception
}
return count;
}
public void init() throws ServletException {
// Put your code here
}
}
再建立一个Image.html文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Image.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
This is my HTML page. <br>
<image src="http://localhost:8080/myeTest/servlet/Count"></image>
</body>
</html>
相关文章推荐
- JavaWeb实现动态网页下载的代码
- 动态生成JAVA代码的方法zz
- JSP中数据源的绑定方法(Resin配置文件中和代码动态配置的方法)
- 最近ISA服务器出现无法打开网页(错误代码64错误)的解决方法
- jQuery on()方法绑定动态元素的点击事件实例代码浅析
- java读取网页代码的方法
- 网页屏蔽(左右键,代码等)的非JS方法
- 网页的分页下标生成代码(PHP后端方法)
- -2147467259(0x80004005)错误,IIS浏览不了动态网页---解决方法
- ASP动态网页开发中的WEB打印代码大全
- 动态网页中隐藏url参数传递的方法
- 通用PHP动态生成静态HTML网页的代码
- java代码抓取网页邮箱的实现方法
- iOS用代码在视图中动态添加多个有序排列UIView的方法(例如九宫格)
- silverlight中用代码动态控制Storyboard(动画)属性的几种方法
- iOS开发中oc代码响应js网页点击事件的方法
- 在网页嵌入QQ+MSN+淘宝旺旺+Gtalk快速对话框官方代码的方法
- 用jQuery的live方法给动态生成的代码注册事件
- 【移动安全】Android App Smail代码动态跟踪调试方法
- 使用.net 中的动态方法编程备忘录1(如何查看生成的动态方法的代码)