基于纯Servlet的CRUD的改进-注解开发,解决类爆炸问题

1、注解开发

  • 分析oa项目中的web.xml文件

    • 现在只是一个单标的CRUD,没有复杂的业务逻辑,很简单的一丢丢功能。web.xml文件中就有如此多的配置信息。如果采用这种方式,对于一个大的项目来说,这样的话web.xml文件会非常庞大,有可能最终会达到几十兆。
    • 在web.xml文件中进行servlet信息的配置,显然开发效率比较低,每一个都需要配置一下。也就是一个请求对应一个sevlet
    • 而且在web.xml文件中的配置是很少被修改的,所以这种配置信息能不能直接写到java类当中呢?可以的。
  • Servlet3.0版本之后,推出了各种Servlet基于注解式开发。优点是什么?

    • 开发效率高,不需要编写大量的配置信息。直接在java类上使用注解进行标注。
    • web.xml文件体积变小了。
  • 并不是说注解有了之后,web.xml文件就不需要了:

    • 有一些需要变化的信息,还是要配置到web.xml文件中。一般都是 注解+配置文件 的开发模式。
    • 一些不会经常变化修改的配置建议使用注解。一些可能会被修改的建议写到配置文件中。

注意,可以使用
@WebServlet(“/dept/* “) 是模糊查询,前缀一样的,所以可以设置该项目内的url的前缀一致,但不可以是@WebServlet(”/”)
注解@WebServlet()内部不加项目名

2、解决类爆炸

  • 上面的注解解决了配置文件的问题。但是现在的oa项目仍然存在一个比较臃肿的问题。
    • 一个单标的CRUD,就写了6个Servlet。如果一个复杂的业务系统,这种开发方式,显然会导致类爆炸。(类的数量太大。)
    • 怎么解决这个类爆炸问题?可以使用模板方法设计模式。
  • 怎么解决类爆炸问题?
    • 以前的设计是一个请求一个Servlet类。1000个请求对应1000个Servlet类。导致类爆炸。
    • 可以这样做:一个请求对应一个方法。一个业务对应一个Servlet类。
    • 处理部门相关业务的对应一个DeptServlet。处理用户相关业务的对应一个UserServlet。处理银行卡卡片业务对应一个CardServlet。

接下来基于以上两种方式,对文章1:纯Servlet的CRUD的操作进行改进
一个请求对应一个方法,文章一中写了6个类,接下来改进成一个业务DeptServlet类,该业务类继承HttpServlet父类,在内部重写方法

protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException;

那现在可能有一个疑问就是为什么不像之前一样重写doGet/doPost方法呢?
漏漏漏,因为这6种请求对应的6个方法可能是post请求,也可能是get请求,在这种情况下,我们重写doGet/doPost的上一级方法,也就是service()方法。
理清思路了,接下来就让我们来重新写下主类叭

package com.wll.javaweb.oaImprove;

import DBUtil.DButil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author nideyiyi
 * @create 2022-11-14-20:08
 */
@WebServlet({"/dept/add","/dept/del","/dept/edit","/dept/editpage","/dept/showlist","/dept/detail"})
public class DeptServlet extends HttpServlet{
   @Override
   protected void service(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
       String servletPath = request.getServletPath();
       if("/dept/add".equals(servletPath)){
           doAdd(request,response);
       }else if("/dept/del".equals(servletPath)){
           doDel(request,response);
       }else if("/dept/edit".equals(servletPath)){
           doEdit(request,response);
       }else if("/dept/editpage".equals(servletPath)){
           doEditPage(request,response);
       }else if("/dept/showlist".equals(servletPath)){
           doShowList(request,response);
       }else if("/dept/detail".equals(servletPath)){
           doDetail(request,response);
       }

   }

    private void doShowList(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String cpath = request.getContextPath();

        out.println( "      <!DOCTYPE html>");
        out.println( "      <html lang='en'>");
        out.println( "      <head>");
        out.println( "          <meta charset='UTF-8'>");
        out.println( "          <title>部门列表</title>");

        out.println("     <script type='text/javascript'>");
        out.println("     function del(deptno){");
        out.println("         if(window.confirm('亲,删除了就不可以恢复了呦!')){");
        out.println("             document.location.href='"+cpath+"/dept/del?deptno=' + deptno");
        out.println("         }");
        out.println("     }");
        out.println(" </script>");


        out.println( "</head>");
        out.println( "<body>");
        out.println("<h1 align='center'>部门列表</h1>");
        out.println( "      <hr>");
        out.println( "      <form>");
        out.println( "          <table align='center' border='10px solid red' width='80%' >");
        out.println( "              <tr>");
        out.println( "                  <th>序号</th>");
        out.println( "                  <th>部门编号</th>");
        out.println( "                  <th>部门名称</th>");
        out.println( "                  <th>部门地址</th>");
        out.println( "                  <th>操作</th>");
        out.println( "              </tr>");


        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DButil.getConnection();
            String sql = "select deptno,dname,loc from dept";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            int a = 1;
            while(rs.next()){
                String deptno = rs.getString(1);
                String dname = rs.getString(2);
                String loc = rs.getString(3);
                out.println( "              <tr>");
                out.println( "                  <td>"+(a++)+"</td>");
                out.println( "                  <td>"+deptno+"</td>");
                out.println( "                  <td>"+dname+"</td>");
                out.println( "                  <td>"+loc+"</td>");
                out.println( "                  <td>");
                out.println( "                      <a href='javascript:void(0)' οnclick='del("+deptno+")'>删除</a>");
                out.println( "                      <a href='"+cpath+"/dept/editpage?deptno="+deptno+"&dname="+dname+"&loc="+loc+"'>修改</a>");
                out.println( "                      <a href='"+cpath+"/dept/detail?deptno="+deptno+"'>详情</a>");
                out.println( "                  </td>");
                out.println( "              </tr>");
            }

        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            DButil.close(rs,ps,conn);
        }
        out.println( "          </table>");
        out.println( "      </form>");
        out.println( "      <hr>");
        out.println( "      <a href='/oa/add.html'>新增部门</a>");
        out.println( "      </body>");
        out.println( "      </html>");
    }

    private void doDetail(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String cpath = request.getContextPath();
        String deptno1 = request.getParameter("deptno");

        out.println("             <!DOCTYPE html>");
        out.println("     <html lang='en'>");
        out.println("     <head>");
        out.println("         <meta charset='UTF-8'>");
        out.println("         <title>Title</title>");
        out.println("     </head>");
        out.println("     <body>");
        out.println("     <h1 align='center'>部门列表</h1>");
        out.println("     <hr>");
        out.println("     <form>");
        out.println("         <table align='center' border='10px solid red' width='80%'>");
        out.println("             <tr>");
        out.println("                 <th>序号</th>");
        out.println("                 <th>部门编号</th>");
        out.println("                 <th>部门名称</th>");
        out.println( "                  <th>部门地址</th>");
        out.println("             </tr>");

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        try {
            conn = DButil.getConnection();
            String sql = "select dname,loc from dept where deptno = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,deptno1);
            rs=ps.executeQuery();

            int a = 1;
            while(rs.next()){

                String dname = rs.getString(1);
                String loc = rs.getString(2);

                out.println("             <tr>");
                out.println("                 <td>"+(a++)+"</td>");
                out.println("                 <td>"+deptno1+"</td>");
                out.println("                 <td>"+dname+"</td>");
                out.println("                 <td>"+loc+"</td>");
                out.println("             </tr>");

            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButil.close(rs,ps,conn);
        }
        out.println("         </table>");
        out.println("     </form>");
        out.println("     <hr>");
        out.println("     <input type='button' value='后退' οnclick='window.history.back()'/>");
        out.println("     </body>");
        out.println("     </html>");
    }

    private void doEditPage(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String dname = request.getParameter("dname");
        String loc = request.getParameter("loc");
        String deptno = request.getParameter("deptno");

        String cpath = request.getContextPath();

        out.println("           <!DOCTYPE html>");
        out.println("   <html lang='en'>");
        out.println("   <head>");
        out.println("       <meta charset='UTF-8'>");
        out.println("       <title>修改部门</title>");
        out.println("   </head>");
        out.println("   <body>");
        out.println("   <h1>修改部门</h1>");
        out.println("   <hr>");
        out.println("   <form action='"+cpath+"/edit' method='post'>");
        out.println("       <label for='input1'>部门编号:<input name='deptno' id='input1' value='"+deptno+"' readonly></label><br>");
        out.println("       <label for='input2'>部门名称:<input name='dname' id='input2' value='"+dname+"'></label><br>");
        out.println("       <label for='input3'>部门位置:<input name='loc' id='input3' value='"+loc+"'></label><br>");

        out.println("   <button type='submit' name='保存' value='修改' >保存</button>");
        out.println("   </form>");
        out.println("   </body>");
        out.println("   </html>");
    }

    private void doEdit(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();

        String dname = request.getParameter("dname");
        String loc = request.getParameter("loc");
        String deptno = request.getParameter("deptno");

        String cpath = request.getContextPath();

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int flag = 0;

        try {
            conn = DButil.getConnection();
            String sql = "update dept set dname=?,loc=? where deptno=? ";
            ps = conn.prepareStatement(sql);
            ps.setString(1,dname);
            ps.setString(2,loc);
            ps.setString(3,deptno);
            flag = ps.executeUpdate();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButil.close(rs,ps,conn);
        }

        if(flag == 1){
            response.sendRedirect(request.getContextPath()+"/showlist");
//            request.getRequestDispatcher("/showlist").forward(request,response);
        }else{
            response.sendRedirect(request.getContextPath()+"/error.html");
//            request.getRequestDispatcher("/error.html").forward(request,response);
        }
    }

    private void doDel(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String deptno = request.getParameter("deptno");
        Connection conn = null;
        PreparedStatement ps = null;
        int flag= 0 ;

        try {
            conn = DButil.getConnection();
            String sql = "delete from dept where deptno=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,deptno);
            flag = ps.executeUpdate();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButil.close(null,ps,conn);
        }
        if(flag == 1){
            response.sendRedirect(request.getContextPath()+"/showlist");
//            request.getRequestDispatcher("/showlist").forward(request,response);
        }else{
            response.sendRedirect(request.getContextPath()+"/error.html");
//            request.getRequestDispatcher("/error.html").forward(request,response);
        }
    }

    private void doAdd(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String dname = request.getParameter("dname");
        String loc = request.getParameter("loc");
        String deptno = request.getParameter("deptno");

        Connection conn = null;
        PreparedStatement ps = null;
        int flag= 0 ;

        try {
            conn = DButil.getConnection();

            String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, deptno);
            ps.setString(2, dname);
            ps.setString(3, loc);
            flag = ps.executeUpdate();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButil.close(null,ps,conn);
        }
        if(flag== 1){
//            request.getRequestDispatcher("/showlist").forward(request,response);
            response.sendRedirect(request.getContextPath()+"/showlist");
        }else{
            response.sendRedirect(request.getContextPath()+"/error.html");
//            request.getRequestDispatcher("/error.html").forward(request, response);
        }
    }

}

注意:url路径基于'/dept' 的更改!!!!
运行下来很完美!!!!哈哈哈哈,我很快乐!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值