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 + " "
+ 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;
}
}
关于留言展示和查看留言板我就不贴代码了,非常简单。这个小例子的代码我打包好了,下面是链接:
msgpane:http://files.cnblogs.com/files/klguang/msgpane.rar
JSP简易留言板的更多相关文章
- DOM操作相关案例 模态对话框,简易留言板,js模拟选择器hover,tab选项卡,购物车案例
1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...
- 原生node实现简易留言板
原生node实现简易留言板 学习node,实现一个简单的留言板小demo 1. 使用模块 http模块 创建服务 fs模块 操作读取文件 url模块 便于path操作并读取表单提交数据 art-tem ...
- Flask学习之旅--简易留言板
一.写在前面 正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言 ...
- php实现简易留言板效果
首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...
- 微信小程序实现简易留言板
微信小程序现在很火,于是也就玩玩,做了一个简易的留言板,让大家看看,你们会说no picture you say a j8 a,好吧先上图. 样子就是的,功能一目了然,下面我们就贴实现的代码,首先是H ...
- vue实现简易留言板
首先引入vue.js <script src="vue.js"></script> 布局 <div id="div"> &l ...
- js简易留言板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- js 实现简易留言板功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jsp中运用application实现共享留言板功能
jsp中application的知识点总结: 1.一个Web应用程序启动后,将会自动创建一个application对象,在整个应用程序的运行过程中只有这一个application对象,即所有访问该网站 ...
随机推荐
- webpack学习笔记一(入门)
webpack集成了模块加载和打包等功能 ,这两年在前端领域越来越受欢迎.平时一般是用requirejs.seajs作为模块加载用,用grunt/gulp作为前端构建.webpack作为模块化加载兼容 ...
- 你好,C++(2)1.3 C++世界版图1.4 如何学好C++
1.3 C++世界版图 C++语言的发展过程,不仅是一个特性不断增加.内容不断丰富的过程,更是一个在应用领域中不断攻城略地的过程.在其30余年的发展过程中,C++在多个应用领域都得到了广泛的应用和发 ...
- 仿照淘宝首页做的一个高度伪对齐demo
功能就是当右边高度没有左边高的情况下做的一些处理,由于本人技术有限,不兼容所有浏览器, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...
- Bootstrap_Javascript_按钮插件
一 . 加载状态按钮 HTML: <button class="btnbtn-primary" data-loading-text="正在加载中,请稍等...&qu ...
- jQuery备忘录--私家版
最近在看jQuery,总是看过了忘,不知道该怎么办?准备开启洗脑模式,日常念一念,紧箍咒加身. 1.jQuery方法第一步:ready=>加载html的骨架.而onload=>整个页面加载 ...
- js操作Cookie,实现历史浏览记录
/** * history_teacher.jsp中的js,最近浏览名师 * @version: 1.0 * @author: mingming */ $(function(){ getHistory ...
- python json string和dict的转化
__author__ = 'SRC_TJ_XiaoqingZhang' import json data1 = {'b': 789, 'c': 456, 'a': 123} encode_json = ...
- 测试gcc的优化选项
一.测试准备及原理 测试代码: static void wait(volatile unsigned long dly) { ; dly--); } int main(void) { unsigned ...
- HTML5 display:inline、block、inline-block的区别--备用
display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...
- 计算广义积分$$\int_0^{+\infty}\cos x^p {\rm d}x,\int_0^{+\infty}\sin x^p {\rm d}x, p>1$$
${\bf 解:}$ 在角状域$G=\{z\in\mathbb{C}|0<{\rm Arg}z<\frac{\pi}{2p}\}$上引入辅助函数$e^{iz^p}$, 其中$z^p=|z| ...