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

(一)替换内容

在响应的目录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表达式

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44020747/article/details/117597833