修改成:
<%–这个地方通过为request域加入域对象来为程序提供表单回显–%>
<%=request.getAttribute(“msg”)==null?“请输入用户名和密码”:request.getAttribute(“msg”)%>
后端页面加入:
//同时提示用户,是哪个地方出现问题
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, userna
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】 浏览器打开:qq.cn.hn/FTf 免费领取
me, 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);
// } 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()登录处理业务