话说:

各位读者晚上好!终于到了2018!2018年的第一篇博客哈!前面中断了不少篇,并非作者怠惰了,确实感觉“拿不出手”,嘿嘿。经过一段时间积累,这次就连续的发表一个系列吧——BBS论坛。

还是很基础很基础的东西,不过,从前端到后端,都是自己写的,完整的记录一个初级的小项目,也是很有纪念意义滴。

技术:
JSP+Servlet + 前端(HTML + CSS+JavaScript + Ajax)
整体难度系数:★★☆☆☆

开发环境:Eclipse Oxygen 2017.6

目录:


  1. 整体介绍
  2. 前期准备
  3. 登录、注册界面及基本验证

1.整体介绍

首页:论坛帖子展示;搜索;分栏目;
个人中心:对当前用户帖子的增删改查;
个人资料:个人头像上传及昵称、密码的修改。

整体效果如下:

2.前期准备

1.数据库准备

这个小项目整体用到四张表:
用户表-user
帖子表-text
栏目表-category
回复表-reply

表之间的关系比较简单:text表和userId categoryId对应,一个用户可以发多个帖子,每个帖子对应唯一的栏目;
栏目表独立;
回复表reply和userId textId对应,一个评论对应一个用户,可以有多个评论,一个帖子也有多个评论。这些关系具体有什么用呢?在写SQL语句的时候,要考虑到。

整体表结构如下:

不为效率为熟悉命令,全部用cmd命令创建,创建命令如下及初始化部分数据(虚构):

#创建数据库create database db_bbs;use  db_bbs;#创建表create table user (userId int auto_increment primary key,userName varchar(50) not null,userNick varchar(50) not null,password varchar(50) not null,rePassword varchar(50) ,sex varchar(2),phone varchar(50),email varchar(50),IDNumber varchar(100),hobby varchar(50),province varchar(20),introduce varchar(1000),loginTime varchar(50),registerTime varchar(50));#创建帖子表create table text (textId int auto_increment primary key comment "帖子Id",title varchar(100) not null,context varchar(3000) not null,textTime varchar(50),categoryId int,userId int)comment="帖子表";#栏目表create table category (categoryId int auto_increment primary key,categoryName varchar(50) not null);#评论表create table reply (replyId int auto_increment primary key,replyContext varchar(10000) not null,replyTime varchar(50),textId int,userId int);#模拟用户insert into user (userName,userNick,password) values("admin","微笑感染嘴角","000000"),("admin1","舍我其谁","111111");#模拟帖子insert into text (title,context,textTime,categoryId,userId) values("这是小美的第一条帖子,关于Java的","Java从入门到放弃","2017-12-30 10:38:23",1,1),("这是小美的第二条帖子,关于MySQL的","MySQL从入门到放弃","2017-12-30 10:39:23",2,2),("这是小美的第三条帖子,关于大数据的","大数据从入门到放弃","2017-12-30 10:40:23",3,1),("这是小美的第四条帖子,关于人工智能的","人工智能从入门到放弃","2017-12-30 10:41:23",4,1),("这是小美的第六条帖子,关于HTML5的","HTML5从入门到放弃","2017-12-30 10:42:23",5,1),("这是小美的第七条帖子,关于生活的","生活从围城内到围城外","2017-12-30 10:50:23",6,2);#模拟栏目insert into category (categoryName) values("Java"),("MySQL"),("大数据"),("人工智能"),("HTML5"),("生活"),("有趣有料");#模拟评论insert into reply (replyContext,replyTime,textId,userId) values("哎呦喂,不错奥!","2017-12-30 10:48:43",1,1),("哎呦喂,不错奥!","2017-12-30 10:49:45",1,1),("哎呦喂,不错奥!","2017-12-30 10:50:45",1,1),("哎呦喂,不错奥!","2017-12-30 10:48:45",1,1),("哎呦喂,不错奥!","2017-12-30 10:52:45",1,1),("哎呦喂,不错奥!","2017-12-30 10:48:45",2,1),("哎呦喂,不错奥!","2017-12-30 10:55:45",2,1),("哎呦喂,不错奥!","2017-12-30 10:58:45",2,1),("哎呦喂,不错奥!","2017-12-30 10:59:45",2,1),("哎呦喂,不错奥!","2017-12-30 10:32:45",3,1),("哎呦喂,不错奥!","2017-12-30 10:12:45",3,1),("哎呦喂,不错奥!","2017-12-30 10:11:45",3,1),("哎呦喂,不错奥!","2017-12-30 10:10:45",4,1),("哎呦喂,不错奥!","2017-12-30 10:14:45",4,1);#查出来的结果应该是这样的:# 评论数:5 4 3 2 0 0 

