存储注册信息
创建实体类(entity)
package com.qf.entity;
import java.util.Arrays;
//实体类
public class Student {
private String username;
private String password;
private String sex;
private String[] hobby;
private String addrs;
public Student() {
}
public Student(String username, String password, String sex, String[] hobby, String addrs) {
this.username = username;
this.password = password;
this.sex = sex;
this.hobby = hobby;
this.addrs = addrs;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getAddrs() {
return addrs;
}
public void setAddrs(String addrs) {
this.addrs = addrs;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", hobby=" + Arrays.toString(hobby) +
", addrs='" + addrs + '\'' +
'}';
}
}
创建模拟数据库(DB)–DBCenter–list
package com.qf.DB;
import com.qf.entity.Student;
import java.util.ArrayList;
import java.util.List;
//模拟数据库
public class DBCenter {
//模拟数据表
public static List<Student> list = new ArrayList<>();
//验证码
//public static String code;
static {
list.add(new Student("zs","123","man",new String[]{"sleep"},"guandong"));
list.add(new Student("ls","123","man",new String[]{"sleep"},"jiangxi"));
}
}
业务:判断用户名是否存在,存在则不允许注册
package com.qf.servlet;
import com.qf.DB.DBCenter;
import com.qf.entity.Student;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//1.处理乱码问题
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//2.获取表单数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String[] hobby = request.getParameterValues("hobby");
String addrs = request.getParameter("addrs");
//3.进行数据判断,判断用户名是否存在
List<Student> list = DBCenter.list;
for (Student stu: list) {
if(stu.getUsername().equals(username)){
response.getWriter().write("用户名已存在,3秒后回到注册页面,或点击<a href='register.html'>注册页面<a/>");
//设置响应头,使页面3秒后跳转到指定路径,第一个参数refresh是刷新
response.setHeader("refresh","3;url=register.html");
return;
}
}
//4.创建实体对象,并且存进数据库
Student student = new Student(username, password, sex, hobby, addrs);
list.add(student);
response.getWriter().write("注册成功,3秒后跳转到登录页面,或点击<a href='login.jsp'>登录页面</a>");
response.setHeader("refresh","3;url=login.jsp");
}
}
登录功能
业务:判断用户名和密码是否一致
package com.qf.servlet;
import com.qf.DB.DBCenter;
import com.qf.entity.Student;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/*
* jsp:html+java
* */
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.乱码处理
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//2.获取表单数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//验证码判断
//前端输入的验证码
String code = request.getParameter("code");
/*存放在数据库中--不可行,因为多用户的话刷新会将前一个的值覆盖
if(!DBCenter.code.equals(code)){
request.setAttribute("msg","验证码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}*/
//存放在ServletContext中--不可行,服务器级别,
/*String code1 = (String)getServletContext().getAttribute("code");
if(!code1.equals(code)){
request.setAttribute("msg","验证码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}*/
//存放在session中--可行
String code1 = (String)request.getSession().getAttribute("code");
if(!code1.equals(code)){
request.setAttribute("msg","验证码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}
//存放在request中--不可行
/*String code1 = (String) request.getAttribute("code");
if(!code1.equals(code)){
request.setAttribute("msg","验证码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}*/
//3.判断用户名和密码是否正确
List<Student> list = DBCenter.list;
for (Student stu:list){
if(stu.getUsername().equals(username) && stu.getPassword().equals(password)){
//登录成功
response.getWriter().write("登录成功,3秒后跳转到首页;或者点击<a href='index.html'>首页</a>");
response.setHeader("refresh","3;url=index.html");
return;
}
}
/*//登录失败
response.getWriter().write("登录失败,3秒后跳转到登录页面;或者点击<a href='login.html'>登录页面</a>");
response.setHeader("refresh","3;url=login.html");*/
//登录失败,提示客户端用户名或者密码错误
//跳转:转发,重定向
//http://localhost:8080/Day37_req_resp/LoginServlet
//重定向--二次请求,url地址改变
//response.sendRedirect("register.html");
//转发--请求不改变,url地址不改变
//request.getRequestDispatcher("login.jsp").forward(request,response);
//服务器中存储数据的作用域:request(请求级别),session(会话级别)
//1.request(把数据存放在请求中)+转发--可行
request.setAttribute("msg","用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
//2.request+重定向--不可行,因为请求变了,第二次请求的request中没有msg
//request.setAttribute("msg","用户名或密码错误");
//response.sendRedirect("login.jsp");
//3.session+转发--可行
//HttpSession session = request.getSession();//获取session对象
//session.setAttribute("msg","用户名或密码错误");//在session中存储数据
//request.getSession().setAttribute("msg","用户名或密码错误");
//request.getRequestDispatcher("login.jsp").forward(request,response);
//4.session+重定向--可行
//request.getSession().setAttribute("msg","用户名或密码错误");
//response.sendRedirect("login.jsp");
}
}
- 重定向和转发:
- 重定向二次请求,url地址改变
- 转发一次请求,url地址不变
- request和session:
request
是请求级别的作用域,生命周期为一次请求session
是会话级别的作用域,生命周期为整个会话,每个用户独有ServletContext
是服务器级别的作用域,生命周期为服务器
JSP:本质是Servlet文件,等于html+java
<% %>:在jsp中执行java代码
<%= %>:在jsp中显示java数据
<%
//从请求中获取数据
String msg = (String)request.getAttribute("msg");
//从session中获取数据
//String msg = (String)request.getSession().getAttribute("msg");
%>
创建验证码
package com.qf.servlet;
import com.qf.DB.DBCenter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class CheckServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.实例化带缓冲区的图像数据对象
int width = 110;
int height = 50;
//第一个参数为图像的宽,第二个为高,第三个为图像颜色的类型(三原色)
BufferedImage bImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.通过对象获取画笔
Graphics graphics = bImage.getGraphics();
//3.设置画笔颜色--背景色
graphics.setColor(Color.GREEN);
//4.填充背景颜色
graphics.fillRect(0,0,width,height);//x轴开始,y轴开始,x轴结束,y轴结束
//5.改变画笔颜色
graphics.setColor(Color.RED);
//6.设置字体
graphics.setFont(new Font("宋体",Font.BOLD,20));
//7.绘制验证码
int code = 0;
Random ran = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0;i <4;i++){
code = ran.nextInt(10);
//给图像绘制验证码--内容,x轴,y轴
graphics.drawString(code+"",20+20*i,30);
sb.append(code+"");
}
//8.添加干扰线
graphics.setColor(Color.YELLOW);
for (int i = 0;i < 10;i++){
graphics.drawLine(ran.nextInt(width),ran.nextInt(height),ran.nextInt(width),ran.nextInt(height));
}
//存储验证码
//1.存储在数据库--不可行
//DBCenter.code = sb.toString();
//2.ServletContext--作用域为服务器级别--不可行
//getServletContext().setAttribute("code",sb.toString());
//3.session--作用域为会话级别--可行
request.getSession().setAttribute("code",sb.toString());
//4.request--作用域请求级别
//request.setAttribute("code",sb.toString());
//9.把绘制好的图像发送到前端页面
//第一个参数为图像对象,第二个参数为图像的格式,第三个参数为响应输出流
ImageIO.write(bImage,"jpg",response.getOutputStream());
}
}
ServletContext
服务器级别,存放访问量等公用的