小言_互联网的博客

如何将Servlet玩出SSM的既视感?

288人阅读  评论(0)

前言

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

关于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<Dept> 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();
    }
}
<script type="text/javascript">
        $(function () {
            $.ajax({
                type:"post",
                url:"/OA/personnel/dept?method=DeptList",
                success:function (result) {
                    //用来叠加数据
                    var no = "",name="",place="";
                    var tableTemp = "";
                    //方便等下动态绘制表格
                    for(var i = 0; i < result.length; i++){
                        //动态数据
                        no = result[i].dept_no;
                        name = result[i].dept_name;
                        place = result[i].dept_place;
                        //动态表格,必须放在循环内,否则 no 就不会被视为变量而是被视为空字符串
                        var temp = "<tr>\n" +
                            "                <td><input name=\"\" type=\"checkbox\" value=\"\" /></td>\n" +
                            "                <td >" + no + "</td>\n" +
                            "                <td >" + name + "</td>\n" +
                            "                <td >" + place +  "</td>\n" +
                            "                 <td>   <a href=\"deptUpdate.html\" class=\"tablelink\">修改</a> &nbsp;&nbsp;&nbsp;&nbsp;\n" +
                            "                    <a href=\"#\" class=\"tablelink click\"> 删除</a>\n" +
                            "                </td>\n" +
                            "            </tr>";
                        /*
                         动态表格,每次循环累加
                      */
                        tableTemp += temp;

                        $("#tableBody").html(tableTemp);
                    }
                },fail:function (result) {
                    alert("error");
                }
            })
        });
    </script>

页面效果


       不过从刚刚的代码,可能已经有人看出了问题。因为,正常的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的很多操作进行封装

以下代码曾出现在两篇JDBC的文章里,以下两个连接就是
JDBC(Java Database Connectivity) 数据库连接技术
再谈JDBC?
查询方法
 public static <T> List<T> baseQuery(T t, String sql, Object ... args){
        // 获取list集合中要装的对象的字节码
        Class aClass = t.getClass();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<T> 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<Dept> selectList(){
        return JdbcUtil.baseQuery(new Dept(),"select * from dept where or_delete = 0");
    }

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


转载:https://blog.csdn.net/qq_41424688/article/details/108423748
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场