爲了鞏固web基礎知識,提高綜合運用能力,故而講解此案例。要求,每位同窗可以獨立完成此案例。css
點擊綠色+按鈕html
選擇travel項目的pom.xml文件,點擊ok,完成項目導入。須要等待一小會,項目初始化完成。前端
a) Servlet:前端控制器java
b) html:視圖web
c) Filter:過濾器ajax
d) BeanUtils:數據封裝redis
e) Jackson:json序列化工具sql
a) Javamail:java發送郵件工具數據庫
b) Redis:nosql內存數據庫json
c) Jedis:java的redis客戶端
d) Mysql:數據庫
e) Druid:數據庫鏈接池
f) JdbcTemplate:jdbc的工具
-- 建立數據庫
CREATE DATABASE travel;
-- 使用數據庫
USE travel;
--建立表
複製提供好的sql
提高用戶體驗,並減輕服務器壓力。
//校驗用戶名
//單詞字符,長度8到20位
function checkUsername() {
//1.獲取用戶名值
var username = $("#username").val();
//2.定義正則
var reg_username = /^\w{8,20}$/;
//3.判斷,給出提示信息
var flag = reg_username.test(username);
if(flag){
//用戶名合法
$("#username").css("border","");
}else{
//用戶名非法,加一個紅色邊框
$("#username").css("border","1px solid red");
}
return flag;
}
//校驗密碼
function checkPassword() {
//1.獲取密碼值
var password = $("#password").val();
//2.定義正則
var reg_password = /^\w{8,20}$/;
//3.判斷,給出提示信息
var flag = reg_password.test(password);
if(flag){
//密碼合法
$("#password").css("border","");
}else{
//密碼非法,加一個紅色邊框
$("#password").css("border","1px solid red");
}
return flag;
}
//校驗郵箱
function checkEmail(){
//1.獲取郵箱
var email = $("#email").val();
//2.定義正則 itcast@163.com
var reg_email = /^\w+@\w+\.\w+$/;
//3.判斷
var flag = reg_email.test(email);
if(flag){
$("#email").css("border","");
}else{
$("#email").css("border","1px solid red");
}
return flag;
}
$(function () {
//當表單提交時,調用全部的校驗方法
$("#registerForm").submit(function(){
return checkUsername() && checkPassword() && checkEmail();
//若是這個方法沒有返回值,或者返回爲true,則表單提交,若是返回爲false,則表單不提交
});
//當某一個組件失去焦點是,調用對應的校驗方法
$("#username").blur(checkUsername);
$("#password").blur(checkPassword);
$("#email").blur(checkEmail);
});
在此使用異步提交表單是爲了獲取服務器響應的數據。由於咱們前臺使用的是html做爲視圖層,不可以直接從servlet相關的域對象獲取值,只能經過ajax獲取響應數據
@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//驗證校驗
String check = request.getParameter("check");
//從sesion中獲取驗證碼
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");//爲了保證驗證碼只能使用一次
//比較
if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
//驗證碼錯誤
ResultInfo info = new ResultInfo();
//註冊失敗
info.setFlag(false);
info.setErrorMsg("驗證碼錯誤");
//將info對象序列化爲json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
return;
}
//1.獲取數據
Map<String, String[]> map = request.getParameterMap();
//2.封裝對象
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.調用service完成註冊
UserService service = new UserServiceImpl();
boolean flag = service.regist(user);
ResultInfo info = new ResultInfo();
//4.響應結果
if(flag){
//註冊成功
info.setFlag(true);
}else{
//註冊失敗
info.setFlag(false);
info.setErrorMsg("註冊失敗!");
}
//將info對象序列化爲json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
//將json數據寫回客戶端
//設置content-type
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
/**
* 註冊用戶
* @param user
* @return
*/
@Override
public boolean regist(User user) {
//1.根據用戶名查詢用戶對象
User u = userDao.findByUsername(user.getUsername());
//判斷u是否爲null
if(u != null){
//用戶名存在,註冊失敗
return false;
}
//2.保存用戶信息
userDao.save(user);
return true;
}
}
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public User findByUsername(String username) {
User user = null;
try {
//1.定義sql
String sql = "select * from tab_user where username = ?";
//2.執行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
} catch (Exception e) {
}
return user;
}
@Override
public void save(User user) {
//1.定義sql
String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email) values(?,?,?,?,?,?,?)";
//2.執行sql
template.update(sql,user.getUsername(),
user.getPassword(),
user.getName(),
user.getBirthday(),
user.getSex(),
user.getTelephone(),
user.getEmail());
}
}
爲何要進行郵件激活?爲了保證用戶填寫的郵箱是正確的。未來能夠推廣一些宣傳信息,到用戶郵箱中。
郵件工具類:MailUtils,調用其中sendMail方法能夠完成郵件發送
通過分析,發現,用戶激活其實就是修改用戶表中的status爲‘Y’
分析:
發送郵件代碼:
修改保存Dao代碼,加上存儲status和code 的代碼邏輯
激活代碼實現:
ActiveUserServlet
//1.獲取激活碼
String code = request.getParameter("code");
if(code != null){
//2.調用service完成激活
UserService service = new UserServiceImpl();
boolean flag = service.active(code);
//3.判斷標記
String msg = null;
if(flag){
//激活成功
msg = "激活成功,請<a href='login.html'>登陸</a>";
}else{
//激活失敗
msg = "激活失敗,請聯繫管理員!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
UserService:active
@Override
public boolean active(String code) {
//1.根據激活碼查詢用戶對象
User user = userDao.findByCode(code);
if(user != null){
//2.調用dao的修改激活狀態的方法
userDao.updateStatus(user);
return true;
}else{
return false;
}
}
UserDao:findByCode updateStatus
/**
* 根據激活碼查詢用戶對象
* @param code
* @return
*/
@Override
public User findByCode(String code) {
User user = null;
try {
String sql = "select * from tab_user where code = ?";
user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),code);
} catch (DataAccessException e) {
e.printStackTrace();
}
return user;
}
/**
* 修改指定用戶激活狀態
* @param user
*/
@Override
public void updateStatus(User user) {
String sql = " update tab_user set status = 'Y' where uid=?";
template.update(sql,user.getUid());
}
LoginServlet
//1.獲取用戶名和密碼數據
Map<String, String[]> map = request.getParameterMap();
//2.封裝User對象
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.調用Service查詢
UserService service = new UserServiceImpl();
User u = service.login(user);
ResultInfo info = new ResultInfo();
//4.判斷用戶對象是否爲null
if(u == null){
//用戶名密碼或錯誤
info.setFlag(false);
info.setErrorMsg("用戶名密碼或錯誤");
}
//5.判斷用戶是否激活
if(u != null && !"Y".equals(u.getStatus())){
//用戶還沒有激活
info.setFlag(false);
info.setErrorMsg("您還沒有激活,請激活");
}
//6.判斷登陸成功
if(u != null && "Y".equals(u.getStatus())){
//登陸成功
info.setFlag(true);
}
//響應數據
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),info);
UserService
public User login(User user) {
return userDao.findByUsernameAndPassword(user.getUsername(),user.getPassword());
}
UserDao
public User findByUsernameAndPassword(String username, String password) {
User user = null;
try {
//1.定義sql
String sql = "select * from tab_user where username = ? and password = ?";
//2.執行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username,password);
} catch (Exception e) {
}
return user;
}
效果:
header.html代碼
Servlet代碼
//從session中獲取登陸用戶
Object user = request.getSession().getAttribute("user");
//將user寫回客戶端
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),user);
什麼叫作登陸了?session中有user對象。
實現步驟:
代碼實現:
Header.html
Servlet:
//1.銷燬session
request.getSession().invalidate();
//2.跳轉登陸頁面
response.sendRedirect(request.getContextPath()+"/login.html");