servlet还有人用吗_如何将Servlet玩出SSM的既视感?

互联网后端开发新技术频出,博主想写纯粹的底层项目,不用JSP和框架,想到用Json。代码实现上,用BaseServlet替代HttpServlet,让Servlet接近SpringMVC,还封装JDBC操作工具类,使Dao层操作简化,最终Controller层有类似SpringMVC的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐阅读:

  • Tencent内部疯传「Java面试题库」,看完直呼666
  • 字节三面“凉凉”了,面试题与细节回顾,Java程序员的我太难了
  • 基于Springboot、Beetl、Shiro、Redis、搭建Java快速开发平台

前言

由于现在互联网后端开发,已经出现了各种各样的新技术,如SSM,SpringBoot,Cloud等。本人也已经很久很久没有写过纯粹的Servlet+HTML+JDBC的项目了。于是今天就突然想写一个纯粹的底层项目。但是由于HTML是静态页面,而我又不想用JSP,更不想用什么什么模板,什么什么框架。这该怎么办呢?于是,我就想到了Json。

代码实现

Servlet和HTML,实现List传值

@WebServlet("/personnel/dept")public class DeptController extends BaseServlet {    private DeptService deptService = new DeptServiceImpl();    public void DeptList(HttpServletRequest request, HttpServletResponse response) throws IOException {        //获取数据库传来的数据        List list = deptService.selectList();        //将数据库传来的List转化成Json格式        ObjectMapper objectMapper = new ObjectMapper();        String json = objectMapper.writeValueAsString(list);        response.setContentType("application/json");        PrintWriter writer = response.getWriter();        writer.write(json);        writer.flush();        writer.close();    }}

页面效果

acd61765a6a50421cb0ee5e3f21849cf.png

不过从刚刚的代码,可能已经有人看出了问题。因为,正常的Servlet,不应该是用service方法,或者doGet,和doPost吗?为什么我刚刚连HttpServlet都没有继承,博主你是骗我的吧?

然而事实是,并没有。因为,为了把Servlet尽量做到最简,博主这里已经准备好了很多工具类使用~

为了让Servlet用起来更接近SpringMVC,我会先写一个BaseServlet来替代HttpServlet。使用的时候,只需要继承BaseServlet,然后直接写方法,并不用每次都要一个Service,达到类似SpringMVC的效果。

BaseServlet

public class BaseServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //调用方法的参数 -- method值必须和调用的方法名保持一致        String method = request.getParameter("method");        //获得本类对象        Class clazz = this.getClass();        System.out.println(clazz + "---" + method);        //使用反射进行方法调用        try {            Method declaredMethod = clazz.getDeclaredMethod(method,HttpServletRequest.class,HttpServletResponse.class);            declaredMethod.setAccessible(true);            declaredMethod.invoke(this,request,response);        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }    }}

这个时候访问它只需要路径+方法名就可以了~

/OA/personnel/dept?method=DeptList

jdbc我们都知道,他们非常的繁琐,为了让它操作起来,只需要一两行代码,甚至用起来更像Mybatis。于是我们可以写一个工具类,用来对JDBC的很多操作进行封装

查询方法

 public static  List baseQuery(T t, String sql, Object ... args){        // 获取list集合中要装的对象的字节码        Class aClass = t.getClass();        Connection connection = null;        PreparedStatement statement = null;        ResultSet resultSet = null;        List list = null;        try {            connection = JdbcUtil.getConnection();            statement = connection.prepareStatement(sql);            // 设置参数的过程            for (int i = 0; i < args.length; i++) {                statement.setObject(i + 1, args[i]);            }            resultSet = statement.executeQuery();            // 获取全部的字段            Field[] fs = aClass.getDeclaredFields();            // 先设置属性可以访问            for(Field f:fs){                f.setAccessible(true);            }            list=new ArrayList<>();            while(resultSet.next()){                // 创建对象                T  element = (T)aClass.newInstance();                // 从结果集的一条数据中取出每个字段的信息,放入element对象上去                // 遍历fs 通过属性名 去结果集中获取数据                for(Field f:fs){                    String name = f.getName();                    Object value=null;                    // 判断实体类属性的数据类型,选择对应的get方法                    if(f.getType()==int.class){                        value = resultSet.getInt(name);                    }else if(f.getType()==double.class){                        value = resultSet.getDouble(name);                    }else if(f.getType()==boolean.class){                        value = resultSet.getBoolean(name);                    }else{                        value= resultSet.getObject(name);                    }                    f.set(element,value);                }                list.add(element);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            closeAll(resultSet,statement,connection);        }        return list;    }

插入方法

 public static int executeUpdate(String sql,Object []params){        Connection connection = null;        PreparedStatement preparedStatement = null;        ResultSet resultSet = null;        //默认添加失败        int flag = 0;        try {            //建立数据库连接            connection = getConnection();            //创建一个SQL命令发送器            preparedStatement = connection.prepareStatement(sql);            //准备好SQL语句,通过SQL命令发送器发送给数据库,并得到结果            for(int i = 0; i < params.length; i++){                preparedStatement.setObject(i + 1, params[i]);            }            flag = preparedStatement.executeUpdate();        } catch (SQLException sqlException) {            sqlException.printStackTrace();        }        return flag;    }

这个时候我们Dao层真的就只需要一行代码就可以了~

public List selectList(){        return JdbcUtil.baseQuery(new Dept(),"select * from dept where or_delete = 0");    }

所以经过了层层封装,最后到了Controller层,就会给人一种好像是在使用SpringMVC的效果(事实上,这个页面还有东西可以封装,但是博主有点懒,就觉得没必要了...)。但是在这里还是要提醒一下。平时自己私下玩玩可以,真正的工作中,还是要根据公司的规范来哦~

a90025cefc478ae7306676d5f4509a7c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值