java day49【綜合案例day01】

1 .前言

爲了鞏固web基礎知識,提高綜合運用能力,故而講解此案例。要求,每位同窗可以獨立完成此案例。css

2. 項目導入

點擊綠色+按鈕html

選擇travel項目的pom.xml文件,點擊ok,完成項目導入。須要等待一小會,項目初始化完成。前端

3. 啓動項目

3.1 方式一:

 

3.2    方式二:配置maven快捷啓動

4. 技術選型

4.1    Web層

a)         Servlet:前端控制器java

b)        html:視圖web

c)         Filter:過濾器ajax

d)        BeanUtils:數據封裝redis

e)         Jackson:json序列化工具sql

4.2    Service層

a)         Javamail:java發送郵件工具數據庫

b)        Redis:nosql內存數據庫json

c)         Jedis:java的redis客戶端

4.3    Dao層

d)        Mysql:數據庫

e)         Druid:數據庫鏈接池

f)          JdbcTemplate:jdbc的工具

 

5.  建立數據庫

-- 建立數據庫

CREATE DATABASE travel;

-- 使用數據庫

USE travel;

--建立表

         複製提供好的sql

 

6.  註冊功能

6.1   頁面效果

6.2    功能分析

6.3    代碼實現

6.3.1  前臺代碼實現

6.3.2  表單校驗

提高用戶體驗,並減輕服務器壓力。

//校驗用戶名
//單詞字符,長度820
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);


         });

 

6.3.3  異步(ajax)提交表單

在此使用異步提交表單是爲了獲取服務器響應的數據。由於咱們前臺使用的是html做爲視圖層,不可以直接從servlet相關的域對象獲取值,只能經過ajax獲取響應數據

6.3.4  後臺代碼實現

6.3.5  編寫RegistUserServlet

@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);
    }
}

6.3.6  編寫UserService以及UserServiceImpl

 

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;
    }
}

6.3.7  編寫UserDao以及UserDaoImpl

 

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());
    }
}

6.3.8  郵件激活

 

爲何要進行郵件激活?爲了保證用戶填寫的郵箱是正確的。未來能夠推廣一些宣傳信息,到用戶郵箱中。

6.3.9   發送郵件

  1. 申請郵箱
  2. 開啓受權碼
  3. 在MailUtils中設置本身的郵箱帳號和密碼(受權碼)
  4.  

 郵件工具類:MailUtils,調用其中sendMail方法能夠完成郵件發送

 

6.3.10   用戶點擊郵件激活

通過分析,發現,用戶激活其實就是修改用戶表中的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());
}

 

7.  登陸

7.1  分析

7.2  代碼實現

7.2.1  前臺代碼

7.2.2  後臺代碼

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;
}

7.2.3  index頁面中用戶姓名的提示信息功能

效果:

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);

8.  退出

什麼叫作登陸了?session中有user對象。

實現步驟:

  1. 訪問servlet,將session銷燬
  2. 跳轉到登陸頁面

代碼實現:

         Header.html

Servlet:

//1.銷燬session
request.getSession().invalidate();
//2.跳轉登陸頁面
response.sendRedirect(request.getContextPath()+"/login.html");
相關文章
相關標籤/搜索