您的位置:首页 > 编程语言 > Java开发

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、免费页面访问计数器的实现原理





6、页面访问计数器实践




实现的代码:

建立一个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>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: