基于Servlet实现的微博的点滴记录(1)

其实这两天本是在期末复习的,但在自习的时候没法淡定地好好复习英语和数据库orz于是就翻出了林信良的《JSP&Servlet学习笔记》,白天在自习室里翻书,晚上回寝就照着码些代码,完成下课后习题。应该说拜上个寒假看U2B上Java Web相关教学视频的福吧,重要的概念是有那么个印象的,剩下的主要是各种api吧,当然也暴露许多自己不懂的事实(IO、Java2D啦),希望在跟书中项目的过程中可以记录下来,以求在将来用的到吧。

首先介绍下是个怎样的项目吧。目前完成的部分来看,包括了注册用户和登陆的功能,注册用户是通过保存为文件的形式。感觉其中最吸引我的,果然还是IO操作吧(Java SE没学好,不要婊我T T)。奉上Login.java和Register.java两个Servlet的代码:

package cc.bellchet58.controller;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理注册相关的Servlet
 * 将注册以文件的形式存储
 */
@WebServlet("/register.do")
public class Register extends HttpServlet {
    private static final String USERS = "/Users/bellchet58/Documents/workspace/Weibo/users/";
    private static final String SUCCESS_VIEW = "success.jsp";
    private static final String ERROR_VIEW = "error.jsp";

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//      取得请求参数
        String email = request.getParameter("email");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String confirmedPasswd = request.getParameter("confirmedPasswd");

//      验证请求参数
        List errors = new ArrayList();
        if(isInvalidEmail(email)){
            errors.add("未填写邮件或邮件格式不正确");
        }
        if(isInvalidUsername(username)){
            errors.add("用户名称为空或已存在");
        }
        if(isInvalidPassword(password,confirmedPasswd)){
            errors.add("请确认密码符合格式并再次确认密码");
        }
        String resultPage = ERROR_VIEW;
        if(!errors.isEmpty()){
            request.setAttribute("errors", errors);
        }else{
            resultPage = SUCCESS_VIEW;
//          创建用户资料
            createUserData(email,username,password);
        }

        request.getRequestDispatcher(resultPage).forward(request, response);


    }

    private void createUserData(String email, String username, String password) throws IOException{
        File userhome = new File(USERS +"/"+username);
        userhome.mkdir();
        BufferedWriter writer = new BufferedWriter(
                new FileWriter(userhome+"/profile"));
        writer.write(email+"\t"+password);
        writer.close();
    }

    private boolean isInvalidPassword(String password, String confirmedPasswd) {
        return password ==null ||
                password.length() < 6 ||
                password.length() > 16 ||
                !password.equals(confirmedPasswd);
    }

    private boolean isInvalidUsername(String username) {
//      System.out.println(username);
//      System.out.println(new File(USERS));
//      System.out.println(new File(USERS).list());
        for(String file:new File(USERS).list()){
            if(file.equals(username)){
                return true;
            }
        }
        return false;
    }

    private boolean isInvalidEmail(String email) {
        return email == null || !email.matches("^[_a-z0-9-]+([.]"
                +"[_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$");
    }

}

啊,OS是MacOSX,所以文件的路径会是那样啊,和windows稍微不太一样哈。最先写的时候遇上问题,也是和IO有关啦,就是路径的事。详细的,是"/Users/bellchet58/Documents/workspace/Weibo/users/" 这句原来是有问题的,因为一开始 我是写作"~/Documents/workspace/Weibo/users/" 的,但是有报错。因为用的是Mac嘛,很自然地就想偷懒,”~”这个符号的意思是/Users/你自己的用户名/,这点可以在控制台上用echo ~命令来确认。
~号所代表的

而实际上程序能识别的也就只有绝对路径和相对路径两种吧,如果才有相对路径的话,还得用上getServletContext().getRealPath() 来获得当前的Servlet的绝对路径来逆推回相对路径,十分不便。

还有就是缓冲写文件的方式值得一提(仅仅是我记不住啦。。)
BufferedWriter writer = new BufferedWriter(
new FileWriter(userhome+"/profile"));
writer.write(email+"\t"+password);

包括之前的步骤,先是创建用户名文件夹,然后在文件夹下建立对应的配置文件以记录邮箱和用户名,觉得还是蛮有意思的。

对应地,在Login.java部分的读取,也是BufferedReader+FileReader 的这种读取方式,再获取密码进行比对。

package cc.bellchet58.controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet 登录用
 */
@WebServlet("/login.do")
public class Login extends HttpServlet {
    private final static String USERS = "/Users/bellchet58/Documents/workspace/Weibo/users";
    private final String SUCCESS_VIEW = "member.jsp";
    private final String ERROR_VIEW = "index.html";

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if(checkLogin(username,password)){
            request.getRequestDispatcher(SUCCESS_VIEW).forward(request, response);
        }else{
            response.sendRedirect(ERROR_VIEW);
        }
    }

    private boolean checkLogin(String username, String password) throws IOException{
        if(username != null && password != null){
            for(String file:new File(USERS).list()){
                if(file.equals(username)){
                    BufferedReader reader = new BufferedReader(new FileReader(USERS+"/"+file+"/profile"));
                    String passwd = reader.readLine().split("\t")[1];
                    if(passwd.equals(password)){
                        return true;
                    }
                }
            }
        }
        return false;
    }

}

基于Servlet实现的微博的点滴记录(1)_第1张图片
基于Servlet实现的微博的点滴记录(1)_第2张图片
基于Servlet实现的微博的点滴记录(1)_第3张图片
基于Servlet实现的微博的点滴记录(1)_第4张图片

其实好像真没记录什么真正有意思的,毕竟其实大多时候其实是在照本宣,按书上的来,所以果然要记录也得挑自己思考创作的吧。所以这个系列。。可能会烂尾诶。

你可能感兴趣的:(Java,EE)