其实这两天本是在期末复习的,但在自习的时候没法淡定地好好复习英语和数据库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;
}
}
其实好像真没记录什么真正有意思的,毕竟其实大多时候其实是在照本宣,按书上的来,所以果然要记录也得挑自己思考创作的吧。所以这个系列。。可能会烂尾诶。