推荐阅读:Tencent内部疯传Java面试题库,看完直呼666字节三面凉凉了,面试题与细节回顾,Java程序员的我太难了 基于Springboot、Beetl、Shiro、Redis、搭建Java快速开发平台前言 由于现在互联网后端开发,已经出现了各种各样的新技术,如SSM,SpringBoot,Cloud等。本人也已经很久很久没有写过纯粹的ServletHTMLJDBC的项目了。于是今天就突然想写一个纯粹的底层项目。但是由于HTML是静态页面,而我又不想用JSP,更不想用什么什么模板,什么什么框架。这该怎么办呢?于是,我就想到了Json。代码实现Servlet和HTML,实现List传值WebServlet(personneldept)publicclassDeptControllerextendsBaseServlet{privateDeptServicedeptServicenewDeptServiceImpl();publicvoidDeptList(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{获取数据库传来的数据ListDeptlistdeptService。selectList();将数据库传来的List转化成Json格式ObjectMapperobjectMappernewObjectMapper();StringjsonobjectMapper。writeValueAsString(list);response。setContentType(applicationjson);PrintWriterwriterresponse。getWriter();writer。write(json);writer。flush();writer。close();}}页面效果 不过从刚刚的代码,可能已经有人看出了问题。因为,正常的Servlet,不应该是用service方法,或者doGet,和doPost吗?为什么我刚刚连HttpServlet都没有继承,博主你是骗我的吧? 然而事实是,并没有。因为,为了把Servlet尽量做到最简,博主这里已经准备好了很多工具类使用 为了让Servlet用起来更接近SpringMVC,我会先写一个BaseServlet来替代HttpServlet。使用的时候,只需要继承BaseServlet,然后直接写方法,并不用每次都要一个Service,达到类似SpringMVC的效果。BaseServletpublicclassBaseServletextendsHttpServlet{Overrideprotectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{调用方法的参数method值必须和调用的方法名保持一致Stringmethodrequest。getParameter(method);获得本类对象Classclazzthis。getClass();System。out。println(clazzmethod);使用反射进行方法调用try{MethoddeclaredMethodclazz。getDeclaredMethod(method,HttpServletRequest。class,HttpServletResponse。class);declaredMethod。setAccessible(true);declaredMethod。invoke(this,request,response);}catch(NoSuchMethodExceptione){e。printStackTrace();}catch(IllegalAccessExceptione){e。printStackTrace();}catch(InvocationTargetExceptione){e。printStackTrace();}}}这个时候访问它只需要路径方法名就可以了OApersonneldept?methodDeptList jdbc我们都知道,他们非常的繁琐,为了让它操作起来,只需要一两行代码,甚至用起来更像Mybatis。于是我们可以写一个工具类,用来对JDBC的很多操作进行封装查询方法publicstaticTListTbaseQuery(Tt,Stringsql,Object。。。args){获取list集合中要装的对象的字节码ClassaClasst。getClass();Connectionconnectionnull;PreparedStatementstatementnull;ResultSetresultSetnull;ListTlistnull;try{connectionJdbcUtil。getConnection();statementconnection。prepareStatement(sql);设置参数的过程for(inti0;iargs。length;i){statement。setObject(i1,args〔i〕);}resultSetstatement。executeQuery();获取全部的字段Field〔〕fsaClass。getDeclaredFields();先设置属性可以访问for(Fieldf:fs){f。setAccessible(true);}listnewArrayList();while(resultSet。next()){创建对象Telement(T)aClass。newInstance();从结果集的一条数据中取出每个字段的信息,放入element对象上去遍历fs通过属性名去结果集中获取数据for(Fieldf:fs){Stringnamef。getName();Objectvaluenull;判断实体类属性的数据类型,选择对应的get方法if(f。getType()int。class){valueresultSet。getInt(name);}elseif(f。getType()double。class){valueresultSet。getDouble(name);}elseif(f。getType()boolean。class){valueresultSet。getBoolean(name);}else{valueresultSet。getObject(name);}f。set(element,value);}list。add(element);}}catch(Exceptione){e。printStackTrace();}finally{closeAll(resultSet,statement,connection);}returnlist;}插入方法publicstaticintexecuteUpdate(Stringsql,Object〔〕params){Connectionconnectionnull;PreparedStatementpreparedStatementnull;ResultSetresultSetnull;默认添加失败intflag0;try{建立数据库连接connectiongetConnection();创建一个SQL命令发送器preparedStatementconnection。prepareStatement(sql);准备好SQL语句,通过SQL命令发送器发送给数据库,并得到结果for(inti0;iparams。length;i){preparedStatement。setObject(i1,params〔i〕);}flagpreparedStatement。executeUpdate();}catch(SQLExceptionsqlException){sqlException。printStackTrace();}returnflag;}这个时候我们Dao层真的就只需要一行代码就可以了publicListDeptselectList(){returnJdbcUtil。baseQuery(newDept(),selectfromdeptwhereordelete0);} 所以经过了层层封装,最后到了Controller层,就会给人一种好像是在使用SpringMVC的效果(事实上,这个页面还有东西可以封装,但是博主有点懒,就觉得没必要了。。。)。但是在这里还是要提醒一下。平时自己私下玩玩可以,真正的工作中,还是要根据公司的规范来哦