zoukankan      html  css  js  c++  java
  • JSP简易留言板

    写在前面

    在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识。今天为大家带来一个小应用,用application制作的简易留言板。

    包括三个功能模块:留言提交、留言展示、查看留言板。用3个JSP页面展示信息(视图层),一个servlet处理用户的请求(控制层),因为比较简单没有用到javaBean作为模型层。还有一个filter初始化应用。

    表单提交

    本例中用submit.jsp页面提交留言。用表单提交用户的请求参数,action参数处理用户请求程序的路径。关于表单提交有两点说明:

    1.路径

    在JSP页面中,建议用绝对路径,形如:<%=request.getContextPath()%>/MsgPane,request.getContextPath()代表项目的根目录。其原因是绝对路径简单不容易出错。在写JSP程序是经常会犯路径的错误,就是没明白一些基本的概念。

    在html标签中,“/”是代表服务器的根目录:形如:http://localhost:8080/

    在JSP脚本中,“/”Web应用的根目录:形如:http://localhost:8080/yourwebapp/

    为了统一前后端路径的使用,IDE在新建JSP的会加入<base>标签,这个时候相对路径是不起作用的,浏览器解析时会在其前面加上base的href属性值。例如:

    有<base>标签的存在,<form action="MsgPane" method="post"> 浏览器解析的路径为“http://localhost:8080/yourwebapp/”+Msgpane。

    2.方法

    post提交时,参数不会附加在URL中,安全性更高,表单提交建议使用post。

    submit.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>  
      <body>
        <form action="<%=request.getContextPath()%>/MsgPane" method="post">
            请输入你的姓名:<br><input type="text" name="name"><br>
            请输入你的标题:<br><input type="text" name="title"><br>
            留言内容:<br><textarea rows="15" cols="20" name="message"></textarea><br><br>       
            <input type="submit" value="提交信息"><br>
        </form>
        <form action="<%=request.getContextPath()%>/msgpane/messages.jsp">
            <input type="submit" value="查看留言板">
        </form>
    <%--  </body>--%>
    </html>

    处理用户请求

    我们一般用servlet处理用户请求,servlet多用于流程控制,也就是我们常说得MVC中C(控制层)。

    1.处理表单参数的中文乱码,可在servlet重写的请求方法中加入

    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");

    2.application对象在JSP中是内置的,而在servlet中,需要自己去实例化。

    ServletContext application = request.getServletContext();

    3.application的常用方法,其实底层实现是Map。

    application.setAttribute(String key,Object obj); 
    application.getAttribute(String key); //Object,需要类型强转!

    4.session与application常用方法类似,只是作用范围限于同一用户,而application是整个应用,用下面方法实例化。

    HttpSession session=request.getSession(); 

    MsgPane.java

    package servlet;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class MsgPane extends HttpServlet {
        List<String> msgs;
        int count;
        String objfile="";
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            objfile=request.getServletContext().getRealPath("/")+"msgpane\Msgpane.obj";
            System.out.println(objfile);
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            ServletContext application = request.getServletContext();
            HttpSession session=request.getSession();
            if(application.getAttribute("msgs")!=null){
                msgs=(List<String>)application.getAttribute("msgs");
            }else{
                msgs=new ArrayList();
                System.out.println("New");
            }
            count = msgs.size();
            String date = new Date().toLocaleString();
            String name = request.getParameter("name");
            String title = request.getParameter("title");
            String msg = request.getParameter("message");
            if (name == null || "".equals(name)) {
                name = "guest";
            }
            if (title == null || "".equals(title)) {
                title = "无标题";
            }
            if (msg == null || "".equals(msg)) {
                request.getRequestDispatcher("/msgpane/submit.jsp").forward(request,
                        response);
            } else {
                count++;
                String tmsg = "<br><br><br>No." + count + "&nbsp;&nbsp;&nbsp;"
                        + date + "<br><br>姓名:" + name + "<br>标题:" + title
                        + "<br>内容:" + msg;
                msgs.add(tmsg);
                saveMsgPane(objfile);            
                application.setAttribute("msgs", msgs);
                session.setAttribute("msg", tmsg);
                request.getRequestDispatcher("/msgpane/msgpane.jsp").forward(request,
                        response);            
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            this.doGet(req, resp);
        }
    
        public void saveMsgPane(String filename) {
            try {
                saveObject(filename, msgs);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public void saveObject(String filename, Object obj) throws IOException {
            File f = new File(filename);
            if (!f.exists()) {
                f.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(f);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(obj);
            fos.close();
            oos.close();
        }
    }
    

    初始化应用

    在启动应用时,将留言板内容从文件读取,存入application对象。

    MsgpaneFilter.java

    package filter;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MsgpaneFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            String objfile = request.getServletContext().getRealPath("/")+"msgpane\Msgpane.obj";
            System.out.println(objfile);
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            ServletContext application = request.getServletContext();
            if (application.getAttribute("msgs") == null) {
                File f = new File(objfile);
                if (f.exists()) {
                    try {
                        application.setAttribute("msgs", readObject(objfile));
                        System.out.println("read");
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println("File not found!");
                    req.getRequestDispatcher("/msgpane/submit.jsp").forward(req,
                            resp);
                }
            }
            chain.doFilter(req, resp);
        }
    
        @Override
        public void destroy() {
        }
    
        public Object readObject(String filename) throws IOException,
                ClassNotFoundException {
            Object obj = null;
            File ft = new File(filename);
            if (ft.exists()) {
                FileInputStream fis = new FileInputStream(ft);
                ObjectInputStream ois = new ObjectInputStream(fis);
                obj = ois.readObject();
                fis.close();
                ois.close();
            } else {
                // do something
            }
            return obj;
        }
    }
    

    关于留言展示和查看留言板我就不贴代码了,非常简单。这个小例子的代码我打包好了,下面是链接:

    msgpanehttp://files.cnblogs.com/files/klguang/msgpane.rar

  • 相关阅读:
    RabbitMQ使用介绍及实例
    RabbitMQ与java、Spring结合实例详细讲解
    服务器搭建--Linux安装rabbitmq
    服务器搭建--Linux安装erlang
    solrCloud index search (图)
    What does "exceeded limit of maxWarmingSearchers=X" mean?
    Solr 自定义排序[1]
    solr Query[转]
    Lucene
    Solr[Q] -No live SolrServers available to handle this request, no servers hosting shard
  • 原文地址:https://www.cnblogs.com/klguang/p/4713064.html
Copyright © 2011-2022 走看看