优化并抽取Servlet

优化并抽取Servlet

如果每实现一个功能就写一个Servlet,代码难免会显得有些冗余,如果可以稍加封装,代码的优雅性会大大提高。

用模块化的思想,用户模块写一个Servlet,商品模块写一个Servlet,管理员模块写一个Servlet,这样一个项目中Servlet的个数会大大减少,同时也利于项目的维护。

首先写一个BaseServlet,它继承HttpServlet,重写它的service(HttpServletRequest req, HttpServletResponse resp)方法,获取每次请求的uri,拿到uri所对应的模块功能名,例如/user/login拿到的就是login,UserServlet继承BaseServlet,在UserServlet中直接写逻辑代码,方法名与访问uri的地址后模块功能名保持一致即可。

这样一来每次发出一个请求,映射到地址/user/*下,被UserServlet所捕获,UserServlet中没有重写service方法,那么自动调用它父类的service方法,也就是我们在BaseServlet中重写的service方法,让它去执行请求,它得出请求的uri是/user/login,拿到方法名login,拿到调用service方法的对象this,利用反射去调用方法,即可实现登录的逻辑。

代码如下:

package com.briup.test;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
	优化并抽取servlet。(考点:service)
 */
@WebServlet("/随便写")
public class BaseServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String uri = req.getRequestURI();
		// /user/login /user/register /admin/login /admin/add
		String methodName = uri.substring(uri.lastIndexOf("/") + 1);
		System.out.println(this + "调用了父类BaseServlet中重写的service方法,执行:" + methodName);
		Class<? extends BaseServlet> clazz = this.getClass();
		try {
			Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			method.invoke(this, req, resp);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

package com.briup.test;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/user/*")
public class UserServlet extends BaseServlet {

	private static final long serialVersionUID = 1L;
	
	//这里方法的权限修饰符一定要是public的
	public void login(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("用户登录");// /user/login
	}
	
	public void register(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("用户注册");// /user/register
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值