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

来源:互联网 发布:名越seo 编辑:程序博客网 时间:2024/06/04 19:53

其实这两天本是在期末复习的,但在自习的时候没法淡定地好好复习英语和数据库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<String> errors = new ArrayList<String>();        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;    }}

会员注册页面
注册反馈
在主页登陆
登陆成功

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

0 0
原创粉丝点击