2.包的准备

按照MVC分层设计思想,建好包之后如下:

3.登录注册


3.1 注册
3.1.1 注册页面设计
3.1.2 User实体类
3.1.3 前端验证
3.1.4 service dao controller

3.2 登录
3.2.1 登录页面设计
3.2.2 前端简单验证
3.2.2 service dao controller


3.1 注册
3.1.1 注册页面设计
注册获取信息比较全,前端验证比较简单,只是对非空做了判断,未加入正则表达式。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!--Author:Meice 2017年12月30日下午12:16:04 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>小确幸</title>
<!--  引入外部样式-->
<link href="css/register.css" rel="styleSheet" type="text/css"><!--非常重要的样式写在里面  -->
<style type="text/css">textarea{resize: none;}</style><!--引入JS验证  -->
<script type="text/javascript" src="js/register.js"></script></head>
<body><!--  引入头部--><jsp:include page="head.jsp"></jsp:include><!--  注册界面--><div id="registerForm"><form  name="regForm" action="addUser" method="get" onsubmit=" return checkRegisterForm()" ><!-- border="1px solid red"  --><table  cellspacing="15" cellpadding="10" style="padding-left: 60px"><tr><!-- align="center" --><td colspan="2" style="font-size:30px;font-weight:bolder;color:green;padding-left:130px;">注册</td></tr><tr><td colspan="2"><span id="regInfo" style="color:red;font-size:15px;font-weight:bolder;"></span></td></tr><tr><td>用户名</td><td><input type="text" name="userName" class="myInput" />   </td></tr><tr><td>昵称</td><td><input type="text" name="userNick" class="myInput"></td></tr><tr><td>密码</td><td><input type="password" name="password" class="myInput"></td></tr><tr><td>确认密码</td><td><input type="password" name="rePassword" class="myInput"></td></tr><tr><td>手机号</td><td><input type="text" name="phone" class="myInput"></td></tr><tr><td>邮箱</td><td><input type="text" name="email" class="myInput"></td></tr><tr><td>身份证号</td><td><input type="text" name="IDNumber" class="myInput"></td></tr><tr><td>性别</td><td><input type="radio" name="sex" value="男">男 &nbsp;&nbsp;&nbsp;<input type="radio" name="sex" value="女">女</td></tr><tr><td>爱好</td><td><input type="checkbox" name="hobby" value="篮球">篮球<input type="checkbox" name="hobby" value="游泳">游泳<input type="checkbox" name="bobby" value="象棋">象棋<input type="checkbox" name="bobby" value="钢琴">钢琴<input type="checkbox" name="hobby" value="蹦极">蹦极</td></tr><tr><td>省份</td><td><select name="province"><option value="" >选择省份</option><option value="陕西">陕西</option><option value="北京">北京</option><option value="广东">广东</option><option value="上海">上海</option></select></td></tr><tr><td>自我介绍</td><td><textarea name="introduce" placeholder="来段自我介绍呗..." cols="45" rows="3"></textarea></td></tr><tr><td colspan="2" align="center"><input type="submit" value="注册" style="width: 100px;height:30px;">&nbsp;&nbsp;&nbsp;<input type="reset" value="重置" style="width:100px;height:30px;"></td></tr></table></form></div><!--引入尾部  --><jsp:include page="foot.jsp"></jsp:include></body>
</html>

这里面头部和尾部直接加入另外的页面,使用的是include标签,非常灵活。

3.1.2 User实体类

注册是获取用户信息的关键环节,这里就尽可能多的获取信息喽。

