基本架构设计:


数据库设计:

用户表——tbl_user(包括用户名、密码)

留言信息存储表——tbl_leave_message(包括留言人姓名、留言信息、留言主题、留言时间)

项目基本布局设计:


效果测试

(1) 欢迎页面:

直接进入登录页面,如果登录不成功,就不可以进行留言

此页面还可以实现注册功能,为新用户提供方便

如果不输任何内容直接提交或者只是输入一项提交那么会输出友情提示:

注册页面(对于注册也划分了注册成功与失败页面):

(2) 成功登录后的页面:

(3) 留言页面(有留言成功与失败页面):

(4) 查看历史留言页面(此处之前有留言内容,所以可以直接查询到,如果没有历史留言也是会输出——“暂时没有留言,之后跳转到留言页面”)

具体代码实现:

欢迎页面——login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
%>
<html>
<head>
<base href="<%=basePath%>"><title>登录</title><!-- 使用JavaScript实现对用户名填入的用户名以及密码是否为空进行验证   -->
<script language="javascript">
function check(form){if (form.name.value==""){alert("请输入用户名!");form.name.focus();return false;}if (form.password.value==""){alert("请输入密码!");form.password.focus();return false;}
}
</script></head>
<body><form action="<%=path%>/servlet/checklogin" method="post" name="login">用户名:<input type="text" name="name"> <br> 密码:<inputtype="password" name="password"> <br> <input type="submit" value="提交" οnclick="return check(login)"><input type="reset" value="重置"></form><a href="register.jsp">注册</a>
</body></html>

Checklogin.java代码实现:

package com.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;import com.JavaBean.DB_Conn;
import com.JavaBean.DB_User;
import com.JavaBean.User;public class checklogin extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//设置请求响应的编码格式response.setContentType("text/html");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");//获取out输出流对象PrintWriter out=response.getWriter();//设置注册成功与失败之后的页面跳转URLString  LoginSuccess="http://localhost:8080/MessageBoard/index.jsp";String  LoginFail="http://localhost:8080/MessageBoard/login.jsp";//获取用户提交的信息String name=request.getParameter("name");String password=request.getParameter("password");//核对用户名与密码,决定是否通过登录验证DB_User db_User=new DB_User();User user=db_User.get(name, password);if(user!=null){//登录成功时,把用户名存储到session中request.getSession(true).setAttribute("username",name);response.sendRedirect(LoginSuccess);}else {//否则(记录集为空)登录失败out.print("不存在该用户!");response.setHeader("Refresh", "3;url="+LoginFail);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

此过程中涉及数据库连接以及数据库操作代码,下面一次性展示:

User.java————封装一个user对象:

package com.JavaBean;public class User {//用户名与密码private String name;private String password;//对用户填写的信息进行封装public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

Message.java————用于封装一个message对象:

package com.JavaBean;//实现对一个留言信息的封装
public class Message {private String name;private String title;private String message;private String time;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}
}

DB_Conn.java————用于连接数据库与释放数据库连接功能(进行了封装操作)

