Java打怪之路-----JavaWeb之书城项目(三)

本文介绍了在Web开发中如何处理登录和注册时的错误信息回显,以及如何通过隐藏字段和反射技术优化Servlet代码。讨论了在登录失败时将错误信息保存在request域中,并在JSP页面中判断并显示,同时展示了如何使用反射减少if判断,提高代码复用性。最后提到了BeanUtils工具和EL表达式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)替换内容

在响应的目录ctrl+shift+R
在这里插入图片描述

(二)错误信息回显

解决思路(这里需要三个修改):
1、在servlet程序中,当用户名或者密码输入错误时,将数据保存在request域对象中
(其实这里可以想象为什么要保存在request域中。答:request域对象中保存的数据,在发送另一次请求后就失败,我第一次提交保存的是第一次请求的数据,此时回显的是第一次请求的数据,第二次提交保存的是第二次请求的数据,此时应该要回显第二次请求的数据)
2、在jsp页面中对错误信息进行判断,如果错误信息值不为空,就输出错误信息
3、在jsp页面中对需要回显的信息进行判断,如果输入有误,就将其保存在输入框的value中

//Servlet
if(userService.login(user)==null){
            System.out.println("用户名或密码错误");
            //如果产生错误将回显信息放到req域中
            req.setAttribute("msg","用户名或密码错误");
            req.setAttribute("username",username);
            req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
        }else{
            req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
        }
//jsp 错误信息
<span class="errorMsg"><%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%></span>
//jsp输入框回显
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username"
value="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>"/>

(三)代码优化

一般业务中的servlet一个功能对应一个,user业务对应一个UserServlet程序。所以需要将其进行简化

3.1使用hidden进行优化

解决思路:
1、编写UserServlet
2、在jsp页面form表单添加hidden

public class UserServlet extends HttpServlet {
    UserService userService= new UserServiceImpl();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");

        if("login".equals(action)){
            login(request,response);
        }else if("regist".equals(action)){
            regist(request,response);
        }
    }
    protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        User user=new User(null,username,password,null);
        if(userService.login(user)==null){
            System.out.println("用户名或密码错误");
            //如果产生错误将回显信息放到req域中
            req.setAttribute("msg","用户名或密码错误");
            req.setAttribute("username",username);
            req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
        }else{
            req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
        }

    }
    protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        String email=req.getParameter("email");
        String code=req.getParameter("code");
        //首先看验证码是否正确
        if("abcde".equalsIgnoreCase(code)){
            if(userService.existsUsername(username)){
                System.out.println("用户名已经存在");
                req.setAttribute("msg","用户名已经存在");
                req.setAttribute("username",username);
                req.setAttribute("email",email);
                req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
            }else{
                userService.registUser(new User(null,username,password,email));
                req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);
            }
        }
        else{
            req.setAttribute("msg","验证码错误");
            req.setAttribute("username",username);
            req.setAttribute("email",email);
            System.out.println("验证码错误");
            req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);

        }
    }


}

<form action="userServlet" method="post">
									<input type="hidden" name="action" value="login" />
									<label>用户名称:</label>
									<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username"
									value="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>"
									/>

3.2使用反射进行优化

为什么要使用反射呢?我们可以看到在上一步中存在大量的if判断语句,并且action与login等业务的名称是相同的。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");
        //获取action业务鉴别字符串,获取相应的业务 方法反射对象
        try {
            Method method=this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务 方法
            method.invoke(this,request,response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

为什么传递的是.class而不直接传入参数?
反射是根据参数类型获取具体的方法,传递的是.class。等到调用invoke方法的时候才把实参,也就是req和resp传递给方法

3.3使用baseServlet进行优化

在这里插入图片描述

将父类方法定义成abstract的原因是:方便调用。当Post请求进入userServlet后会寻找post方法,没有找到就去调用父类的Post方法,子类userServlet中没有重写父类Post方法
将UserServlet中的dopost方法中的内容移到baseServlet中就行了

(四)BeanUtils

可以一次性将所有请求的参数注入到JavaBean中。

(五)使用EL表达式

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值