(一)替换内容
在响应的目录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中。