学习记录--Servlet实现代码优化

需求:将什么AddServlet、SelectAllServlet。。。全部都写在一个servlet里面进行统一管理,以后访问需要的servlet的时候直接访问方法名。步骤:4步走

步骤一 ①新建一个BaseServlet

代码:


import javax.servlet.ServletException;
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,根据请求的最后一段路径来进行方法分发
 */
public class BaseServlet extends HttpServlet {

    // 根据请求的最后一段路径来进行方法分发
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取请求路径 "/brand-case/brand/selectAll"
        String uri = req.getRequestURI();
        // 2. 获取最后一段路径,方法名
        int index = uri.lastIndexOf("/");
        String methodName = uri.substring(index + 1);  // selectAll

        // 3. 执行方法
        // 3.1 获取 BrandServlet /  字节码对象 Class
        // 谁调用我(this 所在的方法),我(this)代表谁
        // System.out.println(this);  // BrandServlet
        Class<? extends BaseServlet> cls = this.getClass();

        // 3.2 获取方法 Method 对象,执行方法
        try {
            Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个servlet只需要复制即可,作为轮子来使用。如有异常直接抛出去

步骤二② 根据表建立相应的servlet。里面写上需要操作的servlet方法。

比如我操作的brand表,取名BrandServlet。路径访问就写@WebServlet(“/brand/*”)。这里管理所有有关brand表的servlet。比如现在我需要使用add和查询所有

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;

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();

    /**
     * 查询所有
     * @param request
     * @param response
     * @throws IOException
     */
    public void selectAll(){}

    /**
     * 新增数据
     * @param request
     * @param response
     * @throws IOException
     */
    public void add(){}
}

步骤三③写具体的servlet执行代码。



import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;

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();

    /**
     * 查询所有
     * @param request
     * @param response
     * @throws IOException
     */
    public void selectAll(HttpServletRequest request, HttpServletResponse response){
        
    }

    /**
     * 新增数据
     * @param request
     * @param response
     * @throws IOException
     */
    public void add(HttpServletRequest request, HttpServletResponse response){
       
    }
}

每一个方法都传入HttpServletRequest request, HttpServletResponse response,这两个参数,这就是以前在dopost或者service里面的东西。现在,就可以在下面写代码了,以前的代码怎么写这个就怎么写。


import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Brand;
import com.itheima.service.BrandService;
import com.itheima.service.impl.BrandServiceImpl;

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();

    /**
     * 查询所有
     * @param request
     * @param response
     * @throws IOException
     */
    public void selectAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1. 调用service进行查询
        List<Brand> brands = brandService.selectAll();

        //2. 转为json
        String jsonString = JSON.toJSONString(brands);

        //3. 防止乱码以及写数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }

    /**
     * 新增数据
     * @param request
     * @param response
     * @throws IOException
     */
    public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
        BufferedReader br = request.getReader();
        String params = br.readLine();//这个就是接收到的参数字符串

        //转为brand
        Brand brand = JSON.parseObject(params, Brand.class);

        //调用service进行添加
        brandService.add(brand);

        //响应一个成功信号
        response.getWriter().write("success");
    }
}

步骤四 ④修改访问路径

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值