JavaWeb动态网页的方法和代码

JavaWeb动态网页的方法和代码


1、getOutputStreamgetWriter方法

getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。

getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。

getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方
法。 

getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。

getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返,PrintWriter对象可以直接输出字符文本内容。

Servlet程序向ServletOutputStreamPrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

Serlvetservice方法结束后,Servlet引擎将检查getWritergetOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。   

2、getOutputStreamgetWriter方法的要点:

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值