BaseServlet的进一步封装
1、BaseServlet的进一步封装的意义
该BaseServletPlus是BaseServlet的进一步封装主要用于处理Servlet返回跳转方式和跳转地址进行页面跳转,原版BaseServlet在另一篇文章中BaseServlet详解(每行代码均有详细注释)
- 为了防止我个人混淆,我将其命名为BaseServletPlus,实际开发中依然命名为BaseServlet
- 比原版BaseServlet多了对方法调用后返回的值进行了处理,进行页面的跳转
- 具体内容:
- 继承了该BaseServletPlus的Servlet,可返回一个字符串
- 即:return Constants.FORWARD + “/welcome.jsp”;
- Constants.FORWARD = “forward:”
- Constants是自定义用于存放静态常量的类,
- FORWARD、REDIRECT用于对转发方式的标记
2、具体实现
我就不多说废话了,下面是我的BaseServletPlus的具体实现,内附有超详细注释。
public class BaseServletPlus extends HttpServlet {
/**
* 用于重定向到首页
* @param req
* @param resp
* @return
*/
public String redirectIndex(HttpServletRequest req, HttpServletResponse resp) {
return Constants.REDIRECT + "/index.jsp";
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取要调用的方法的方法名,用于利用反射获取方法
String methodName = request.getParameter("method");
if (null == methodName) {
methodName = "redirectIndex";
}
Method method = null;
Class<? extends BaseServletPlus> aClass = this.getClass();
try {
method = aClass.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
/*
* 使用result接受method.invoke(this, request, response)的执行结果(字符串)
* 返回的要请求的页面的地址以及请求的方式,继承了BaseServletPlus的Servlet
* 应返回格式为:forward:/index.jsp或redirect:/index.jsp
* 这种字符串开头以跳转方式开头+跳转的页面
* 跳转方式:/跳转页面
*/
Object result = method.invoke(this, request, response);
if(result != null){
String str = (String)result;
//截取:后面的字符串
// 强求转发 forward:/index.jsp----> /index.jsp
//重定向 redirect:/index.jsp -----> /index.jsp
// FLAG = ":"
String path = str.substring(str.indexOf(Constants.FLAG) + 1);
//Servlet返回的地址是以forward:开头的判定为请求转发方式
if(str.startsWith(Constants.FORWARD)){
// 转发 index.jsp
request.getRequestDispatcher(path).forward(request,response);
}else if(str.startsWith(Constants.REDIRECT)){ //Servlet返回的地址是以redirect:开头的判定为请求转发方式
//重定向到 /index.jsp
response.sendRedirect(path);
}else {
//其余方式,返回响应数据
response.getWriter().println(str);
}
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
下面是我的Constants类,用于存放静态常量,程序的所有公用的静态常量都放置在该类中,不使用该类也可,只需将相应的调用换成具体的字符串即可。
public class Constants {
//默认时为首页
public static final String INDEX = "index";
//请求转发标识
public static final String FORWARD = "forward:";
//重定向标识
public static final String REDIRECT = "redirect:";
//分割符
public static final String FLAG = ":";
}
以上所有内容均为个人见解,如有错误欢迎批评与指正,更欢迎广大同胞们表达自己的看法共同进步。