Servlet——利用Cookie和xml文件创建简单留言簿
1.创建空的xml文件,用于存放留言信息
/webroot/messages.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<messages>
</messages>
<messages>
</messages>
这个已有留言信息
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<messages>
<message>
<content>lkj;ad</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635140456</date>
</message>
<message>
<content>xxxxx</content>
<ip>0:0:0:0:0:0:0:1</ip>
<username>X</username>
<date>1333635477483</date>
</message>
<message>
<content>zzzzzz</content>
<ip>192.168.1.102</ip>
<username>Z</username>
<date>1333635495330</date>
</message>
<message>
<content>yyyyyy</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635549992</date>
</message>
<message>
<content>DFADAFADFAD</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635580756</date>
</message>
<message>
<content>您好</content>
<ip>192.168.1.10</ip>
<username>中国</username>
<date>1333635599195</date>
</message>
<message>
<content>hello</content>
<ip>192.168.1.102</ip>
<username>美国</username>
<date>1333635628960</date>
</message>
<message>
<content>加压工资</content>
<ip>0:0:0:0:0:0:0:1</ip>
<username>绋</username>
<date>1333635669036</date>
</message>
<message>
<content>什么啊。。???</content>
<ip>192.168.1.10</ip>
<username>中国</username>
<date>1333635701890</date>
</message>
</messages>
<messages>
<message>
<content>lkj;ad</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635140456</date>
</message>
<message>
<content>xxxxx</content>
<ip>0:0:0:0:0:0:0:1</ip>
<username>X</username>
<date>1333635477483</date>
</message>
<message>
<content>zzzzzz</content>
<ip>192.168.1.102</ip>
<username>Z</username>
<date>1333635495330</date>
</message>
<message>
<content>yyyyyy</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635549992</date>
</message>
<message>
<content>DFADAFADFAD</content>
<ip>192.168.1.10</ip>
<username>Y</username>
<date>1333635580756</date>
</message>
<message>
<content>您好</content>
<ip>192.168.1.10</ip>
<username>中国</username>
<date>1333635599195</date>
</message>
<message>
<content>hello</content>
<ip>192.168.1.102</ip>
<username>美国</username>
<date>1333635628960</date>
</message>
<message>
<content>加压工资</content>
<ip>0:0:0:0:0:0:0:1</ip>
<username>绋</username>
<date>1333635669036</date>
</message>
<message>
<content>什么啊。。???</content>
<ip>192.168.1.10</ip>
<username>中国</username>
<date>1333635701890</date>
</message>
</messages>
2.创建实体类Message
/src/com/myself/domain/Message.java
package com.myself.domain;
import java.util.Date;
public class Message {
private String content;
private String ip;
private String username;
private Date date;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Message: [" + username + ", " + ip + ", " + content + "]";
}
}
import java.util.Date;
public class Message {
private String content;
private String ip;
private String username;
private Date date;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Message: [" + username + ", " + ip + ", " + content + "]";
}
}
3.创建Servlet
/src/com/myself/servlet/MessageBoardServlet.java
package com.myself.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.myself.domain.Message;
public class MessageBoardServlet extends HttpServlet {
private List<Message> messages = null;
private File messagesFile = null;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 用于留言处显示的用户名
String user = null;
// 存放message的xml文件
messagesFile = new File(this.getServletContext().getRealPath(""), "messages.xml");
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 第秒中刷新一次
response.setHeader("refresh", "30");
// 判断用户是否第一次使用,如果是则 new ArrayList<Message>();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
user = cookie.getValue();
}
}
}
try {
// 加载文件
messages = list(messagesFile);
} catch (Exception e) {
System.out.println("xml文件操作错误:list()");
e.printStackTrace();
}
// 获取所有参数
String username = request.getParameter("username");
String messageContent = request.getParameter("messageContent");
Message message = null;
if (username != null && !"".equals(username)
&& messageContent != null && !"".equals(messageContent)) {
// 设置用户名cookie
Cookie userCookie = new Cookie("user", URLEncoder.encode(username, "UTF-8"));
userCookie.setMaxAge(60 * 60 * 24);
response.addCookie(userCookie);
message = new Message();
message.setIp(request.getRemoteAddr());
message.setUsername(username);
message.setContent(messageContent);
message.setDate(new Date());
try {
addMessageToFile(messagesFile, message);
} catch (Exception e) {
System.out.println("xml文件操作错误: addMessageToFile()");
e.printStackTrace();
}
messages.add(message);
// 更新用户名的显示
user = username;
}
// 获取打印流
PrintWriter out = response.getWriter();
// 输出页面信息
out.println("<b>[留言内容], [IP], [用户名], [时间]</b>");
out.println("<hr>");
// 日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (messages != null) {
for (Message m : messages) {
out.println("[" + m.getContent() + "], [" + m.getIp() + "], [" + m.getUsername() + "], [" + sdf.format(m.getDate()) + "]");
out.println("<hr>");
}
}
out.println("");
out.println("<form action='#' method='post'>");
out.println("用户名: <input type='text' name='username' value='" + (user == null ? "" : URLDecoder.decode(user, "UTF-8")) + "' /><br/>");
out.println("留言内容:<textarea name='messageContent' cols='30' rows='5'></textarea><br>");
out.println("<input type='submit' value='提交' />");
}
// 向xml文件添加内容
private void addMessageToFile(File file, Message message) throws Exception {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
// 创建message元素
Element messageElement = document.createElement("message");
// 创建content元素
Element contentElement = document.createElement("content");
// 创建ip元素
Element ipElement = document.createElement("ip");
// 创建username元素
Element usernameElement = document.createElement("username");
// 创建date元素
Element dateElement = document.createElement("date");
// 获取根元素
Element rootElement = document.getDocumentElement();
// 将messageElement添加到根元素下
rootElement.appendChild(messageElement);
// 将content, ip, username元素添加到message元素下
messageElement.appendChild(contentElement);
messageElement.appendChild(ipElement);
messageElement.appendChild(usernameElement);
messageElement.appendChild(dateElement);
// 设置值
contentElement.setTextContent(message.getContent());
ipElement.setTextContent(message.getIp());
usernameElement.setTextContent(message.getUsername());
dateElement.setTextContent(message.getDate().getTime() + "");
// 将内存数据写入到文件
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(file);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(xmlSource, outputTarget);
}
// 获取xml文件中的message
private List<Message> list(File file) throws Exception {
List<Message> list = new ArrayList<Message>();
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
NodeList MessageNodes = document.getElementsByTagName("message");
for (int i = 0; i < MessageNodes.getLength(); i++) {
Element messageElement = (Element) MessageNodes.item(i);
Message message = new Message();
message.setContent(messageElement.getElementsByTagName("content").item(0).getTextContent());
message.setIp(messageElement.getElementsByTagName("ip").item(0).getTextContent());
message.setUsername(messageElement.getElementsByTagName("username").item(0).getTextContent());
message.setDate(new Date(Long.parseLong(messageElement.getElementsByTagName("date").item(0).getTextContent())));
list.add(message);
}
return list;
}
// 清空xml文件内容
private void clearXmlFile(File file) throws Exception {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
// 根节点
Element rootElement = document.getDocumentElement();
NodeList messageList = document.getElementsByTagName("message");
// 刪除所有message节点
while (messageList.getLength() != 0) {
rootElement.removeChild(messageList.item(0));
}
// 将内存数据写入到文件
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(file);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(xmlSource, outputTarget);
}
}
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.myself.domain.Message;
public class MessageBoardServlet extends HttpServlet {
private List<Message> messages = null;
private File messagesFile = null;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 用于留言处显示的用户名
String user = null;
// 存放message的xml文件
messagesFile = new File(this.getServletContext().getRealPath(""), "messages.xml");
// 设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 第秒中刷新一次
response.setHeader("refresh", "30");
// 判断用户是否第一次使用,如果是则 new ArrayList<Message>();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
user = cookie.getValue();
}
}
}
try {
// 加载文件
messages = list(messagesFile);
} catch (Exception e) {
System.out.println("xml文件操作错误:list()");
e.printStackTrace();
}
// 获取所有参数
String username = request.getParameter("username");
String messageContent = request.getParameter("messageContent");
Message message = null;
if (username != null && !"".equals(username)
&& messageContent != null && !"".equals(messageContent)) {
// 设置用户名cookie
Cookie userCookie = new Cookie("user", URLEncoder.encode(username, "UTF-8"));
userCookie.setMaxAge(60 * 60 * 24);
response.addCookie(userCookie);
message = new Message();
message.setIp(request.getRemoteAddr());
message.setUsername(username);
message.setContent(messageContent);
message.setDate(new Date());
try {
addMessageToFile(messagesFile, message);
} catch (Exception e) {
System.out.println("xml文件操作错误: addMessageToFile()");
e.printStackTrace();
}
messages.add(message);
// 更新用户名的显示
user = username;
}
// 获取打印流
PrintWriter out = response.getWriter();
// 输出页面信息
out.println("<b>[留言内容], [IP], [用户名], [时间]</b>");
out.println("<hr>");
// 日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (messages != null) {
for (Message m : messages) {
out.println("[" + m.getContent() + "], [" + m.getIp() + "], [" + m.getUsername() + "], [" + sdf.format(m.getDate()) + "]");
out.println("<hr>");
}
}
out.println("");
out.println("<form action='#' method='post'>");
out.println("用户名: <input type='text' name='username' value='" + (user == null ? "" : URLDecoder.decode(user, "UTF-8")) + "' /><br/>");
out.println("留言内容:<textarea name='messageContent' cols='30' rows='5'></textarea><br>");
out.println("<input type='submit' value='提交' />");
}
// 向xml文件添加内容
private void addMessageToFile(File file, Message message) throws Exception {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
// 创建message元素
Element messageElement = document.createElement("message");
// 创建content元素
Element contentElement = document.createElement("content");
// 创建ip元素
Element ipElement = document.createElement("ip");
// 创建username元素
Element usernameElement = document.createElement("username");
// 创建date元素
Element dateElement = document.createElement("date");
// 获取根元素
Element rootElement = document.getDocumentElement();
// 将messageElement添加到根元素下
rootElement.appendChild(messageElement);
// 将content, ip, username元素添加到message元素下
messageElement.appendChild(contentElement);
messageElement.appendChild(ipElement);
messageElement.appendChild(usernameElement);
messageElement.appendChild(dateElement);
// 设置值
contentElement.setTextContent(message.getContent());
ipElement.setTextContent(message.getIp());
usernameElement.setTextContent(message.getUsername());
dateElement.setTextContent(message.getDate().getTime() + "");
// 将内存数据写入到文件
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(file);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(xmlSource, outputTarget);
}
// 获取xml文件中的message
private List<Message> list(File file) throws Exception {
List<Message> list = new ArrayList<Message>();
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
NodeList MessageNodes = document.getElementsByTagName("message");
for (int i = 0; i < MessageNodes.getLength(); i++) {
Element messageElement = (Element) MessageNodes.item(i);
Message message = new Message();
message.setContent(messageElement.getElementsByTagName("content").item(0).getTextContent());
message.setIp(messageElement.getElementsByTagName("ip").item(0).getTextContent());
message.setUsername(messageElement.getElementsByTagName("username").item(0).getTextContent());
message.setDate(new Date(Long.parseLong(messageElement.getElementsByTagName("date").item(0).getTextContent())));
list.add(message);
}
return list;
}
// 清空xml文件内容
private void clearXmlFile(File file) throws Exception {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
// 根节点
Element rootElement = document.getDocumentElement();
NodeList messageList = document.getElementsByTagName("message");
// 刪除所有message节点
while (messageList.getLength() != 0) {
rootElement.removeChild(messageList.item(0));
}
// 将内存数据写入到文件
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(file);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(xmlSource, outputTarget);
}
}
4.注册Servlet到web.xml
/webroot/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jps</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MessageBoardServlet</servlet-name>
<servlet-class>com.myself.servlet.MessageBoardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MessageBoardServlet</servlet-name>
<url-pattern>/messageBoard</url-pattern>
</servlet-mapping>
</web-app>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jps</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MessageBoardServlet</servlet-name>
<servlet-class>com.myself.servlet.MessageBoardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MessageBoardServlet</servlet-name>
<url-pattern>/messageBoard</url-pattern>
</servlet-mapping>
</web-app>
5.OK看看效果


浙公网安备 33010602011771号