MVC模式下,登录页面的基本功能雏形

开发模型

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
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值