「书城第三阶段」目标实现

书城第三阶段实现

第三阶段目标

(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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值