开发模型
JSP+Servlet+JavaBean
视图+ 请求 + 实例化
MVC设计模式
模型 + 视图 + 控制器
javabean jsp servlet
登录页面
1.优化成mvc结构
login.jsp中只负责显示登录页面
故将验证代码的部分删除
在LoginController里,将显示页面部分的代码删除
login.jsp如下
<%@ page import="util.StrUtil" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="../../errorPage.jsp" %>
<html>
<head>
<title>goudongxi</title>
</head>
<body>
<img src = "./images/rog.jpg">
<form action ="./login" method="post"> <%--action,把表单数据提交到,验证方法处--%>
登录名称:<input type="text" name="loginName"><br>
登录密码:<input type="password" name="loginPwd"><br>
验证码:<input type="text" name="validCode"><img src="./captche" width="100" height="60"><br>
<input type="submit" value="登录" ><input type="reset" value="取消">
</form>
</body>
</html>
2.创建两个页面,fail.jsp , main.jsp
用于跳转,登录成功,登录失败两个页面
例如:
fail.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录失败,败北原因:<%=request.getAttribute("msg")%> 败犬请<a href="login">重新登录</a>
<%--因为在同一个请求内,所以继续用request获取错误原因:msg--%>
</body>
</html>
main.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录成功,爱你我的<%=request.getAttribute("name")%>宝贝
<%--这个request的name,源于LoginController.java-57行--%>
</body>
</html>
3.优化登录失败方法类
/**
*登录失败跳转方法类
*/
private void loginFail(HttpServletRequest req, HttpServletResponse resp,String msg) throws ServletException, IOException {
req.setAttribute("msg",msg);//将msg的值带到失败登陆界面 //上面这个throws,是光标移动到下面forward上抛出异常
req.getRequestDispatcher("/WEB-INF/template/fail.jsp").forward(req,resp); //跳转到登录失败界面
//resp.sendRedirect("/login?msg=" + msg);
/**
* req.getRequestDispatcher方法,适用于正在做未完成
* resp.sendRedirect方法,适用于已做完
*/
将页面放入WEB-INF,不让用户直接访问
1.创建template在web-inf底下
放入,需要放入的文件,目前是
login.jsp
main.jsp
fail.jsp
#登陆系统完整代码:
视图,jsp:
login.jsp
<%@ page import="util.StrUtil" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="../../errorPage.jsp" %>
<html>
<head>
<title>goudongxi</title>
</head>
<body>
<img src = "./images/rog.jpg">
<form action ="./login" method="post"> <%--action,把表单数据提交到,验证方法处--%>
登录名称:<input type="text" name="loginName"><br>
登录密码:<input type="password" name="loginPwd"><br>
验证码:<input type="text" name="validCode"><img src="./captche" width="100" height="60"><br>
<input type="submit" value="登录" ><input type="reset" value="取消">
</form>
</body>
</html>
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录成功,爱你我的<%=request.getSession().getAttribute("name")%>宝贝
<%--这个request的name,源于LoginController.java-57行--%>
</body>
</html>
fail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录失败,败北原因:<%=request.getAttribute("msg")%> 败犬请<a href="login">重新登录</a>
<%--因为在同一个请求内,所以继续用request获取错误原因:msg--%>
</body>
</html>
LoginController
import util.StrUtil;
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.io.IOException;
import java.io.PrintWriter;
import java.rmi.server.ExportException;
/**
* 开发文档注释
* Servlet.用于进行登录验证
*/
@WebServlet("/login")
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = req.getParameter("msg");//取得数据msg
req.setAttribute("msg",msg);//再将其打包发送
req.getRequestDispatcher("/WEB-INF/template/login.jsp").forward(req,resp); //转发,跳转到login.jsp,并把req,resp转过去
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String loginName = req.getParameter("loginName");
String loginPwd = req.getParameter("loginPwd");
//登录名称为学号,密码为1234,那么显示下面的内容,柔则显示账号或密码错误
String validCode = req.getParameter("validCode");//获取到用户输入的验证码
String saveCode = (String)req.getSession().getAttribute("code");//强制转化为String,并取出识别码
// 将code强制转换成String类型 找req要getSession里getAttribute的code
String msg=null;
if(loginName.equals("5197101236") && loginPwd.equals("1234")) { //第一个if判断账号密码是否正确
if(StrUtil.isBlank(validCode)){//第二个if调用工具类,判断验证码是否为空
loginFail(req,resp,"请输入验证码");
}else {
if(validCode.equals(saveCode)){//第三个if判断用户输入的验证码,是否与生成的一致
req.getSession().setAttribute("name" ,loginName); //让req,带着msg命名为name,去需要它的地方
//因为loginName需要经常调用,所以放在session里
resp.sendRedirect("main");//客户端重定向跳转到mian
req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req,resp);//登录成功后,跳转到main.jsp
}else {
loginFail(req,resp,"验证码错误");
}
}
}else {
loginFail(req,resp,"账号或密码错误");
}
}
/**
*登录失败跳转方法类
*/
private void loginFail(HttpServletRequest req, HttpServletResponse resp,String msg) throws ServletException, IOException {
req.setAttribute("msg",msg);//将msg的值带到失败登陆界面 //上面这个throws,是光标移动到下面forward上抛出异常
req.getRequestDispatcher("/WEB-INF/template/fail.jsp").forward(req,resp); //通过服务端跳转到登录失败界面
//resp.sendRedirect("/login?msg=" + msg);//作用,跳转到指定页面; 方法:客户端的重定向,此时不能再用req去传参数
/**
* req.getRequestDispatcher方法,适用于正在做未完成的请求
* resp.sendRedirect方法,适用于已做完
*/
}
}
CaptcheController
import util.StrUtil;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
/**
* Servlet.用来随机生成多个字符的验证码
*/
@WebServlet("/captche")
public class CaptcheController extends HttpServlet {
private final int WIDTH=300;
private final int HIGH=240;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedImage img =new BufferedImage(WIDTH,HIGH,BufferedImage.TYPE_INT_RGB);
//申请内存空间,选择其长宽,颜色格式
Graphics g =img.getGraphics();//因为常用,所以保存到一个空间里
g.setColor(Color.white);//设置背景颜色
String code = StrUtil.randomString(4);//调用StrUtil里的randomString方法把字符串取进来
//这里可以每次取一个字符,然后进行单独调整
HttpSession session = req.getSession(); //用户请求,取session对象
session.setAttribute("code",code); //在生成验证码的部分进行存储,以便验证
// //生成一个口袋,用来放code
g.fillRect(0,0,WIDTH,HIGH);//填充
g.setFont(new Font("宋体",Font.BOLD,100));//设置字体格式
for(int i=0;i<code.length();i++){//验证码随机取色
Random num = new Random();
g.setColor(new Color(num.nextInt(255),num.nextInt(255),num.nextInt(255))); //设置颜色,它的红,绿,蓝都在0~255之间随机
double radis=Math.toRadians(num.nextInt(180));//要旋转的角度,从0~180中任选一个,toradians是把角度转化为弧度
}
g.drawString(code,50,150);//选择画笔开始位置
//干扰线和噪点要写在随机数绘制前,不然会全变色
for (int i = 0; i < 30; i++) {//生成干扰线 i表示数量
Random line = new Random();
int x = line.nextInt(WIDTH);//让xy随机取一个画布中间大小的数值
int y = line.nextInt(HIGH);
int xl = line.nextInt(WIDTH);
int y1 = line.nextInt(HIGH);
g.setColor(new Color(line.nextInt(255),line.nextInt(255),line.nextInt(255))); //设置颜色,它的红,绿,蓝都在0~255之间随机
g.drawLine(x,y,xl,y1);
}
g.setColor(Color.black);
for(int i = 0;i<5000;i++) {//生成噪点 i表示数量
Random ran = new Random();
int x = ran.nextInt(WIDTH);
int y = ran.nextInt(WIDTH);
g.setColor(new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255))); //设置颜色,它的红,绿,蓝都在0~255之间随机
g.drawOval(x, y, 1, 1);
}
g.dispose();//结束图像绘制
ServletOutputStream out = resp.getOutputStream();
ImageIO.write(img, "JPEG",out);
try{//未防止传出出错,则给它加一个异常捕捉
out.flush();//防止文件在缓冲区未传出,确保其传出
}catch(Exception ex){}
finally{//使不论传出是否完成,都必定执行,关闭通道的命令
out.close();
}
}
}
MainController
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.io.IOException;
@WebServlet("/main")
public class MainController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req,resp);
//使用doget方法,跳转到main.jsp
}
}