package com.JavaBean;import java.io.PrintWriter;
import java.sql.*;public class DB_Conn {//JDBC驱动程序名private String driverName="com.mysql.jdbc.Driver";//数据库用户名private String userName="root";//数据库密码private String userPwd="root";//数据库名private String dbName="MessageBoard";//数据库链接URLprivate String url="jdbc:mysql://localhost:3306/"+dbName;//数据库链接对象private Connection conn=null;//数据库语句对象public Statement sm=null;//创建out输出流对象private PrintWriter out=null;//建立数据库链接函数public int ConnectDB(){try {Class.forName(driverName).newInstance();//实例化(另外一种说法——注册一个驱动)conn=DriverManager.getConnection(url,userName,userPwd);//获取数据库链接sm=conn.createStatement();return 1;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();out.print("数据库链接失败!");return 0;}}//释放数据库链接函数public void CloseDB(){try {if(sm!=null){sm.close();}conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();out.print("数据库关闭失败!");}}}

DB_User.java————用于创建操作数据库的公用方法(包括用户登录验证、用户注册、用户留言、查看历史留言等功能)

package com.JavaBean;import java.io.UnsupportedEncodingException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;import org.omg.CORBA.Request;import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;public class DB_User {// 创建公共数据库链接对象DB_Conn conn = new DB_Conn();/******************************************* (1)查询数据库中是否存在改用户(使用用户名与密码进行验证)******************************************/
public User get(String username,String password){//链接数据库conn.ConnectDB();ResultSet rs=null;//构建sql语句:String sql="select * from  tbl_user where username= '"+username+"' and password='"+password+"'";try {//执行sql语句rs=conn.sm.executeQuery(sql);User user=null;//初始化一个user对象为空if(rs.next()){//如果存在该用户,那么就将他的用户名与密码存入user对象中user=new User();user.setName(rs.getString("username"));user.setPassword(rs.getString("password"));}//不存在,直接返回user(其值为NULL)return user;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();return  null;}catch (Exception e) {// TODO: handle exceptione.printStackTrace();return null;}finally{conn.CloseDB();}}/********************************************** (2)在数据库的tbl_leave_message表中插入用户的留言信息********************************************/
public int insert_Message(String username,String title,String message,String time){//链接数据库,conn.ConnectDB();//构建sql语句String sql="insert into tbl_leave_message(username,title,message,time) " +"values('"+username+"'"+","+"'"+title+"','"+message+"','"+time+"')";try {//sql=new String(sql.getBytes("ISO-8859-1"),"utf-8");int i=conn.sm.executeUpdate(sql);return i;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();return -1;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();return -2;}finally{//最释放数据库资源conn.CloseDB();}}
/**************************************** (3)从tbl_leave_message表中获取历史留言记录* ************************************/public ArrayList<Message> get_History_Message(){  //链接数据库conn.ConnectDB();//初始化结果集为空ResultSet rs=null;//创建一个用于存储对象的列表ArrayList<Message> list= new ArrayList<Message>();//构建sql语句String sql="select * from tbl_leave_message ";try {rs=conn.sm.executeQuery(sql);while(rs.next()){//每次都新建一个对象,之后对对象进行封装赋值,之后把对象添加到列表中Message message=new  Message();message.setName(rs.getString("username"));message.setTitle(rs.getString("title"));message.setMessage(rs.getString("message"));message.setTime(rs.getString("time"));list.add(message);//添加对象到列表中}return list;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();return  null;}finally{conn.CloseDB();//关闭数据库释放资源!}}
/********************************************* (4)注册用户信息(往tbl_user表中插入数据信息)* ****************************************/
public int register_user(String username,String password){// 链接数据库conn.ConnectDB();// 创建sql语句String sql = "insert into tbl_user(username,password) " + " values( '"+ username + "','" + password + "' )";try {// 执行sql语句int flag = conn.sm.executeUpdate(sql);return flag;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();return 0;} catch (Exception e) {// TODO: handle exceptione.printStackTrace();return 0;} finally {conn.CloseDB();// 释放数据库链接资源}}
}

下面进行servlet逻辑功能处理代码的介绍(checklogin.java已经有过介绍此处不再进行解释):

注册页面(register.java)的逻辑处理代码:

package com.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;import com.JavaBean.DB_User;public class register extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置请求响应的编码格式response.setContentType("text/html");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");// 获取out输出流对象PrintWriter out = response.getWriter();// 设置注册成功与失败之后的页面跳转URLString RegisterSuccess = "http://localhost:8080/MessageBoard/login.jsp";String RegisterFail = "http://localhost:8080/MessageBoard/login.jsp";// 获取用户提交的信息String name = request.getParameter("username");String password = request.getParameter("password");// 核对用户名与密码,决定是否通过登录验证DB_User db_User = new DB_User();int flag = db_User.register_user(name, password);if (flag > 0) {out.print("注册成功!");response.setHeader("Refresh", "3;URL=" + RegisterSuccess);} else {// 否则(记录集为空)登录失败out.print("注册失败!");response.setHeader("Refresh", "3;url=" + RegisterFail);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

对于留言信息处理的(doMessage.java)页面代码:

package com.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.text.SimpleDateFormat;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.JavaBean.DB_User;
import com.sun.org.apache.bcel.internal.generic.NEW;
import java.util.*;public class doMessage extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//设置请求相应的编码格式response.setContentType("text/html");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");//创建输出流对象:PrintWriter out=response.getWriter();//创建URLString URL="http://localhost:8080/MessageBoard/leaveMessage.jsp";//获取用户提交的信息String title =request.getParameter("title");String message=request.getParameter("context");HttpSession session=request.getSession();String username=(String) session.getAttribute("username");//获取当前时间,一并提交到数据库进行存储SimpleDateFormat format=new SimpleDateFormat("YYYY年MM月dd日HH时mm分ss秒");String  time=format.format(new java.util.Date());//创建数据库处理对象DB_User user=new DB_User();int i=user.insert_Message(username,title, message,time);if(i>0){out.print("留言成功!");response.setHeader("Refresh", "3;URL="+URL);}else{out.print("留言失败!");response.setHeader("Refresh", "3;URL="+URL);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

对于历史留言的逻辑处理代码(ShowMessage.java):

package com.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.JavaBean.DB_User;
import com.JavaBean.Message;public class ShowMessage extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置请求响应编码格式response.setContentType("text/html");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");// 创建输入流对象outPrintWriter out = response.getWriter();// 创建一个列表用来存储获得信息ArrayList<Message> list = new ArrayList<Message>();String Check_Success_URL = "http://localhost:8080/MessageBoard/show.jsp";String Check_Fail_URL = "http://localhost:8080/MessageBoard/leaveMessage.jsp";// 创建数据库操作对象DB_User user = new DB_User();// 获取存储留言历史的表list = user.get_History_Message();if(list!=null&&list.size()>0){HttpSession session=request.getSession();session.setAttribute("list", list);response.setHeader("Refresh", "0;URL="+Check_Success_URL);}else {out.print("无历史留言记录!");response.setHeader("Refresh", "3;URL="+Check_Fail_URL);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

接下来介绍一下对于view模式的jsp页面的代码实现:

Register.jsp页面

<%@ page language="java" import="java.util.*"pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><html><head><title>注册</title><script language="javascript">function check(form){if (form.name.value==""){alert("请输入用户名!");form.name.focus();return false;}if (form.password.value==""){alert("请输入密码!");form.password.focus();return false;} }</script></head><body><form action="<%=path%>/servlet/register"method="post" name="register">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" Value="提交" οnclick="returncheck(register)"><input type="reset" valude="重置"></form></body></html>

LeaveMessage.jsp页面代码实现:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><html><head><base href="<%=basePath%>"><title>留言板</title></head><script type="text/javascript">function check(form){if(form.title.value==""){alert("主题不能为空!");form.title.focus();return false;}if(form.context.value==""){alert("留言内容不能为空!");form.context.focus();return false;}}</script><body><h1>留言板</h1><form action="<%=path %>/servlet/doMessage"  method="post" name="leaveMessage">主题:<input type="text" name="title"><br>留言内容:<br><textarea  type="text" row="100" cols="50" name="context"></textarea><br><input type="submit" value="提交" οnclick="return check(leaveMessage)"></form><form action="<%=path%>/servlet/ShowMessage" method="post"><input type="submit" value="查看历史留言"></form></body>
</html>

Index.jsp代码实现:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title></head><body><h1>系统首页</h1><a href="leaveMessage.jsp">我要留言</a><br></body>
</html>

Show.jsp页面代码实现:

<title>查询结果</title>
</head><body><%ArrayList<Message> list = (ArrayList) session.getAttribute("list");if (list != null && list.size() > 0) {for (int i = list.size() - 1; i >= 0; i--) {Message message = list.get(i);%>留言主题:<%=message.getTitle()%><p>留言人:<%=message.getName()%><p>留言内容:<textarea rows="20" cols="40" readonly><%=message.getMessage()%></textarea><p>留言时间:<%=message.getTime()%><%}}%></body>
</html>

JSP实战————留言版实现相关推荐

  1. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  2. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结. 所以下面给大家分享一下我的经验: 第一部分   介绍微信公众号的一些简单 ...

  3. idea新建springboot后端到前端_码云开源项目:利用SpringBoot+Vue 实现留言版

    一.新建Vue项目和SpringBoot项目 新建Vue项目 新建文件夹SpringBoot-Vue-MessageBoard创建Vue项目使用vue ui命令(需要vue 3.0选择刚才的目录 名字 ...

  4. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  5. OpenCV计算机视觉实战(Python版)_002图像基本操作

    OpenCV计算机视觉实战(Python版) https://www.bilibili.com/video/BV1ct411F7Te?p=2 数据读取-图像 cv2.IMREAD_COLOR:彩色图像 ...

  6. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  7. 如何查看文件是否为csv格式_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据...

    关注公众号:登峰大数据,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架!如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 解析器的常 ...

  8. dataframe两个表合并_Spark实战第二版(涵盖Spark3.0)第三章 宏伟的角色dataframe

    关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 使用 ...

  9. R语言必看推荐:R语言入门经典版(中文版)+R语言实战第二版(中文完整版)

    R语言入门经典(中文版)R for beginners R语言经典教材 第二版 适合初学者 作者:Emmanuel Paradis R 语言实战第二版(中文完整版) R语言实战(第2版)注重实用性,是 ...

最新文章

  1. 敏捷为什么会失败之「PA-SA-WAKA-DA」理论
  2. Windows server 2008 R2 登录密码恢复
  3. 使用putty上传文件
  4. Creating an Extender Control to Associate a Client Behavior with a Web Server Control
  5. c++中new和delete的使用方法
  6. rog live service是什么_王者荣耀日活跃用户破亿!ROG游戏手机助力水友赛进入4强争夺...
  7. js 取html自定义属性,JS操作html中的自定义属性
  8. 小试牛刀--编程实现获取计算机的IP地址和计算机名
  9. 【雕爷学编程】Arduino动手做(94)---L298N电机驱动板
  10. Apache commons-exec的使用
  11. 计算机基础课件ppt教案,计算机应用基础教案项目二ppt课件.ppt
  12. win7 电脑MAC地址修改
  13. Word WPS 标题二编号未跟随一级标题
  14. 怎么卸载虚幻4_用虚幻引擎重现新海诚风格“秒速五厘米”场景(附流程和思路)...
  15. 寻求路径问题————动态规划的思想
  16. 详解Python中的文本处理
  17. 数据仓库 pdf 电子书大全
  18. AgentWeb , 一个简洁易用的 Android Web 库
  19. 阿里云 Windows Server 2012 R2 使用FileZilla Server 快速搭建FTP服务器
  20. python菜鸟教程 | 打印菱形

热门文章

  1. 安全管理难?信服云告诉你“内建安全”有多靠谱
  2. clip属性参数详解
  3. 24、AT 指令设置AP跟Station模式
  4. 二战前线2 (commando2) flash 修改
  5. HDU2087,1686 KMP
  6. Unity和安卓(二):接入 google 广告
  7. 01 flv 的 binary 解析
  8. linux snmp 客户端,从Linux SNMP说起到community strings
  9. Docker运行MySql镜像
  10. 阿里云免费Https证书申请使用