package com.hmc.pojo;
/**
*
*2017年12月30日
*User:Meice
*下午8:23:36
*/public class User {//用户表/*** *        userId int auto_increment primary key,userName varchar(50) not null,userNick varchar(50) not null,password varchar(50) not null,rePassword varchar(50) ,sex varchar(2),phone varchar(50),email varchar(50),IDNumber varchar(100),hobby varchar(50),province varchar(20),introduce varchar(1000),loginTime varchar(50),registerTime varchar(50)*/private int userId;private String userName;private String userNick;private String password;private String rePassword;private String sex;private String phone;private String email;private String IDNumber;private String hobby;private String province;private String introduce;private String loginTime;private String registerTime;public User() {}public User(int userId, String userName, String userNick, String password, String rePassword, String sex,String phone, String email, String iDNumber, String hobby, String province, String introduce,String loginTime, String registerTime) {super();this.userId = userId;this.userName = userName;this.userNick = userNick;this.password = password;this.rePassword = rePassword;this.sex = sex;this.phone = phone;this.email = email;IDNumber = iDNumber;this.hobby = hobby;this.province = province;this.introduce = introduce;this.loginTime = loginTime;this.registerTime = registerTime;}public User( String userName, String userNick, String password, String rePassword, String sex,String phone, String email, String iDNumber, String hobby, String province, String introduce,String registerTime) {this.userName = userName;this.userNick = userNick;this.password = password;this.rePassword = rePassword;this.sex = sex;this.phone = phone;this.email = email;IDNumber = iDNumber;this.hobby = hobby;this.province = province;this.introduce = introduce;this.registerTime = registerTime;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserNick() {return userNick;}public void setUserNick(String userNick) {this.userNick = userNick;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRePassword() {return rePassword;}public void setRePassword(String rePassword) {this.rePassword = rePassword;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getIDNumber() {return IDNumber;}public void setIDNumber(String iDNumber) {IDNumber = iDNumber;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getIntroduce() {return introduce;}public void setIntroduce(String introduce) {this.introduce = introduce;}public String getLoginTime() {return loginTime;}public void setLoginTime(String loginTime) {this.loginTime = loginTime;}public String getRegisterTime() {return registerTime;}public void setRegisterTime(String registerTime) {this.registerTime = registerTime;}@Overridepublic String toString() {return "User [userId=" + userId + ", userName=" + userName + ", userNick=" + userNick + ", password=" + password+ ", rePassword=" + rePassword + ", sex=" + sex + ", phone=" + phone + ", email=" + email+ ", IDNumber=" + IDNumber + ", hobby=" + hobby + ", province=" + province + ", introduce=" + introduce+ ", loginTime=" + loginTime + ", registerTime=" + registerTime + "]";}}

3.1.3 前端验证

用JavaScript做简单的非空验证:
register.js


function checkRegisterForm() {//alert("进来了!");var regForm = document.regForm;var userName = regForm.userName.value;var userNick = regForm.userNick.value;var password = regForm.password.value;var rePassword = regForm.rePassword.value;var phone = regForm.phone.value;var email = regForm.email.value;var IDNumber = regForm.IDNumber.value;var sex = regForm.sex.value;var hobby = regForm.hobby;var province = regForm.province.value;var introduce = regForm.introduce.value;//alert(introduce);//获取提示信息span对象var regInfo = document.getElementById("regInfo");if(userName == "") {regInfo.innerHTML = "请填写【用户名】:";regForm.userName.focus();return false;}else if(userNick == "") {regInfo.innerHTML = "请填写【昵称】";regForm.userNick.focus();return false;} else if(password == "") {regInfo.innerHTML = "请填写【密码】";regForm.password.focus();return false;}else if(rePassword == "") {regInfo.innerHTML = "请【确认密码】";regForm.rePassword.focus();return false;}else if(phone == "") {regInfo.innerHTML = "请填写【手机号】";regForm.phone.focus();return false;}else if(email == "") {regInfo.innerHTML = "请填写【邮箱】";regForm.email.focus();return false;}else if(IDNumber == "") {regInfo.innerHTML = "请输入【身份证号】";regForm.IDNumber.focus();return false;}else if(sex == "") {regInfo.innerHTML = "请选择【性别】";//regForm.sex.focus();//这里千万不能聚焦!return false;}else if(!checkHobby()) {regInfo.innerHTML = "请选择【爱好】";//regForm.hobby.focus();//这里也类似//alert(hobby);return false;}else if(province == "") {regInfo.innerHTML = "请选择【省份】";return false;}else if(introduce == "") {regInfo.innerHTML = "请填写【自我介绍】";regForm.introduce.focus();return false;}else {return true;}/**if(select.selectedIndex ==0){alet("进来了");regInfo.innerHTML = "请选择【省份】";//存在的问题是没法验证省份是否选择,总是进不了选择语句!return false;}*/}//判断复选框   要知道爱好是个数组,不能直接.value的来判断啊  纠结了近1个多小时!
function  checkHobby() {var regForm = document.regForm;var hobby = regForm.hobby;var flag = false;for(var i=0;i<hobby.length;i++) {if(hobby[i].checked){flag = true;break;}else {}}return flag;
}

当然,加入正则更加精确,同时可以使用jQuery 自带的验证。

3.1.4 service dao controller

UserRegisterDao
UserRegisterDaoImpl

UserRegisterService
UserRegisteServiceImpl

UserRegisterServlet


UserRegisterDao

package com.hmc.dao;import com.hmc.pojo.User;/**
*
*2017年12月30日
*User:Meice
*下午8:33:32
*/
public interface UserRegisterDao {//1.增加用户方法int addUser(User user);//2.封装Cud方法int Cud(String sql,Object[] params);
}

UserRegisterDaoImpl

package com.hmc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import com.hmc.pojo.User;
import com.hmc.util.DBUtil;
import com.hmc.util.GetPreparedStatementUtil;/**
*
*2017年12月30日
*User:Meice
*下午8:34:06
*/
public class UserRegisterDaoImpl implements UserRegisterDao {//注册用户 此方法完全可以用Cud方法取而代之!@Overridepublic int addUser(User user) {Connection conn = DBUtil.getConn();PreparedStatement ps = null;String sql = "insert into user (userName,userNick,password,rePassword,sex,hobby,province,introduce,registerTime,email,IDNumber,phone) values "+ "(?,?,?,?,?,?,?,?,?,?,?,?)";Object[] params = {user.getUserName(),user.getUserNick(),user.getPassword(),user.getRePassword(),user.getSex(),user.getHobby(),user.getProvince(),user.getIntroduce(),user.getRegisterTime(),user.getEmail(),user.getIDNumber(),user.getPhone()};ps = GetPreparedStatementUtil.getPs(conn, ps, sql, params);//执行语句try {int result = ps.executeUpdate();return result;} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.closeConn(conn, ps, null);}return 0;}//增删改@Overridepublic int Cud(String sql, Object[] params) {Connection conn = DBUtil.getConn();PreparedStatement ps = null;ps = GetPreparedStatementUtil.getPs(conn, ps, sql, params);//执行语句try {int result =  ps.executeUpdate();return result;} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.closeConn(conn, ps, null);}return 0;}}

UserRegisterService

package com.hmc.service;import com.hmc.pojo.User;/**
*
*2017年12月30日
*User:Meice
*下午8:31:29
*/
public interface UserRegisterService {//1.注册用户方法int addUser(User user);//2.封装Cud方法int Cud(String sql,Object[] params);}

UserRegisteServiceImpl

package com.hmc.service;import com.hmc.dao.UserRegisterDaoImpl;
import com.hmc.pojo.User;/**
*
*2017年12月30日
*User:Meice
*下午8:32:58
*/
public class UserRegisterServiceImpl implements UserRegisterService {//注册用户@Overridepublic int addUser(User user) {return  new UserRegisterDaoImpl().addUser(user);}//增删改@Overridepublic int Cud(String sql, Object[] params) {return new UserRegisterDaoImpl().Cud(sql, params);}}

UserRegisterServlet
这里就给数据库增加一条数据即可。

package com.hmc.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hmc.pojo.User;
import com.hmc.service.UserRegisterServiceImpl;
import com.hmc.util.GetFormatTimeUtil;/**
*
*2017年12月30日
*User:Meice
*下午8:20:24
*/
public class UserRegisterServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("进来了");//1.接收页面用户注册的值String userName = req.getParameter("userName");String userNick = req.getParameter("userNick");String password = req.getParameter("password");String rePassword = req.getParameter("rePassword");String sex = req.getParameter("sex");String[] hobbies = req.getParameterValues("hobby");String province = req.getParameter("province");String introduce = req.getParameter("introduce");String email = req.getParameter("email");String IDNumber = req.getParameter("IDNumber");String phone = req.getParameter("phone");String registerTime = GetFormatTimeUtil.getFormatTime(24);System.out.println("注册用户信息:"+userName +"  "+userNick+"  "+password+"  "+rePassword+"  "+sex+"  "+hobbies+"  "+province+ "  "+introduce+"  "+email+"  "+IDNumber+"  "+phone+"  "+registerTime);//String hobby = hobbies.toString();//行不通[Ljava.lang.String;@7c18b07bString hobby = "";for(int i=0;i<hobbies.length;i++) {hobby += hobbies[i]+"";}System.out.println(hobby);User user = new User();user.setUserName(userName);user.setUserNick(userNick);user.setPassword(rePassword);user.setRePassword(rePassword);user.setSex(sex);user.setHobby(hobby);user.setProvince(province);user.setIntroduce(introduce);user.setRegisterTime(registerTime);user.setEmail(email);user.setPhone(phone);user.setIDNumber(IDNumber);//2.调用为user表插入数据的方法UserRegisterServiceImpl urs = new UserRegisterServiceImpl();int result = urs.addUser(user);//3.跳转页面  用户注册成功,跳转登录界面,用户注册失败,弹出框给提示!if(result>0) {//注册成功!提示恭喜注册成功!2S后跳转登录界面Thread thread = new Thread();//resp.getWriter().write("<script type='text/javascript'>alert('系统将在222');</script>");try {thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}resp.sendRedirect("login.jsp");}else {//注册失败,提示失败,重新注册!resp.sendRedirect("register.jsp");}}
}

3.2 登录
3.2.1 登录页面设计
3.2.2 前端简单验证
3.2.2 service dao controller


3.2 登录
3.2.1 登录页面设计

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!--Author:Meice 2017年12月30日下午3:20:45 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>小确幸论坛</title><!--  引入外部样式-->
<!-- <link href="css/login.css" rel="styleSheet" type="text/css"> -->
<link href="css/login.css" rel="stylesheet" type="text/css"><!--引入外部JS  -->
<script type="text/javascript" src="js/login.js"></script></head>
<body><%String userName  = "";String password = "";Cookie[] cookies =   request.getCookies();//判断是否为null这一步很关键,如果没有判断,第一次访问没有任何cookie,就报错NullPointException 第二次访问,才会访问到。if(cookies!= null) {for(int i=0;i<cookies.length;i++) {if(cookies[i].getName().equals("userName")) {userName =    cookies[i].getValue();System.out.println("cookie里面的用户名:"+userName);}if(cookies[i].getName().equals("password")) {password = cookies[i].getValue();System.out.println("cookie里面的密码:"+password);}}}%><!--  引入头部 --><jsp:include page="head.jsp"></jsp:include><!-- 登录首页 --><div id="loginForm"><form  name="loginForm" action="login" method="get" onsubmit="return checkLoginForm()" ><table cellspacing="20" ><tr><td colspan="2"  align="center" style="font-size:25px;font-weight:bolder;color:green">登录</td><span><a href="register.jsp">还没有账号?立即注册</a></span></tr><tr><td colspan="2"><span id="loginInfo" style="font-size:15px;color:red;font-weight:bolder;"></span></td></tr><tr><td align="center">用户名</td><td><input type="text" name="userName" class="myInput" value="<%=userName %>"></td></tr><tr><td align="center">密&nbsp;&nbsp;&nbsp;码</td><td><input type="password" name="password" class="myInput" value="<%=password %>" ></td></tr><tr><td align="center">验证码</td><td><input type="text" name="code" class="myInput"></td><img scr=""></tr><tr><td colspan="2" align="center"><input   id="remember" name="remember" value="1"  type="checkbox" style="width: 18px;height: 18px;">&nbsp;&nbsp;记住我? &nbsp;&nbsp;&nbsp;<a href="#">忘记密码?</a></td></tr><tr><td colspan="2" align="center"><input type="submit" value="登录"  style="width: 150px;height: 35px;"></td></tr></table></form></div><!--引入尾部  --><jsp:include page="foot.jsp"></jsp:include></body>
</html>

3.2.2 前端简单验证

login.js

//登录简单验证
function checkLoginForm() {//alert("进来了");//获取表单元素var lgForm = document.loginForm;var userName = lgForm.userName.value;var password = lgForm.password.value;var code = lgForm.code.value;var lgInfo = document.getElementById("loginInfo");if(userName == "") {//alert("用户名为空!");lgInfo.innerHTML = "请填写【用户名】";lgForm.userName.focus();return false;}else if(password == "") {lgInfo.innerHTML = "请填写【密码】";lgForm.password.focus();return false;}else if(code == "") {lgInfo.innerHTML = "请填写【验证码】";lgForm.code.focus();return false;}else {return true;}}

3.2.2 service dao controller
UserLoginDao
UserLoginDaoImpl

UserLoginService
UserLoginServiceImpl

UserLoginServlet

UserLoginDao
这个底层就是对登录用户查一下,并且返回一个用户,到时候首页面方便取值

package com.hmc.dao;import java.util.List;import com.hmc.pojo.User;/**
*
*2017年12月31日
*User:Meice
*下午1:10:00
*/
public interface UserLoginDao {//查 返回一个用户 返回用户列表都可以List<User> listUser (String sql,Object... params);}

UserLoginDaoImpl

package com.hmc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.hmc.pojo.User;
import com.hmc.util.DBUtil;
import com.hmc.util.GetPreparedStatementUtil;/**
*
*2017年12月31日
*User:Meice
*下午1:11:25
*/
public class UserLoginDaoImpl implements UserLoginDao {@Overridepublic List<User> listUser(String sql, Object... params) {Connection conn = DBUtil.getConn();List<User> list = new ArrayList<>();PreparedStatement ps = null;ps = GetPreparedStatementUtil.getPs(conn, ps, sql, params);ResultSet rs = null;//执行方法try {rs =    ps.executeQuery();while(rs != null && rs.next()) {User user = new User();user.setUserId(rs.getInt("userId"));user.setUserName(rs.getString("userName"));user.setUserNick(rs.getString("userNick"));user.setPassword(rs.getString("password"));user.setRePassword(rs.getString("rePassword"));user.setSex(rs.getString("sex"));user.setHobby(rs.getString("hobby"));user.setProvince(rs.getString("province"));user.setIntroduce(rs.getString("introduce"));user.setLoginTime(rs.getString("loginTime"));user.setRegisterTime(rs.getString("registerTime"));user.setEmail(rs.getString("email"));user.setPhone(rs.getString("phone"));user.setIDNumber(rs.getString("IDNumber"));list.add(user);}return list;} catch (SQLException e) {e.printStackTrace();}finally {DBUtil.closeConn(conn, ps, rs);}return null;}}

UserLoginService

package com.hmc.service;
/**
*
*2017年12月31日
*User:Meice
*下午1:08:21
*/import java.util.List;import com.hmc.pojo.User;public interface UserLoginService {//查 返回一个用户 返回用户列表都可以List<User> listUser (String sql,Object... params);}

UserLoginServiceImpl

package com.hmc.service;import java.util.List;import com.hmc.dao.UserLoginDaoImpl;
import com.hmc.pojo.User;/**
*
*2017年12月31日
*User:Meice
*下午1:10:32
*/
public class UserLoginServiceImpl implements UserLoginService {@Overridepublic List<User> listUser(String sql, Object... params) {//调用UserLoginDao方法return new UserLoginDaoImpl().listUser(sql, params);}}

UserLoginServlet
这里就主要实现:判断用户是否存在,存在就登录,然后把用户放到cookie或者session里面

package com.hmc.controller;import java.io.IOException;
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 com.hmc.pojo.TextShow;
import com.hmc.pojo.User;
import com.hmc.service.TextShowService;
import com.hmc.service.TextShowServiceImpl;
import com.hmc.service.UserLoginService;
import com.hmc.service.UserLoginServiceImpl;
import com.hmc.util.GetFormatTimeUtil;
import com.hmc.util.GetStrToInt;/**
*
*2017年12月31日
*User:Meice
*上午9:06:13
*/
public class UserLoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("执行登录操作....");//1.接收登录参数String userName = req.getParameter("userName");String password = req.getParameter("password");String code = req.getParameter("code");String remember = req.getParameter("remember");//2.所有的操作前提都是用户存在UserLoginService uls = new UserLoginServiceImpl();String sql = "select * from user where userName = ? and password = ?";Object[] params = {userName,password};List<User> list =    uls.listUser(sql, params);User user = null;//避免java.lang.IndexOutOfBoundsException: Index: 0, Size: 0if(list.size()>0) {user = list.get(0);}//用户存在情况在存在cookie里面if(user ==null) {//证明用户不存在,提示登录失败,重新登录System.out.println("用户不存在,请重新登录");resp.sendRedirect("login.jsp");}else {//根据是会否记住,选择是否存Cookieif( remember!= null && remember.equals("1")) {System.out.println("增加存储到Cookie的操作。。。。。");Cookie cookie = new Cookie("userName", userName);Cookie cookie2 = new Cookie("password", password);cookie.setMaxAge(60*60*24*10);cookie2.setMaxAge(60*60*24*10);//当然是在添加cookie之前设置生命时间resp.addCookie(cookie);resp.addCookie(cookie2);}//3.无论记住与否,都要存在session里面,并且调用方法跳转首页显示帖子//保存一下登录时间String loginTime = GetFormatTimeUtil.getFormatTime(24);user.setLoginTime(loginTime);System.out.println("登录用户所有信息:"+user);req.getSession().setAttribute("user", user);req.getRequestDispatcher("textShow").forward(req, resp);}}
}

补充:
既然都发表了,那把注册、登录CSS样式也带上吧,里面部分属性方便以后查看。
register.css
login.css

register.css

@CHARSET "UTF-8";
/*--Author:Meice
2017年12月30日 下午12:59:07*//*设置整体注册框位置  */
#registerForm{width:500px;height:500px;margin:40px 0px 0px 450px;}/*设置对应Input框样式  */
.myInput{width: 200px;height: 30px;}/* 设置外边框 */
#registerForm table{border-style: inset;border-color: green;}

login.css

@CHARSET "UTF-8";
/*--Author:Meice
2017年12月30日 下午3:32:25*/*{margin:0px;padding:0px;}/* 设置登录框整体样式 */
#loginForm{/* border:1px solid red; */margin:50px 0px 200px 500px;width:440px;height:410px;border-style: inset;border-color:green;}/* 设置input样式  因为这里比较统一,好设置*/
.myInput{width:220px;height:30px;}/* 去掉a标签下划线 */
a{text-decoration:none;
}/*表格居中  */
#loginForm table{margin-left:50px;}

哈哈,是不是有点繁琐~有点事无巨细的感觉。罢了,就这样吧,这次目的是完成的过程,笔者也把整体过程录制了下来。

好了,各位读者朋友,再会!下篇将实现展示首页。

小确幸BBS论坛-1-前期准备相关推荐

  1. 小确幸BBS论坛-6-优化不止步!

    话说: 各位读者朋友,中午好!春节越来越近,归家心切丫! 前面一系列博客详细介绍了过程,但是没有复盘,这结尾的2篇博客就完成这件事. 这篇博客目标:优化小确幸论坛. 小确幸BBS论坛-1-5实现了最核 ...

  2. 小确幸BBS论坛-3-个人中心

    话说: 各位读者朋友,晚上好!前面介绍了注册登录.首页,本篇介绍个人中心 难度系数:★★☆☆☆ 目录 1.页面展示 2.个人中心pojo 3.个人中心帖子列表.发帖.修改.删除 1.页面展示 user ...

  3. 冬日里的小确幸无非是美味在旁

    你的生活是怎样的呢?每个人可能都会有不同的回答,对待生活的方式也不近相同.一日三餐,对于奔波的人可能仔细地去运作完成. 美食,在很大程度上给予了我们幸福感,也决定了你的生活态度. 冬日里不管是早起的你 ...

  4. 双11:天猫要“软着陆”,商家要“小确幸”

    世事如棋局局新,关关难过关关过.今年的双11,还是有不少变化的. 比如,满减的门槛降低.双11的满减变化,其实可以解读很多信息.2019年以及之前是"满400减50",2020年是 ...

  5. 计算机课堂热身游戏,童年小确幸 儿时电脑课里我们玩不腻的13个小游戏

    原标题:童年小确幸 儿时电脑课里我们玩不腻的13个小游戏 还记得小时候电脑课一到教室就是先开史莱姆之家下载小游戏到电脑裡来玩,因为那时候老师根本不给你网络上网, 但是那时候的小孩都很知足,只要随便一个 ...

  6. 华为盒子显示服务器繁忙,繁忙都市中的“小确幸”

    随着经济和网络的不断发展,现代人的生活被不断挤压,做不完的工作,赶不完的应酬和酒局,在繁忙的都市中似乎永远都慢不下来.走在下班回家的路上,想想自己已经有多久不曾好好读书:有多久没有完整看一部电影:又有 ...

  7. 飞利浦css5530+g评测,影院不开门,给生活多点小确幸,飞利浦CSS5235家庭影院开箱评测...

    原标题:影院不开门,给生活多点小确幸,飞利浦CSS5235家庭影院开箱评测 电影院已经停摆半年了,最后一次买电影票还是春节档,只是被自动退票了.最近的电影要么在电视上看,要么在电脑上看,视觉效果无法改 ...

  8. 小确幸与大抱负:为何自拍类APP成为新宠?

    新春伊始,自拍美图类APP成了香饽饽. 专注于自拍P图的美图,于2017年登陆港股,目前市值达400多亿港元.就在近日,消息称专注于自拍P图的Faceu激萌被今日头条以3亿美金收购.无独有偶,早在今年 ...

  9. 小时候计算机课玩的那个兔子的游戏是什么,童年小确幸 儿时电脑课里我们玩不腻的13个小游戏...

    还记得小时候电脑课一到教室就是先开史莱姆之家下载小游戏到电脑裡来玩,因为那时候老师根本不给你网络上网, 但是那时候的小孩都很知足,只要随便一个小游戏都可以让人玩一个下午. 有时候懒的下载还会直接存在3 ...

最新文章

  1. Mac系统兼容软件 CrossOver 试用到期了怎么办
  2. 常见的IE浏览器的一些兼容问题及解决方法
  3. hdu 4529(状态dp)
  4. sdut 图的深度遍历
  5. java中的switch的规则_细细讲述Java技术开发的那些不为人知的规则
  6. n个1组成的整数能被2013整除c语言,求大神解算法,“编写程序,求n至少为多大时,n个1组成的整数能被2013 整除。”...
  7. Snabbdom(虚拟dom-8-removeVnodes函数)
  8. SystemVerilog中根据系统时间产生随机数的函数
  9. 如何对CentOS FTP服务配置 - 51CTO.COM
  10. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;...
  11. Arduino 工控板开发
  12. 亚马逊云服务(AWS)机器学习服务Amazon SageMaker发力中国
  13. python动作识别库_教你快速使用OpenCV/Python/dlib进行眨眼检测识别!
  14. web自动化测试 -- katalon recorder
  15. 《大话移动通信(第2版)》赠书活动名单公告
  16. 西游记中泾河龙王泄露天机惨遭砍头,而袁守诚为何安然无恙
  17. 黄褐斑激光-百花净斑方
  18. 古文观止卷七_春夜宴桃李園序_李白
  19. 可信启动、安全启动:SGX、TrustZone、SecureEnclave
  20. 计算机怎么把安全设置降低,如何设置浏览器的安全级别,怎么降低浏览器安全级别...

热门文章

  1. 这个好用高效的读书笔记app软件一定要收藏
  2. 重要更新|Amazon S3 和 CloudFront 已迁移至 Amazon Trust Services
  3. centos 7.5 安装桌面环境及报错
  4. [乐意黎原创] JavaScript中数组使用总结
  5. oracle外部表报错ora29400,报错ORA-29913 ORA-29400
  6. 边际效用价值论:从钻石和水的悖论谈起
  7. 仿微信翻译----本地短信翻译。
  8. 计算机毕设(附源码)JAVA-SSM绩效考核管理系统
  9. ajax初始化 ztree v3,zTree_v3
  10. 《jsp程序设计》智多星手机销售网后台设计