写点什么

Java 书城项目第三阶段:优化

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:4709 字

    阅读完需:约 15 分钟

修改成:


<%--这个地方通过为 request 域加入域对象来为程序提供表单回显--%>


<span class="errorMsg">


<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>


</span>


后端页面加入:


//同时提示用户,是哪个地方出现问题


request.setAttribute("msg","用户名或者密码错误");


request.setAttribute("username",username);


这个时候通过静态转发可以将 request 域中的数据返回给前端。


类似的,可以把登录的静态转发也写起来。


4 Servlet 程序的融合与抽取


====================================================================================


1)在实际的项目开发中,一个模块最好只使用一个 Servlet 程序,而用户的登录和注册应该属于用户这个模块。所以合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序。其中是登录还是注册逻辑通过判断来决定;



修改后的 UserServlet 程序如下所示:


public class UserServlet extends HttpServlet{


//哈哈哈,同 dao 层之于 service 层一样,service 层之于 web 层也是这样操作


private UserServiceImp userServiceImp=new UserServiceImp();


protected void doRegist(HttpServletRequest request, HttpServletResponse response) throws Exception{


//1 获取请求的参数


String username = request.getParameter("username");


String password = request.getParameter("password");


String email = request.getParameter("email");


String code = request.getParameter("code");


//用来测试使用 BeanUtils 这个第三方 jar 包来封装数据


WebUtils.copyParamToBean(request.getParameterMap(),new User());


//System.out.println(username); 验证表单成功上传到 Servlet 服务器


//2 优先级最高的是验证码,首先判断验证码是否正确(这里我把验证码规定死为 1234)


if("1234".equalsIgnoreCase(code)){


//3 判断用户名是否存在(由于用户名、密码、邮箱的格式我在 Jquery 中有判断,所以不需要在 servlet 服务器中再判断)


if (userServiceImp.existsUsername(username)) {


System.out.println("该用户名["+username+"]已经存在,请重新注册");


// 把回显信息,保存到 Request 域中


request.setAttribute("msg", "用户名已存在!!");


request.setAttribute("username", username);


request.setAttribute("email", email);


//跳回注册页面 其中的“/”表示的是 web 这个目录


RequestDispatcher requestDispatcher=request.getRequestDispatcher("/pages/user/regist.jsp");


requestDispatcher.forward(request,response);


} else {


//则将注册信息保存到数据库


//从属性到对象,用的是 new User(属性 1,属性 2)


//从对象到属性,用的是 User.get 的方法


userServiceImp.registUser(new User(null,username,password,email));


request.getRequestDispatcher("/pages/user/regist_success.jsp").forward(request, response);


}


}else{


// 把回显信息,保存到 Request 域中


request.setAttribute("msg", "验证码错误!!");


request.setAttribute("username", username);


request.setAttribute("email", email);


System.out.println("验证码[" + code + "]错误");


request.getRequestDispatcher("/pages/user/regist.jsp").forward(request, response);


}


}


protected void doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{


// 1 获取请求的参数


String username = request.getParameter("username");


String password = request.getParameter("password");


// 2 调用 userService.login()登录处理业务


User loginUser = userServiceImp.login(new User(null, username, password, null));


// 如果等于 null,说明登录失败!


if (loginUser == null) {


//同时提示用户,是哪个地方出现问题


request.setAttribute("msg","用户名或者密码错误");


request.setAttribute("username",username);


// 跳回登录页面


request.getRequestDispatcher("/pages/user/login.jsp").forward(request, response);


} else {


//登录成功


//跳到成功页面 login_success.html


request.getRequestDispatcher("/pages/user/login_success.jsp").forward(request, response);


}


}


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数


if ("login".equals(req.getParameter("action"))){


try {


doLogin(req, resp);


} catch (Exception e) {


e.printStackTrace();


}


}else{


try {


doRegist(req, resp);


} catch (Exception e) {


e.printStackTrace();


}


}


}


}


2)使用 Java 反射这个高级特性来优化大量 if else 代码;


这样我只要写我的业务、功能和方法就行了,就可以把我的注意力专注于业务之上。


如下所示:


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数


// if ("login".equals(req.getParameter("action"))){


// try {


// doLogin(req, resp);


// } catch (Exception e) {


// e.printStackTrace();


// }


// }else{


// try {


// doRegist(req, resp);


// } catch (Exception e) {


// e.printStackTrace();


// }


// }


//利用的 Java 反射的高级特性来代替大量的 if else 判断语句,这样可以把我的注意力专注于业务之上


String action = req.getParameter("action");


try {


// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象


Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);


