博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
项目阶段二:代码优化(servlet程序和一些工具类)
阅读量:3965 次
发布时间:2019-05-24

本文共 5325 字,大约阅读时间需要 17 分钟。

BaseServlet 的抽取

在实际的项目开发中,一个模块,一般只使用一个 Servlet 程序

代码优化一:代码优化:合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序
在这里插入图片描述
给 login.jsp、regist.jsp 页面添加隐藏域 action,和修改请求地址
login.jsp:

regist.jsp:

UserServlet 程序:

public class UserServlet extends HttpServlet {
private UserService userService = new UserServiceImpl(); protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数 String username = req.getParameter("username"); String password = req.getParameter("password"); // 调用 userService.login()登录处理业务 if(userService.login(new User(null,username,password,null)) != null){
//登录成功 //转到登录成功页面 req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp); }else{
// 把错误信息,和回显的表单项信息,保存到Request域中 req.setAttribute("msg","用户名或密码错误!"); req.setAttribute("username",username);// System.out.println("用户名或密码错误!"); req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp); } } 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、检查 验证码是否正确 === 写死,要求验证码为:6n6np if("6n6np".equalsIgnoreCase(code)){
// 3、检查 用户名是否可用 if(userService.existsUsername(username)){
// // 把回显信息,保存到Request域中 req.setAttribute("msg","用户名已存在!!!"); req.setAttribute("username",username); req.setAttribute("email",email); // 跳回注册页面 req.getRequestDispatcher("/pages/user/myregist.jsp").forward(req, resp); }else{
// 可用// 调用service保存到数据库 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); //请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ req.getRequestDispatcher("/pages/user/myregist.jsp").forward(req,resp); } } @Override 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); } }}

如果还有别的功能要实现的话,就得不停的在后面加else if会产生大量的代码,耦合性不好

优化代码二:使用反射优化大量 else if 代码

public class BaseServlet extends HttpServlet {
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题 // 也要在获取请求参数之前调用才效 req.setCharacterEncoding("UTF-8"); // 它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头 // 此方法一定要在获取流对象之前调用才有效 resp.setContentType("text/html;charset=UTF-8"); 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 程序。

在这里插入图片描述

BaseServlet 程序代码:

public class BaseServlet extends HttpServlet {
@Override 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(); } }}

修改 UserServlet 程序继承 BaseServlet 程序:

在这里插入图片描述
并且删除里面的doPost方法

数据的封装和抽取 BeanUtils 的使用

BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。 BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。

BeanUtils 它不是 Jdk 的类。而是第三方的工具类。所以需要导包。

1、导入需要的 jar 包:

  • commons-beanutils-1.8.0.jar
  • commons-logging-1.1.1.jar

2、编写 WebUtils 工具类使用:

WebUtils 工具类:

public class WebUtils {
/** * 把Map中的值注入到对应的JavaBean属性中。 * * @param value * @param bean * @param
* @return */ public static
T copyParamToBean(Map value, T bean){
try {
/** * 把所请求的参数都注入到user对象中 */ BeanUtils.populate(bean,value); } catch (Exception e) {
e.printStackTrace(); } return bean; }}

UserServlet程序修改处:

login中:
在这里插入图片描述
regist中:
在这里插入图片描述
使用 EL 表达式修改表单回显
登录:

在这里插入图片描述

注册:

在这里插入图片描述

在这里插入图片描述

转载地址:http://smuki.baihongyu.com/

你可能感兴趣的文章
Pandas 复合索引
查看>>
[第23课] 期望值E(X)
查看>>
[第24课] 二项分布的期望值
查看>>
Pandas 处理 NaN
查看>>
Pandas 分组统计
查看>>
Pandas 多 DataFrame联接
查看>>
Sybase 系列文章目录
查看>>
SQLServer
查看>>
Hibernate 通过 Hibernate 访问数据库
查看>>
java面试题
查看>>
消息队列相关(MQ)
查看>>
生成短连接
查看>>
java多线程
查看>>
mybatis高级结果映射
查看>>
java 中的锁
查看>>
线程池
查看>>
深入浅出:Tomcat应用服器中Servlet容器架构及工作原理剖析
查看>>
fastjson 将json和java对象相互转换
查看>>
java获取cookie
查看>>
kafaka用例&市上最全总结
查看>>