推荐阅读:
- 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(); }}
页面效果

不过从刚刚的代码,可能已经有人看出了问题。因为,正常的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的效果(事实上,这个页面还有东西可以封装,但是博主有点懒,就觉得没必要了...)。但是在这里还是要提醒一下。平时自己私下玩玩可以,真正的工作中,还是要根据公司的规范来哦~
