Servlet中service是用来转向的
1.我们一般写一个servlet,只需要重写doGet或者doPost就可以了。如果重写了service方法,那么servlet容器就会把请求交给这个方法来处理
//定义一个类,继承HttpServlet并且重写service方法
package com.itheima.web;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
//重写HttpServlet中的service方法
//自定义servlet根据请求的最后一段路径来进行方法分发
//替换HttpServlet根据请求方式来进行方法分发
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取URI
String uri=req.getRequestURI();
//获取最后一段路径 /方法
//查询最后一个/所在的索引
int index=uri.lastIndexOf("/");
//index得到的结果是/selectAll,要去掉斜杠,就要index+1-
String methodName=uri.substring(index+1);
//通过反射来获取继承BrandServlet的类的对象
//哪个实现类的对象调用service方法,this就指代谁
Class <? extends BaseServlet> cls=this.getClass();
try {
//获取实现类中的方法
Method method= cls.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//执行方法,由invoke决定去执行哪个方法
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这时候servlet会把客户端发送来的请求交给重写后的service方法来处理,在service方法中通过反射来指定调用哪个实现类的哪个方法
实现类:
package com.itheima.web;
import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceimpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
private BrandService brandService=new BrandServiceimpl();
public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//获取查询结果
List<Brand> brands=brandService.selectAll();
//把查询结果转为json数据
String jsonstr= JSON.toJSONString(brands);
//发送响应
//设置响应格式
resp.setContentType("text/json;charset=utf-8");
resp.getWriter().write(jsonstr);
}
public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//获取用户输入的数据
BufferedReader br=req.getReader();
String param=br.readLine();
//将json数据转为java对象
Brand brand=JSON.parseObject(param, Brand.class);
//调用方法
brandService.addBrand(brand);
//响应成功的标识
resp.getWriter().write("success");
}
}
反射中的invoke方法
invoke 主要是用来调用某个类中的方法的,但是他不是通过当前类直接去调用而是通过反射的机制去调用
invoke(Object obj, Object... args) 是Method 类中的方法,这个方法是一个native 方法
obj: 调用类的实例对象
args:调用发方法的参数,是可变长度的
//调用
通过 method.invoke(obj , args ) 可以实现method 方法的调用,并通过args 参数传参。