System.out.println(method);


// 调用目标业务 方法


method.invoke(this, req, resp);


} catch (Exception e) {


e.printStackTrace();


}


}


3)在实际的项目开发中,不同模块间的代码可能会重复,所以可以利用继承 Servlet 父类来复用这些方法。


让 BaseServlet 继承 HttpServlet,然后让 UserServlet 继承 BaseServlet。


BaseServlet 代码如下:


public class BaseServlet extends HttpServlet {


@Override


protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数


// if ("login".equals(req.getParameter("action"))){


// try {


// doLogin(req, resp);


// } catch (Exception e) {


// e.printStackTrace();


// }


// }else{


// try {


// doRegist(req, resp);


//


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


} catch (Exception e) {


// e.printStackTrace();


// }


// }


//利用的 Java 反射的高级特性来代替大量的 if else 判断语句,这样可以把我的注意力专注于业务之上


String action = req.getParameter("action");


try {


// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象


Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);


System.out.println(method);


// 调用目标业务 方法


method.invoke(this, req, resp);


} catch (Exception e) {


e.printStackTrace();


}


}


}


UserServlet 代码如下:


public class UserServlet extends BaseServlet{


//哈哈哈,同 dao 层之于 service 层一样,service 层之于 web 层也是这样操作


private UserServiceImp userServiceImp=new UserServiceImp();


protected void doRegist(HttpServletRequest request, HttpServletResponse response) throws Exception{


//1 获取请求的参数


String username = request.getParameter("username");


String password = request.getParameter("password");


String email = request.getParameter("email");


String code = request.getParameter("code");


//用来测试使用 BeanUtils 这个第三方 jar 包来封装数据


WebUtils.copyParamToBean(request.getParameterMap(),new User());


//System.out.println(username); 验证表单成功上传到 Servlet 服务器


//2 优先级最高的是验证码,首先判断验证码是否正确(这里我把验证码规定死为 1234)


if("1234".equalsIgnoreCase(code)){


//3 判断用户名是否存在(由于用户名、密码、邮箱的格式我在 Jquery 中有判断,所以不需要在 servlet 服务器中再判断)


if (userServiceImp.existsUsername(username)) {


System.out.println("该用户名["+username+"]已经存在,请重新注册");


// 把回显信息,保存到 Request 域中


request.setAttribute("msg", "用户名已存在!!");


request.setAttribute("username", username);


request.setAttribute("email", email);


//跳回注册页面 其中的“/”表示的是 web 这个目录


RequestDispatcher requestDispatcher=request.getRequestDispatcher("/pages/user/regist.jsp");


requestDispatcher.forward(request,response);


} else {


//则将注册信息保存到数据库


//从属性到对象,用的是 new User(属性 1,属性 2)


//从对象到属性,用的是 User.get 的方法


userServiceImp.registUser(new User(null,username,password,email));


request.getRequestDispatcher("/pages/user/regist_success.jsp").forward(request, response);


}


}else{


// 把回显信息,保存到 Request 域中


request.setAttribute("msg", "验证码错误!!");


request.setAttribute("username", username);


request.setAttribute("email", email);


System.out.println("验证码[" + code + "]错误");


request.getRequestDispatcher("/pages/user/regist.jsp").forward(request, response);


}


}


protected void doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{


// 1 获取请求的参数


String username = request.getParameter("username");


String password = request.getParameter("password");


// 2 调用 userService.login()登录处理业务


User loginUser = userServiceImp.login(new User(null, username, password, null));


// 如果等于 null,说明登录失败!


if (loginUser == null) {


//同时提示用户,是哪个地方出现问题


request.setAttribute("msg","用户名或者密码错误");


request.setAttribute("username",username);


// 跳回登录页面


request.getRequestDispatcher("/pages/user/login.jsp").forward(request, response);


} else {


//登录成功


//跳到成功页面 login_success.html


request.getRequestDispatcher("/pages/user/login_success.jsp").forward(request, response);


}


}


}


5 使用 BeanUtils 这个第三方 jar 包来封装数据(可略过)


===================================================================================================


public class WebUtils {


/**


  • 把 Map 中的值注入到对应的 JavaBean 属性中,非必须,

  • @param value

  • @param bean


*/


public static <T> T copyParamToBean(Map value , T bean ){


try {


System.out.println("注入之前:" + bean);


/**


  • 把所有请求的参数都注入到 user 对象中


*/


BeanUtils.populate(bean, value);


System.out.println("注入之后:" + bean);


} catch (Exception e) {


e.printStackTrace();


}


return bean;


}


}

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Java书城项目第三阶段:优化