在我们的项目中,我们创建各种Servlet请求接口来对应的实现我们的业务逻辑:
- 文章列表
- 文章详情
- 新增文章
- 修改文章
- 删除文章
以上Servlet在处理request和response响应时有以下要求:
- 需要设置编码格式
- 需要将返回数据格式设置为我们预定好的格式
- 按照统一的方法处理异常
基于以上需求,我们选择模板设计模式,创建统一的父类,完成以上功能的封装
创建该抽象父类:需要继承HttpServlet,我们使用的主要为get和post请求,
所以还需要重写doGet和doPost方法,并预留下抽象方法供具体的Servlet子类实现。
白话:为了降低代码的重复性,我们对频繁出现的操作进行封装将以上重复逻辑封装到一个抽象类中,并且在该类中创建一个抽象方法,让子类继承该抽象类并且重写该方法,使得每一个子类去自己决定自己要实现什么样的业务逻辑。
优化前:
优化后:
抽象类:
package com.jerome.servlet;
import com.jerome.po.JSON;
import com.jerome.util.JSONUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 进行统一的操作
* 父类不实现方法,子类去实现方法---->抽象方法
*/
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
JSON result = new JSON();
try {
Object data = process(request, response);
result.setSuccess(true);
result.setCode("200");
result.setMessage("操作成功");
result.setData(data);
// response.getWriter().write(JSONUtil.format(result));
} catch (Exception e) {
e.printStackTrace();
result.setCode("500");
result.setMessage("服务器错误");
}
//无论成功与否我们不仅在后台捕获异常,打印堆栈信息,错误信息,而且再前端也显示错误信息(简单处理)
response.getWriter().write(JSONUtil.format(result));
}
//让子类实现去做具体的业务
public abstract Object process(HttpServletRequest request, HttpServletResponse response)
throws Exception;
}
具体实现类:
package com.jerome.servlet;
import com.jerome.db.DBManager;
import com.jerome.po.Article;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class ArticleListServlet extends BaseServlet {
@Override
public Object process(HttpServletRequest request, HttpServletResponse response) throws Exception {
// System.out.println(request.getParameter("id"));
Connection conn = DBManager.getConnection();
String sql = "select a.id,a.title,a.content,a.create_time from article a join user u on a.user_id = u.id where u.id=?";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setInt(1, Integer.parseInt(request.getParameter("id")));
ResultSet resultSet = preparedStatement.executeQuery();
List<Article> articleList = new ArrayList<>();
while (resultSet.next()) {
//解析结果集
Article article = new Article();
article.setId(resultSet.getInt("id"));
article.setTitle(resultSet.getString("title"));
article.setContent(resultSet.getString("content"));
//article.setUserId(resultSet.getInt("user_id"));
article.setCreateTime(resultSet.getTimestamp("create_time"));
articleList.add(article);
}
// System.out.println(articleList);
return articleList;
}
}
注意:我们选择在web.xml
中配置Servlet和url。(也可以使用注解的方式)
<servlet>
<servlet-name>articleList</servlet-name>
<servlet-class>com.jerome.servlet.ArticleListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>articleList</servlet-name>
<url-pattern>/articleList</url-pattern>
</servlet-mapping>