书城第三阶段实现
第三阶段目标
(1)修改HTML页面为jsp;
(2)页面抽取;
(3)登录注册后表单回显错误信息;
(4)BaseServlet抽取Servlet程序;
(5)使用BeanUtils对信息进行封装
1-修改HTML页面为jsp;
修改所有页面成为jsp,除了批量修改,这个没什么值得记录。。。。
2-页面抽取
(1)页头处需要进行抽取的css、js、basePath ====>>>>head.jps
(2)页脚固定的格式进行抽取====>>>>footer.jsp
(3)登陆成功菜单进行抽取====>>>>login_success_menu.jsp
(4)管理菜单进行抽取====>>>>manager_menu.jsp
抽取完毕的页面,进行静态引用
<%@include file="/pages/common/head.jsp"%>
<%@include file="/pages/common/footer.jsp"%>
<%@include file="/pages/common/manager_menu.jsp"%>
...
3-登录注册后表单回显错误信息
(1)如果用户在登录时没有输入正确的用户名或者密码,则登陆后跳转显示错误信息
(2)如果用户在注册时出现用户名重复、验证码错误,则登录跳转后显示错误信息
实现:使用Servlet中使用到的request类添加回显信息,在到jsp页面输出,设置如下
req.setAttribute("msg", "用户信息已存在!");
req.setAttribute("username", username);
req.setAttribute("email", email);
在jsp页面将传输的request对象进行捕获,得到信息输出
// 例子1:EL语法
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" value="${requestScope.username}"/>
// 例子2:EL三元表达式
${ empty requestScope.msg? "请输入用户名与密码" : requestScope.msg }
4-BaseServlet抽取Servlet程序
- 合并RegisterServlet与LoginServlet
- 使用反射+if else对代码进行优化
- 对Servlet程序进行抽取BaseServlet类,使用反射思想调用子类方法
// 合并
public class UserServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
/**
* 处理登录的功能
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 1 、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 调用 userService.login() 登录处理业务
User loginUser = userService.login(new User(null, username, password, null));
// 如果等于 null, 说明登录 失败 !
if (loginUser == null) {
// 把错误信息,和回显的表单项信息,保存到 Request 域中
req.setAttribute("msg"," 用户或密码错误!");
req.setAttribute("username", username);
// 跳回登录页面
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
} else {
// 登录 成功
// 跳到成功页面 login_success.html
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
}
}
/**
* 处理注册的功能
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 1 、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String code = req.getParameter("code");
// 2 、检查 验证码是否正确 === 写死 , 要求验证码为 :abcde
if ("abcde".equalsIgnoreCase(code)) {
// 3 、检查 用户名是否可用
if (userService.existsUsername(username)) {
System.out.println(" 用户名[" + username + "] 已存在!");
// 把回显信息,保存到 Request 域中
req.setAttribute("msg", " 用户名已存在!!");
req.setAttribute("username", username);
req.setAttribute("email", email);
// 跳回注册页面
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
} else {
// 可用
// 调用 Sservice 保存到数据库
userService.registUser(new User(null, username, password, email));
//
// 跳到注册成功页面 regist_success.jsp
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp);
}
} else {
// 把回显信息,保存到 Request 域中
req.setAttribute("msg", " 验证码错误!!");
req.setAttribute("username", username);
req.setAttribute("email", email);
System.out.println(" 验证码[" + code + "] 错误");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
String action = req.getParameter("action");
if ("login".equals(action)) {
login(req, resp);
} else if ("regist".equals(action)) {
regist(req, resp);
}
}
}
//使用反射优化代码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
String action = req.getParameter("action");
try {
// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,
HttpServletResponse.class);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
// 抽取BaseServlet
public abstract class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
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();
}
}
}
5-使用BeanUtils对信息进行封装
BeanUtils工具类可以将所有请求参数注入到JavaBean中,具体做法是,得到request对象,然后得到Map,最后将值注入到对象;如果bean类中setXxx方法的Xxx与表单name属性不相同,那么无法进行注入。
写成一个工具类的话:
package wzy.utils;
import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public class WebUtils {
// 使用到泛型,可以注入任意类型
public static <T> T copyParamToBean(Map value, T Bean){
try {
System.out.println("注入之前:"+Bean);
BeanUtils.populate(Bean,value);
System.out.println("注入之后:"+Bean);
} catch (Exception e) {
e.printStackTrace();
}
return Bean;
}
}