JavaWeb学习(十二)---Servlet代码优化

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 参数传参。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值