Servlet——利用Cookie和xml文件创建简单留言簿

1.创建空的xml文件,用于存放留言信息
/webroot/messages.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<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>
 
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 + "]";
    }
}
 
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);
    }

}
 
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>
 
5.OK看看效果





posted @ 2012-04-05 22:35  jungor  阅读(368)  评论(0)    收藏  举报