主頁 > 後端開發 > 員工績效管理系統(超級超級詳細 ---未完待更...)

員工績效管理系統(超級超級詳細 ---未完待更...)

2022-01-17 16:53:08 後端開發

一.分級建立專案包     1.建立department包(實作有關department表的操作)           ① 建立dao包(實作資料庫中department的增刪改查操作  建立java和資料庫直接的聯系)                 (1)添加記錄           (2)根據主鍵洗掉           (3)根據查詢條件洗掉           (4)根據主鍵修改其它全部欄位           (5)根據主鍵修改部分其他欄位           (6)根據多條件模糊查詢記錄           (7)根據主鍵查詢一條記錄             ② 建立model包(創建有關department物體類)           ③ 建立service包           ④ 建立servlet包   2.建立employee包(實作有關employee表的操作)           ① 建立dao包(實作資料庫中employee的增刪改查操作  建立java和資料庫直接的聯系)                 (1)添加記錄           (2)根據主鍵洗掉           (3)根據查詢條件洗掉           (4)根據主鍵修改其它全部欄位           (5)根據主鍵修改部分其他欄位           (6)根據多條件模糊查詢記錄           (7)根據主鍵查詢一條記錄           ② 建立model包(創建有關employee物體類)           ③ 建立service包           ④ 建立servlet包   3.建立project包(實作有關project表的操作)           ① 建立dao包(實作資料庫中project的增刪改查操作  建立java和資料庫直接的聯系)                  (1)添加記錄           (2)根據主鍵洗掉           (3)根據查詢條件洗掉           (4)根據主鍵修改其它全部欄位           (5)根據主鍵修改部分其他欄位           (6)根據多條件模糊查詢記錄           (7)根據主鍵查詢一條記錄           ② 建立model包(創建有關project物體類)           ③ 建立service包           ④ 建立servlet包   4.建立score包(實作有關score表的操作)           ① 建立dao包(實作資料庫中score的增刪改查操作  建立java和資料庫直接的聯系)                  (1)添加記錄           (2)根據主鍵洗掉           (3)根據查詢條件洗掉           (4)根據主鍵修改其它全部欄位           (5)根據主鍵修改部分其他欄位           (6)根據多條件模糊查詢記錄           (7)根據主鍵查詢一條記錄           ② 建立model包(創建有關score物體類)           ③ 建立service包           ④ 建立servlet包  5.建立until 工具包(封裝工具類簡化代碼)           ① 建立JDBCUtil工具類(資料庫加載、資料庫連接、資料庫操作、資料庫關閉、)           ② 建立FmtEmpty(判空)           ③ 建立jdbc 組態檔  6.建立init 工具包(封裝工具類簡化代碼)           ① 建立CharFilter工具類(解決資料庫中文亂碼的問題) 二、 整個系統的互動程序(開發流程)     ①建立工具類         (1)hedaer  封裝路徑(java代碼獲取、EL運算式獲取)     ②創建注冊界面(reg.jsp)  css(base.css -- window樣式) <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <!-- <meta charset="UTF-8"> --> <title>注冊頁面</title> <!-- <link rel="stylesheet"  href="https://www.cnblogs.com/demo220111/web/base/layui/css/layui.css" > --> <!-- <script type="text/javascript"  src="https://www.cnblogs.com/demo220111/web/base/layui/layui.js" ></script> --> <!-- 利用包含來簡化代碼(工具類) --> <%@ include file="/web/header.jsp" %> </head> <body > <div >      <fieldset >        <legend>注冊</legend>        <div >          <form >            <div >                       <label >賬號</label>                  <div >                      <input type="text" name="code" required   lay-verify="required"                            placeholder="請輸入賬號"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >密碼</label>                  <div >                      <input type="password" name="pass"  required  lay-verify="required"                            placeholder="請輸入密碼"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >姓名</label>                  <div >                      <input type="text" name="name" required   lay-verify="required"                            placeholder="請輸入姓名"  autocomplete="off" >                       </div>                 </div>                 <div >                  <div >                      <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/注冊"   lay-submit lay-filter="reg" >                          <input type="reset" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置"  >                       </div>                       <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳登錄"   onclick="">                 </div>                     <!-- reg是傳遞給EmployeeServlet 引數 -->                 <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/reg" >          </form>        </div>      </fieldset>       </div> <script type="text/javascript"> var form = layui.form; var $ = layui.jquery; var layer = layui.layer; form.on("submit(reg)",function(data){      //layer.msg("1111");      console.log(data.field)      $.ajax({//四個屬性一個方法            url : base.app +"/EmployeeServlet",            type : "post",            data : data.field, //a=b&c=d /{a:b,c:d}            dataType : "text",//text / json            success : function(data){                 console.log(data)                 // todo            }      }); }); </script>       </body> </html>         (1) <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/注冊" lay-submit lay-filter="reg" >  輸入框不能為空 觸發回呼方法(測驗段) var form = layui.form; var layer = layui.layer; form.on("submit(reg)",function(data){      layer.msg("1111"); });       (2)注冊頁面請求,是請求到employee表中,注冊員工資訊 觸發回呼方法(應用段) <script type="text/javascript"> var form = layui.form; var $ = layui.jquery; var layer = layui.layer; form.on("submit(reg)",function(data){      //layer.msg("1111");      console.log(data.field)      $.ajax({//四個屬性一個方法            url:"",            data:"",            type:"",            dataType:"",            success:function(data){                             }      }); }); </script>       (3)撰寫EmployeeServlet類中的方法 (接受請求、獲取資料、封裝物件、呼叫方法、回傳結果)         注解@WebServlet("/EmployeeServlet")         實作ajax請求互動 private static final long serialVersionUID =1L;            @Override      protected void doGet(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            doPost(req, resp);      }               @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            String res = null;            switch (req.getParameter("action")) {                 case "reg":                      res = reg(req);                      break;            }            // ajax 請求接收            PrintWriter writer = resp.getWriter();            writer.write(res);            writer.flush();            writer.close();            writer = null ;      }      private String reg(HttpServletRequest req) {            String code = req.getParameter("code");            String pass = req.getParameter("pass");            String name = req.getParameter("name");                        EmployeeModel model = new  EmployeeModel(code,name,pass);            return service.insert(model);      }   (4) 實作員工注冊功能(主要測驗能否互動)   (5) 完善員工注冊功能(主要完善業務邏輯) PS:      private static String table = "employee";      private static String cols =  "code,name,pass,code_dept,image";      // 此處的資料庫表欄位 在方法中可以不使用某一個,但是不能在方法中使用沒有的表欄位     1.reg.jsp 檔案 form.on("submit(reg)",function(data){      //layer.msg("1111");      //console.log(data.field)      $.ajax({//四個屬性一個方法            url : base.app +"/EmployeeServlet",            type : "post",            data : data.field, //a=b&c=d /{a:b,c:d}            dataType : "text",//text / json            success : function(data){                 // console.log(data)  測驗ajax請求是否可用                 // todo                 if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){                      layer.msg("注冊成功")                 }else if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/="repeat"){                      layer.msg("注冊失敗,賬號重復")                 }else{                      layer.msg("注冊失敗")                 }            }      }); });     2.EmployeeServiceImpl 檔案 public String insert(EmployeeModel model) {            // return dao.insert(model) + "";  測驗能否實作互動                        // 完善業務邏輯            // 在EmployeeModel 創建code構造方法            EmployeeModel m1 = new  EmployeeModel(model.getCode());            EmployeeModel mdb = dao.selectModel(m1);            if (mdb != null)                 return "repeat";            return dao.insert(model) + "";            }     3.EmployeeModel  創建code 構造方法 public EmployeeModel(String code) {            super();            this.code = code;      }       4.給reg.jsp 頁面添加互動操作(判斷注冊是否成功) var form = layui.form; var $ = layui.jquery; var layer = layui.layer; form.on("submit(reg)",function(data){      //layer.msg("1111");      //console.log(data.field)      $.ajax({//四個屬性一個方法            url : base.app +"/EmployeeServlet",            type : "post",            data : data.field, //a=b&c=d /{a:b,c:d}            dataType:'text',//text / json            success : function(data){                 //console.log(data)  //測驗ajax請求是否可用                 // todo                 if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){                      layer.msg("注冊成功")                 }else if(datahttps://www.cnblogs.com/xmczrj/archive/2022/01/17/=="repeat"){                      layer.msg("注冊失敗,賬號重復")                 }else{                      layer.msg("注冊失敗")                 }            }            error:function(){// 例外處理                 alert("注冊失敗,賬號重復");            }      }); }); 5.使用工具類來簡化reg.jsp 頁面添加操作的代碼 header.jsp (將參考路徑進行封裝) <!-- java代碼 獲取工程名 --> <% String app=request.getContextPath(); %> <meta charset="UTF-8"> <link rel="stylesheet" href="https://www.cnblogs.com/xmczrj/archive/2022/01/17//web/base/css/base.css" > <link rel="stylesheet" href="https://www.cnblogs.com/xmczrj/archive/2022/01/17//web/base/layui/css/layui.css" > <script type="text/javascript" src="https://www.cnblogs.com/xmczrj/archive/2022/01/17//web/base/layui/layui.js" ></script> <!-- EL運算式 獲取工程名 --> <script> var base={            app:"${pageContext.request.contextPath}"             } </script> <script type="text/javascript" src="https://www.cnblogs.com/xmczrj/archive/2022/01/17//web/base/js/base.js"></script>     base.js 工具類(將操作方法進行封裝) var form = layui.form; var $ = layui.jquery; var layer = layui.layer; // 添加監聽 function formSubmit(event,url,dataType,func){      //console.log(event) 除錯      form.on("submit(" +event+")",function(data){      //   console.log(data.field)除錯            ajax(url,data.field,dataType,func)      }) } function ajax(url,field,dataType,func){      //console.log(field)      $.ajax({//四個屬性一個方法            url : base.app + url,            type : "post",            data : field,            dataType : dataType, //后采用            //dataType : "text",//text / json            success : func //         error:function(){// 例外處理 //              alert("注冊失敗,賬號重復"); //         }                  }); }
  1. 封裝 關于請求的  FmtRequest 類
     public class FmtRequest {                  /**       * 根據傳過來的所有引數得到物體類的物件       * 根據請求的引數情況反射物體類的物件   (請求的引數名與物體類的屬性名一致 ,并且一個引數名對應一個引數值 )       *       * @param <T> 反射       * @param req       * @param clazz       * @return       */      public static <T> T parseModel(HttpServletRequest  req,Class<T> clazz) {            T obj = null;            try {                 obj = clazz.newInstance();            } catch (InstantiationException |  IllegalAccessException e) {                 e.printStackTrace();                 return null;            }            Map<String, String[]> map = req.getParameterMap(); //  傳過來的所有引數            for (Entry<String, String[]> entry : map.entrySet())  {                 String name = entry.getKey();                 if("action".equals(name))                      continue;                 try {                      Field field =  clazz.getDeclaredField(name);                      field.setAccessible(true);                      field.set(obj,entry.getValue()[0]);                 } catch (NoSuchFieldError | SecurityException |  NoSuchFieldException | IllegalArgumentException |  IllegalAccessException e) {                      e.printStackTrace();                 }            }                        return obj;      }                  /**       * 根據所傳過來的映射關系得到物體類物件       * 根據映射關系反射得到物體類的物件       *       * @param <T>       * @param req       * @param clazz       * @param fields key=屬性名   value=https://www.cnblogs.com/xmczrj/archive/2022/01/17/引數名       */      private static <T> T parseModel(HttpServletRequest  req,Class<T> clazz,Map<String,String> fields) {            T obj = null;            try {                 obj = clazz.newInstance();            } catch (InstantiationException |  IllegalAccessException e) {                 e.printStackTrace();                 return null;            }            for (Entry<String, String> entry : fields.entrySet())  { // 根據所傳過來的映射關系                 String name = entry.getKey();  // 得到物體類的屬性名                 String val =req.getParameter(entry.getValue());   // 得到物體類的引數名                 try {                      Field field =  clazz.getDeclaredField(name);                      field.setAccessible(true);                      field.set(obj,val);                 } catch (NoSuchFieldError | SecurityException |  NoSuchFieldException | IllegalArgumentException |  IllegalAccessException e) {                      e.printStackTrace();                 }            }                        return obj;      }                        /**       * 將 ajax 請求進行封裝       * @param wr       * @param val       */      public static void write(Writer wr,String val) {            try {                 wr.write(val);                 wr.close();                 wr.flush();            } catch (IOException e) {                 e.printStackTrace();            }            wr = null;                  } }             7.通過應用FmtRequest 類 簡化EmployeeServlet中的代碼 簡化EmployeeServlet中的代碼 private String reg(HttpServletRequest req) {            //String code = req.getParameter("code");            //String pass = req.getParameter("pass");            //String name = req.getParameter("name");            //EmployeeModel model = new  EmployeeModel(code,name,pass);            //return service.insert(model);                        // 利用FmtRequest類中 parseModel方法進行簡化            // 將請求當中的引數得到,映射到對應的物體類中,            EmployeeModel model =  FmtRequest.parseModel(req,EmployeeModel.class);            return service.insert(model);       (6) 實作員工登錄功能(主要完善業務邏輯) <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/登錄" lay-submit  lay-filter="login" > 這里的login 決定了對應的js代碼怎么實作   <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/login" > 這里的login 決定了servlet檔案中的分支怎么實作             1. 創建登錄界面 <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <!-- <meta charset="UTF-8"> --> <title>登錄頁面</title> <!-- <link rel="stylesheet"  href="https://www.cnblogs.com/demo220111/web/base/layui/css/layui.css" > --> <!-- <script type="text/javascript"  src="https://www.cnblogs.com/demo220111/web/base/layui/layui.js" ></script> --> <!-- 利用包含來簡化代碼(工具類) --> <%@ include file="/web/header.jsp" %> </head> <body > <div >      <fieldset >        <legend>注冊</legend>        <div >          <form >            <div >                       <label >賬號</label>                  <div >                      <input type="text" name="code" required   lay-verify="required"                            placeholder="請輸入賬號"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >密碼</label>                  <div >                      <input type="password" name="pass"  required  lay-verify="required"                            placeholder="請輸入密碼"  autocomplete="off" >                       </div>                 </div>                 <div >                  <div >                      <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/登錄"   lay-submit lay-filter="login" >                          <input type="reset" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置"  >                       </div>                       <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳注冊"   onclick="">                 </div> <!--                 reg是傳遞給EmployeeServlet 引數 -->                 <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/login"  >          </form>        </div>      </fieldset>       </div> <script type="text/javascript"> 呼叫servlet中的分支  formSubmit("login","/EmployeeServlet",'text',function(data){//console.log(data)      if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){            layer.msg("登錄成功")      }else if(datahttps://www.cnblogs.com/xmczrj/archive/2022/01/17/=="repeat"){            layer.msg("登錄失敗,賬號重復")      }else{            layer.msg("登錄失敗")      } }) </script> </body> </html>           2. 在servlet中 建立分支   一、 創建login分支 (1)  @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            String res = null;            switch (req.getParameter("action")) {                 case "reg":                      res = reg(req);                      break;                 case "login":                      res = login(req);                      break;            }            // ajax 請求接收            // 利用FmtRequest 工具類中write方法進行簡化            FmtRequest.write(resp.getWriter(), res);                  }   二、生成對應的 login 方法(2)      private String login(HttpServletRequest req) {            EmployeeModel model =  FmtRequest.parseModel(req,EmployeeModel.class);            String res = service.login(model);            return null;      }   實作后(7)      private String login(HttpServletRequest req) {            EmployeeModel model = FmtRequest.parseModel(req,  EmployeeModel.class);            String res = service.login(model); // res 就是EmployeeServiceImpl中 login方法中的 0、1、2            if ("1".equals(res)) {                 req.getSession().setAttribute("user",  service.selectModel(model));            }            return res;      }                 3.先在IEmployeeService介面中創建用于登錄的方法 參考文章地址:https://blog.csdn.net/lemo_ice/article/details/100690860?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_paycolumn_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3 用到了抽象類的注入 --暫不確定 自己理解的 小明有添加的功能 可以通過介面實作小明擁有按人名添加的功能 小紅有添加的功能 可以通過介面實作小明擁有按id添加的功能   IEmployeeService類(3)   String login(EmployeeModel model);   實作后(6) /**       * 登錄功能       *       * @param model       * @return String 0=賬號不存在   1=登錄成功   2=密碼錯誤       */      String login(EmployeeModel model);             4.IEmployeeService介面新加了login方法它的實作類(EmployeeServiceImp)也需要對添加方法進行實作(重寫) EmployeeServiceImpl類 (4) @Override      public String login(EmployeeModel model) {            // TODO Auto-generated method stub            return null;      }   實作后:(5) @Override      public String login(EmployeeModel model) {            EmployeeModel mdb = selectModel(model);            if (mdb == null)                 return "0";            String pass = MD5.encode(model.getPass());            return mdb.getPass().equals(pass) ? "1" : "2";      }             5. 將密碼MD5加密(此處在service中加密MD5) 將注冊后加密結果和登錄時加密結果進行比較判斷是否正確 注冊加碼 @Override      public String insert(EmployeeModel model) {            // return dao.insert(model) + "";  測驗能否實作互動                  // 完善業務邏輯            // 在EmployeeModel 創建code構造方法            EmployeeModel m1 = new  EmployeeModel(model.getCode());            EmployeeModel mdb = dao.selectModel(m1);            if (mdb != null)                 return "repeat";            model.setPass(MD5.encode(model.getPass()));            return dao.insert(model) + "";        } 登錄加密 @Override      public String login(EmployeeModel model) {            EmployeeModel mdb = selectModel(model);            if (mdb == null)                 return "0";            String pass = MD5.encode(model.getPass());            return mdb.getPass().equals(pass) ? "1" : "2";      }     6.在登錄界面添加跳轉注冊界面,在注冊界面添加跳轉登錄界面 注冊界面跳轉登錄界面     html: <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳登錄"   onclick="toHref()">   javascript function toHref(){      location.href = https://www.cnblogs.com/xmczrj/archive/2022/01/17/base.app +"/web/login.jsp"; }   登錄界面跳轉注冊界面 html: <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳注冊"   onclick="toHref()">     javascript function toHref(){      location.href = https://www.cnblogs.com/xmczrj/archive/2022/01/17/base.app +"/web/reg.jsp"; }   簡化代碼 在base.js 檔案中添加 function toHref(url){      location.href = https://www.cnblogs.com/xmczrj/archive/2022/01/17/base.app + url; } 修改注冊界面代碼 <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳注冊"   onclick="toHref('/web/reg.jsp')"> 修改登錄界面代碼 <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/回傳登錄"   onclick="toHref('/web/login.jsp')"> (7) 實作主界面功能     1.創建page檔案夾(登錄之后的操作 --- 防盜鏈)      2.從登錄界面跳轉 (layui 彈出層) formSubmit("login","/EmployeeServlet",'text',function(data){//console.log(data)      if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/= 1){ layer.msg("登錄成功哦!!!",{time:1000},function(){                 toHref("/web/page/main.jsp")            })      }else if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/= 2){ layer.msg("登錄失敗,密碼錯誤!!!")      }else if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/= 0){ layer.msg("登錄失敗,賬號不存在!!!")      } })             3.創建主界面(layui) <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <%@ include file="/web/header.jsp" %> <meta charset="UTF-8"> <title>主界面</title> </head> <body> <body> <div >   <div >     <div >員工績效管理系統</div>     <!-- 頭部區域(可配合layui 已有的水平導航) -->     <ul >       <!-- 移動端顯示 -->       <li lay-header-event="menuLeft">         <i ></i>       </li>              <li ><a href="">部門資訊</a></li>       <li ><a href="">員工資訊</a></li>       <li ><a href="">專案資訊</a></li>       <li >         <a href="javascript:;">績效資訊</a>         <dl >           <dd><a href="">menu 11</a></dd>           <dd><a href="">menu 22</a></dd>           <dd><a href="">menu 33</a></dd>         </dl>       </li>     </ul>     <ul >       <li >         <a href="javascript:;">           <img src="https://www.cnblogs.com/xmczrj/archive/2022/01/17//web/base/img/1.jpeg"  >             用戶&nbsp[&nbsp&nbsp&nbsp${user.name}&nbsp&nbsp&nbsp]         </a>         <dl >           <dd><a href="">修改個人資料</a></dd>           <dd><a href="">修改個人密碼</a></dd>           <dd><a href="">修改個人博客</a></dd>         </dl>       </li>       <li lay-header-event="menuRight"  lay-unselect>         <a href="javascript:;">           <i ></i>         </a>       </li>     </ul>   </div>      <div >     <div >       <!-- 左側導航區域(可配合layui已有的垂直導航) -->       <ul lay-filter="test">         <li >           <a href="javascript:;">資訊維護</a>           <dl >             <dd><a href="javascript:;"  data-url="/web/page/department/list.jsp"  >部門資訊維護</a></dd>             <dd><a href="javascript:;"  data-url="/web/page/employee/list.jsp"  >員工資訊維護</a></dd>             <dd><a href="javascript:;"  data-url="/web/page/employee/list.jsp"  >專案資訊維護</a></dd>             <dd><a href="javascript:;"  data-url="/web/page/department/list.jsp">績效資訊維護</a></dd>           </dl>         </li>         <li >           <a href="javascript:;">menu group 2</a>           <dl > <!--             實作打開網頁顯示主體網頁 -->             <dd><a  href="javascript:openurl('/web/page/department/list.jsp');">list  1</a></dd>             <dd><a href="javascript:;">list 2</a></dd>             <dd><a href="">超鏈接</a></dd>           </dl>         </li>       </ul>     </div>   </div>      <div >     <!-- 內容主體區域 -->     <iframe name="framA" height="97%"></iframe>   </div>      <div >     <!-- 底部固定區域 -->       有問題請聯系我們!0000-0000000   </div> </div> <script type="text/javascript"> //JS // 使用 H5(jQuery) 提供的 data-url實作打開后顯示主體網頁     data-url="/web/page/department/list.jsp" $('.site-demo-active').click(function(){      window.open(base.app + $(this).data("url"),"framA") }) $('.site-demo-active').click() // 默認打開第一個 // <!--               實作打開網頁顯示主體網頁 --> function openurl(url){      window.open(base.app + url,'framA') } </script> </body> </body> </html> 4.主界面退出操作 (layui)     (1).mian.jsp html <li >            <a href="javascript:toLogout()">退出</a> </li>   js function toLogout(){      layerConfirm(function(){            toHref('/EmployeeServlet?action=logout')      },"您確定要離開了嗎?") }   base.js function layerConfirm(func,title){      layer.confirm(title ? title : "確定要進行該操作?",{            icon:3,            title:"提示"      },func) }         (2). EmployeeServlet 實作分支      case "logout":                 req.getSession().removeAttribute("user");                 resp.sendRedirect(req.getContextPath()+"/web/login.jsp");                 break;   5.防盜鏈的功能 (UserFilter類來實作,用戶退出后或未登錄情況下,無法訪問page檔案下的界面) @WebFilter(urlPatterns =  {"/web/page/*","/EmployeeServlet","/DepartmentServlet","/ProjectServlet","/ScoreServlet"}) public class UserFilter implements Filter { // 防盜鏈  確認當前地址欄用戶是否登錄      @Override      public void doFilter(ServletRequest request,  ServletResponse response, FilterChain chain)                 throws IOException, ServletException {            HttpServletRequest req = (HttpServletRequest)  request;            String action = req.getParameter("action");            if("reg".equals(action)||"login".equals(action)) { //  將 注冊請求和登錄請求單獨放行                 chain.doFilter(request, response);                 return;            }             Object user = req.getSession().getAttribute("user");             if (user == null) {                 req.getRequestDispatcher("/web/login.jsp").forward(request,  response);// 進行頁面跳轉(請求轉發)            } else                 chain.doFilter(request, response);      }       }   6.  右側邊欄 操作展示功能 html <li lay-header-event="menuRight"  lay-unselect>         <a href="javascript:openRight();">請求處理           <i ></i>         </a>  </li>   js function openRight(){      layer.open({            type:1            ,content:'<div >處理右側面板的操作</div>'            ,area:['260px','100%']            ,offset:'rt'//右上角            ,anim:5            ,shadeClose:true      }); } 7.主界面主體查詢操作部分(layui 面板)         (1)html 操作代碼 面板上半部分 html: <div >   <div >     <h2 >部門資訊--查詢條件</h2>     <div >                   <fieldset   >              <legend>部門資訊--查詢條件</legend>              <div >                <form >                  <div >                             <label >編號</label>                        <div >                            <input type="text" name="code" placeholder="請輸入編號"  autocomplete="off" >                             </div>                             <label >名稱</label>                        <div >                            <input type="text" name="name"  placeholder="請輸入名稱" autocomplete="off" >                             </div>                              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                             <span>                                 <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/查詢" lay-submit lay-filter="search"  >                                <input type="reset" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置"  >                                 <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/添加" lay-submit lay-filter="search"  >                             </span>                       </div> <!--                 reg是傳遞給EmployeeServlet 引數 --> <!--                  <input type="hidden" name="action"  value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/login" > -->                </form>              </div>            </fieldset>     </div>   </div> </div>   面板下半部分 HTML: <!-- 面板下半部分 --> <table > <!-- colgroup限制寬度 -->      <colgroup>            <col ><col ><col   ><col ><col >      </colgroup>      <thead>            <tr>            <th>序號</th><th>編號</th><th>名稱</th><th>電話</th><th>操作</th>            </tr>      </thead>      <tbody>                  </tbody>       </table> <script type="text/javascript"> // base檔案要先在base.js檔案中定義出來 // var element =layui.element; // 折疊面板不好用 記得用渲染 // element.render(); </script>             (2)JavaScript操作代碼 script 實作 部分代碼 解釋: //function formSubmit(event,url,dataType,func){ //   //console.log(event) 除錯 //   form.on("submit(" +event+")",function(data){ //   //   console.log(data.field)除錯 //         ajax(url,data.field,dataType,func) //   }) //} // 呼叫了base.js 檔案  取出 查詢行中( <input type="button"  value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/查詢" lay-submit  lay-filter="search" >)的search   //  此處 search是網頁查詢行的方法    //  EmployeeServlet是實作業務邏輯的類 //  json  是請求傳遞的引數型別 以json形式傳遞   formSubmit('search','/EmployeeServlet','json',function(data){})      formSubmit 類比base.js 檔案         (3)EmployeeServlet中操作代碼 one:先繼承HttpServlet public class EmployeeServlet extends HttpServlet {}   two:定義程式 序列化ID public class EmployeeServlet extends HttpServlet {      private static final long serialVersionUID = 1L; }   three: 創建表單提交資料到服務器的方式 public class EmployeeServlet extends HttpServlet {      private static final long serialVersionUID = 1L;         (4) EmployeeServlet中建立業務邏輯分支 @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            String res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            default:                 break;            }      }             list 通過隱藏域(hidden) 來傳遞到EmployeeServlet中  通過EmployeeServlet 中 'list' 分支來實作表格中資料的加載 lsit.jsp檔案 <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/list">            這樣就可以實作list分支的方法了 常用套路: 1接受請求、 2獲取資料、 3封裝物件、 4呼叫方法、 5回傳結果   1接受請求、  String conextPath = req.getContextPath();  String path1 = "/web/success.jsp"; 2獲取資料、 DepartmentModel model2 = new DepartmentModel();      req.getParameter("code");      req.getParameter("name");     可以利用工具類簡化   // 將所有請求的引數映射到物體類中      DepartmentModel model =FmtRequest.parseModel(req,  DepartmentModel.class);               return null;   1和2 利用工具類簡化后:      private String list(HttpServletRequest req) {        // 將所有請求的引數映射到物體類中        DepartmentModel model =FmtRequest.parseModel(req,  DepartmentModel.class);              return null;      }   3封裝物件(1)、     在介面(IDepartmentService)中定義方法(至少有這五個)  public interface IDepartmentService {      String insert(DepartmentModel model);      String delete(DepartmentModel model);      String update(DepartmentModel model);      List<DepartmentModel> selectList(DepartmentModel model);      DepartmentModel selectModel(DepartmentModel model); } 3封裝物件(2)、     在實作類中(EmployeeServiceImpl)重寫方法 ,根據對應的方法去資料庫里查找         初始版本 public class DepartmentServiceImpl  implements  IDepartmentService{      private IDepartmentDao dao2  = new Department2DaoImpl();                  @Override      public String insert(DepartmentModel model) {            return dao2.Insert(model)+"";      }      @Override      public String delete(DepartmentModel model) {            return dao2.delete(model)+"";      }      @Override      public String update(DepartmentModel model) {            return dao2.updateActive(model)+"";      }      @Override      public List<DepartmentModel> selectList(DepartmentModel  model) {            return dao2.selectList(model);      }      @Override      public DepartmentModel selectModel(DepartmentModel model)  {            return dao2.selectModel(model);      }            簡單實作查詢方法     @Override      public List<DepartmentModel> selectList(DepartmentModel  model) {            String code = model.getCode();            model.setCode(code == null ? "%" : "%" + code + "%");            String name = model.getName();            model.setName(name == null ? "%" : "%" + name + "%");            return dao2.selectList(model);      }      4呼叫方法(通過呼叫IDepartmentService介面來呼叫實作方法)     List<DepartmentModel> selectList(DepartmentModel model);   5回傳結果     private String list(HttpServletRequest req) {         // 將所有請求的引數映射到物體類中         DepartmentModel model =FmtRequest.parseModel(req,  DepartmentModel.class);             // service.selectList(model)  回傳的是集合         List<DepartmentModel> list =  service.selectList(model);         return null;      }     簡化后:     private List<DepartmentModel> list(HttpServletRequest req) {       // 將所有請求的引數映射到物體類中          DepartmentModel model =FmtRequest.parseModel(req,  DepartmentModel.class);              // service.selectList(model)  回傳的是集合          return service.selectList(model);      }          這里由于回傳的是集合 就不能用字串接收了 就需要 將doPost中的String型別的res 修改為Object型來接收(DepartmentServlet檔案下        @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            Object res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            default:                 break;            }             FmtRequest.write(resp.getWriter(), res);              // 難點:這里重寫了FmtRequest工具類中的write方法      }   至此完成一個 從 網頁到 java 再從java到資料庫  再資料庫回傳到java 最后從Java(傳遞)展示在網頁上 FmtRequest工具類中的write方法重寫代碼為: public static void write(Writer wr,Object val) {            if (val instanceof Collection<?>) { // 判斷物件是否為線性集合                 write(wr, new  JSONArray((Collection<?>)val).toString());                 //傳進去的線性集合,在傳過來的時候進行向下轉型(var 是Object型別 最大了),                 //轉型完之后傳遞到JSONArray當中在呼叫toString方法得到json格式的字串,                 //將json格式的字串再傳遞給write方法,再寫回給網頁,            } else if(val instanceof String){ // 判斷物件是否為字串                 write(wr, val.toString());            }else if (val instanceof Map<?, ?>) { // 判斷物件是否為map集合                 write(wr, new  JSONObject((Map<?,?>)val).toString());            }else {// 判斷是否為(其它物件)物體類                 write(wr, new JSONObject(val).toString());            }                  }             (5) 完善javascript 功能 1 . base.js 檔案添加 var laytpl = layui.laytpl;   list.js檔案 element.render(); formSubmit('search','/DepartmentServlet','json',function(data){ //    console.log(data)       var html = "";       var tpl = $("#tradd").html();         $.方法  別忘了加 $.       $.each(data , function(i,dom){             var d =  {id:i,code:dom.code,name:dom.name,tel:dom.tel}             html += laytpl(tpl).render(d);       })       $("tbody").html(html); })   2.(只包含紫色部分) //  實作一開的主體界面 不用點查詢 就可以顯示資料,為后續的添加操作和 洗掉操作奠基(相當于重繪吧) function refresh(){      $("input[value='https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置' ]").click();      $("input[value='https://www.cnblogs.com/xmczrj/archive/2022/01/17/查詢' ]").click(); }refresh();   </script> <!-- 定義模板引擎 --> <script type="text/html" id="tradd"> <tr>      <td>{{d.id}}</td><td>{{d.code}}</td><td>{{d.name}}</td><td>{{d.tel}}</td>      <td>            <a href="javascript:" >洗掉</a>            <a href="javascript:" >修改</a>      </td> </tr> </script> 8.主界面主體添加操作部分(彈出層)         添加(1)在base.js 定義彈出層 方法(主要測驗能否彈出 ,一步一步,慢慢來) // layui 彈出層 function layerOpen(url , end){      layer.open({            type : 2,                                  // 彈出視窗的形式            content : base.app + url,                  // 彈出視窗的內容(路徑,將路徑上的網頁展示在彈出視窗中)            area : ['650px','450px'],                  // 彈出視窗的大小尺寸            fixed : false,                             // 彈出視窗的 固定(不可拖動)            maxmin : true,                             // 彈出視窗的最大化            shade : 0.3,                               // 彈出視窗的陰影            closeBtn : 1,                              // 彈出視窗的關閉按鈕            shadeClose : false,                        // 點擊遮罩是否關閉            success : function(layero,index){          //  成功打開后要呼叫的方法                             },            end : end                                  // 關閉后要呼叫的方法                                   }) }        添加   (2)在list.jsp 檔案中 添加 靜態事件系結(html中),并且創建add.jap添加跳轉后的頁面     <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/添加"   onclick="openAdd()" >       添加   (3)在list.jsp 檔案中 給添加按鈕創建跳轉方法  // 實作 一開的主體界面 不用點查詢 就可以顯示資料   為后續的添加操作和  洗掉操作奠基(相當于重繪吧) function refresh(){      $("input[value='https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置' ]").click();      $("input[value='https://www.cnblogs.com/xmczrj/archive/2022/01/17/查詢' ]").click(); }refresh();   // 定義添加方法 function openAdd(){      // 測驗添加按鈕能否彈出      // layer.msg(123)      // 呼叫layerOpen方法      layerOpen("/web/page/department/add.jsp" , refresh); }        關閉 (1) 在base.js檔案中 定義關閉方法 // 彈出層關閉 function layerClose(){                                    // 當你在iframe頁面關閉自身時      var index = parent.layer.getFrameIndex(window.name); // 先得到當前iframe層的索引      parent.layer.close(index);                           // 再執行關閉 }             關閉  (2) 在add.js檔案中添加關閉的靜態事件系結 <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/關閉"   onclick="layerClose()" >          實作資料添加操作    (1)html檔案 的操作 首先完善 add.jsp 頁面的html代碼 <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <%@ include file="/web/header.jsp" %> <meta charset="UTF-8"> <title>部門添加界面</title> </head> <body> <fieldset >        <legend>部門添加界面</legend>        <div >          <form >            <div >                       <label >編號</label>                  <div >                      <input type="text" name="code" required   lay-verify="required"                            placeholder="請輸入編號"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >名稱</label>                  <div >                      <input type="text" name="name" required   lay-verify="required"                            placeholder="請輸入名稱"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >電話</label>                  <div >                      <input type="text" name="tel" required   lay-verify="required"                            placeholder="請輸入聯系方式"  autocomplete="off" >                       </div>                 </div>                 <div >                  <div >                         // 添加動態事件系結   1                      <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/確定"   lay-submit lay-filter="add" >                          <input type="reset" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置"  >                          <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/關閉"   onclick="layerClose()" >                       </div>                 </div>                 <!-- reg是傳遞給EmployeeServlet 引數 -->                 <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/reg" >          </form>        </div>      </fieldset>             <script type="text/javascript"> // 2 實作添加操作的JavaScript代碼 formSubmit("add","/DepartmentServlet",'text',function(data){console.log(data)      if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){            layer.msg("添加成功",layerClose)      }else if(datahttps://www.cnblogs.com/xmczrj/archive/2022/01/17/=="repeat"){            layer.msg("添加失敗,編號重復")      }else{            layer.msg("添加失敗")      } }) </script>   </body> </html>              實作資料添加操作    (2) 在DepartmentServlet類中 定義add 分支和 創建add方法   1. 定義 add 分支    @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            Object res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            case "add":                 res = add(req);                 break;                             default:                 break;            }            FmtRequest.write(resp.getWriter(), res);      }   2. 創建 add 方法       /**       * 定義上述分支中的 add方法       * @param req       * @return       */      private String add(HttpServletRequest req) {            DepartmentModel model =FmtRequest.parseModel(req,  DepartmentModel.class);                return service.insert(model);      }  實作資料添加操作    (3) 去IDepartmentService介面中 定義insert方法       String insert(DepartmentModel model);  實作資料添加操作    (4)在DepartmentServiceImpl中  通過介面(IDepartmentService) 重寫添加的業務邏輯 DepartmentServiceImpl類中   1. 重寫insert 業務邏輯 @Override      public String insert(DepartmentModel model) {             // 2 和 3 只是為了在這里查詢判斷時更嚴謹            if (selectModel(model) == null) {                 Integer res = dao2.Insert(model);                 return res == null ? null : res.toString();            }            return "repeat";      }   2.為了更嚴謹一點 先在 DepartmentModel  添加code 無參構造方法和有參構造方法 public DepartmentModel() {// 無參構造方法         }      public DepartmentModel(String code) { // 有參構造方法            this.code = code;      } 3. 在呼叫selectModel 方法查詢判斷 code欄位 @Override      public DepartmentModel selectModel(DepartmentModel model)  {            return dao2.selectModel(new  DepartmentModel(model.getCode()));      }   實作資料洗掉操作   (1)在 list.jsp中 實作洗掉的html代碼 <script type="text/html" id="tradd"> <tr>      <td>{{d.id}}</td><td>{{d.code}}</td><td>{{d.name}}</td><td>{{d.tel}}</td>      <td>            <a href="javascript:del('{{d.code}}')"   >                 <i class='layui-icon layui-icon-delete'></i>            </a>            <a href="javascript:"   >修改</a>      </td> </tr> </script> 實作資料洗掉操作     (2)在 list.jsp中 實作洗掉的javascrip代碼   // 定義洗掉方法 function del(code){      // 測驗方法是否可用  1      //layer.msg(code)      layerConfirm(function(index){            // 測驗layerConfirm提示是否可用  2            // layer.msg(code);            // 通過呼叫 base.js 檔案的ajax請求 實作洗掉   注意: code是欄位  del 是DepartmentServlet的 del 分支            ajax("/DepartmentServlet",{code:code,action:'del'})      }) }   // 完善洗掉方法 function del(code){      // 測驗方法是否可用      //layer.msg(code)      layerConfirm(function(index){            // 測驗layerConfirm提示是否可用            // layer.msg(code);            ajax("/DepartmentServlet",{code:code,action:'del'},"text",function(data){                 // 測驗ajax 呼叫是否可行                 // console.log(data)                 if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/= 1){                      layer.msg("洗掉成功",refresh)                 }else{                      layer.msg("洗掉失敗")                 }                })      }) } 實作資料洗掉操作  (3)在DepartmentServlet中創建del 分支 并創建對應的del方法 DepartmentServlet 類中 1. 創建del 分支      @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            Object res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            case "add":                 res = add(req);                 break;            case "del":                 res = del(req);                 break;            default:                 break;            }            FmtRequest.write(resp.getWriter(), res);      } 2. 創建del 方法 private Object del(HttpServletRequest req) {            return service.delete(FmtRequest.parseModel(req,  DepartmentModel.class));      } 實作資料洗掉操作     (4)在IDepartmentService介面中創建del方法 public interface IDepartmentService {      String insert(DepartmentModel model);      String delete(DepartmentModel model);      String update(DepartmentModel model);      List<DepartmentModel> selectList(DepartmentModel model);      DepartmentModel selectModel(DepartmentModel model); } 實作資料洗掉操作  (5)在IDepartmentServiceImpl中重寫del方法 @Override      public String delete(DepartmentModel model) {            Integer res = dao2.delete(model);            return res == null ? null : res.toString();      } 實作資料洗掉操作  (6)在IDepartment2DaoImpl中重寫del方法      @Override      public Integer delete(DepartmentModel model) {            StringBuffer sql = new StringBuffer(" delete from  department ");            // 通過使用工具類JDBCUtil 簡化 根據查詢條件的洗掉操作代碼            List<Object> values = appendWhere(sql,model); // 這里呼叫了appendWhere去判斷是否對應            return JDBCUtil1.update(sql.toString(), values);      } 實作資料洗掉操作  (7)在IDepartment2DaoImpl中呼叫了appendWhere去判斷是否對應 private List<Object> appendWhere(StringBuffer sql,  DepartmentModel model) {            sql.append("where 1=1");            List<Object> values = new ArrayList<>();            try {                 String code = model.getCode();                 if (!FmtEmpty.isEmpty(code)) {                      sql.append(" and code like ? ");                      values.add(code);                 }                 String name = model.getName();                 if (!FmtEmpty.isEmpty(name)) {                      sql.append(" and name like ? ");                      values.add(name);                 }                 String tel = model.getTel();                 if (!FmtEmpty.isEmpty(tel)) {                      sql.append(" and tel like ? ");                      values.add(tel);                 }            } catch (Exception e) {                 e.printStackTrace();            }            return values;      } 實作資料洗掉操作  (8)將結果回傳到DepartmentServlet中 的del 方法中去 在回到 分支里面去判斷 private Object del(HttpServletRequest req) {            return service.delete(FmtRequest.parseModel(req,  DepartmentModel.class));      } 實作資料洗掉操作  (9)如果 res = del(req)  則在資料庫中洗掉成功  @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            Object res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            case "add":                 res = add(req);                 break;            case "del":                 res = del(req);                 break;            default:                 break;            }            FmtRequest.write(resp.getWriter(), res);      } 實作資料洗掉操作  (10)回傳到 list.jsp檔案中 執行if判斷做出相應的提示 // 定義洗掉方法 function del(code){      // 測驗方法是否可用      //layer.msg(code)      layerConfirm(function(index){            // 測驗layerConfirm提示是否可用            // layer.msg(code);            ajax("/DepartmentServlet",{code:code,action:'del'},"text",function(data){                 console.log(data)                 if(data =https://www.cnblogs.com/xmczrj/archive/2022/01/17/= 1){                      layer.msg("洗掉成功",refresh)                 }else{                      layer.msg("洗掉失敗")                 }                })      }) } ajax請求實作資料修改操作(前半部分 回顯)  (1) 在list.jsp 創建修改頁面的跳轉 方法 1.創建修改按鈕 <script type="text/html" id="tradd"> <tr>      <td>{{d.id}}</td><td>{{d.code}}</td><td>{{d.name}}</td><td>{{d.tel}}</td>      <td>            <a href="javascript:del('{{d.code}}')"   >                 <i class='layui-icon layui-icon-delete'></i>            </a>           <a href="javascript:openUpd('{{d.code}}')" >修改</a>      </td> </tr> </script>   2. // 定義修改方法 function openUpd(code){      // 通過修改頁面的路徑 傳引數      layerOpen("/web/page/department/upd.jsp?code="+code ,  refresh); } ajax請求實作資料修改操作(前半部分 回顯)   (2)  創建修改頁面 upd.jsp  獲取引數 <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <%@ include file="/web/header.jsp" %> <meta charset="UTF-8"> <title>修改頁面</title> </head> <body> <fieldset >        <legend>部門修改界面</legend>        <div >          <form >            <div >                       <label >編號</label>                  <div >                      <input type="text" name="code" required   lay-verify="required"                            placeholder="請輸入編號"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >名稱</label>                  <div >                         <!-- readonly  不可修改 -->                      <input type="text" name="code" required   lay-verify="required" readonly                            placeholder="請輸入編號"  autocomplete="off" >                       </div>                 </div>                 <div >                       <label >電話</label>                  <div >                      <input type="text" name="tel" required   lay-verify="required"                            placeholder="請輸入聯系方式"  autocomplete="off" >                       </div>                 </div>                 <div >                  <div >                      <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/確定"   lay-submit lay-filter="get" >                          <input type="reset" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/重置"  >                          <input type="button" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/關閉"   onclick="layerClose()" >                       </div>                 </div>                 <!-- reg是傳遞給EmployeeServlet 引數 -->                 <input type="hidden" name="action" value="https://www.cnblogs.com/xmczrj/archive/2022/01/17/get" >          </form>        </div>      </fieldset> <script type="text/javascript"> // 得到傳入的引數 code var code = '<%=request.getParameter("code")%>'; // layer.msg(code) function init(){      ajax("/DepartmentServlet",{code:code,action:'get'},'json',function(data){            console.data(data)                  }) } </script> </body> </html> ajax請求實作資料修改操作(前半部分 回顯)   (3)  創建DepartmentServlet 類中的 get 分支 和 get方法 1. 創建get 分支 @Override      protected void doPost(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {            Object res = null;            switch (req.getParameter("action")) {            case "list":                 res = list(req);                 break;            case "add":                 res = add(req);                 break;            case "del":                 res = del(req);                 break;            case "get":                 res = get(req);                 break;            default:                 break;            }            FmtRequest.write(resp.getWriter(), res);      } 2.創建get 方法      /**       * 定義上述分支中的 get方法       * @param req       * @return       */      private DepartmentModel get(HttpServletRequest req) {            return service.selectModel(FmtRequest.parseModel(req,  DepartmentModel.class));                  }  ajax請求實作資料修改操作(前半部分 回顯)   (3)  通過IDepartmentService介面呼叫DepartmentServiceImpl實作的方法 IDepartmentService介面      DepartmentModel selectModel(DepartmentModel model);   DepartmentServiceImpl實作類     @Override          public DepartmentModel selectModel(DepartmentModel model)  {                return dao2.selectModel(new  DepartmentModel(model.getCode()));          } 再次通過dao2在呼叫Department2DaoImpl中的selectModel重寫方法           @Override      public DepartmentModel selectModel(DepartmentModel model)  {            StringBuffer sql = new StringBuffer("select  id,code,name,tel from ");            sql.append(table).append(" where code =? ");            // 通過使用工具類JDBCUtil 簡化根據主鍵查詢一條記錄的代碼            List<Object> values = Arrays.asList(model.getCode());            return JDBCUtil1.queryModel(sql.toString(), values,  DepartmentModel.class);      }  ajax請求實作資料修改操作(前半部分 回顯)   (4) 將結果回傳到 DepartmentServlet中 先回傳給  get 方法   再回傳給 get分支判斷 是否 相等  如果相等 將資料以json的形式傳回到upd.jsp網頁中 執行回顯方法   ajax請求 實作資料修改操作(前半部分 回顯)   (5) 如果分支判斷相等 ,就將資料以json的形式傳回網頁 執行回顯方法  完成操作 // 得到傳入的引數 code var code = '<%=request.getParameter("code")%>'; // 測驗點擊修改是否能得到相應的code // layer.msg(code) function init(){      ajax("/DepartmentServlet",{code:code,action:'get'},'json',function(data){            console.log(data)            $("input[name='code']").val(data.code)            $("input[name='name']").val(data.name)            $("input[name='tel']").val(data.tel)            form.val("formA",{code:data.code,name:data.name,tel:data.tel});      //   form.val("formA",data);      }) } // 不呼叫 init方法 它怎么執行!!! init(); ajax請求實作資料修改操作(后半部分 更新)       (6) upd.jsp 頁面創新 upd 方法 formSubmit("upd","/DepartmentServlet",'text',function(data){//console.log(data)      if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){ layer.msg("修改成功",layerClose)      }else{            layer.msg("修改失敗")      } }) ajax請求實作資料修改操作(后半部分 更新)       (7) 去DepartmentServlet 檔案創建upd 分支 和 upd 執行方法 1. upd 分支          case "upd":             res = upd(req);             break;      2. upd 方法      /**       * 定義上述分支中的 upd方法  修改的前半部分   更新       * @param req       * @return       */      private Object upd(HttpServletRequest req) {            return service.update(FmtRequest.parseModel(req,  DepartmentModel.class));      } ajax請求實作資料修改操作(后半部分 更新)       (8) 通過 介面 和實作類 執行 update 方法 1. 先呼叫IDepartmentService介面 public interface IDepartmentService {      String update(DepartmentModel model); }   2. 在呼叫DepartmentServiceImpl實作類重寫方法      @Override      public String update(DepartmentModel model) {            return dao2.updateActive(model)+"";      }   3. 呼叫DepartmentServiceImpl  中的updateActive方法(先呼叫IDepartmentDao介面) public interface IDepartmentDao {     Integer updateActive(DepartmentModel model); }   4. 呼叫DepartmentServiceImpl  中的updateActive方法(再呼叫Department2DaoImpl實作類中的updateActive 方法) public class Department2DaoImpl implements IDepartmentDao {      @Override      public Integer updateActive(DepartmentModel model) {            StringBuffer sql = new StringBuffer("update "); // 字串的拼接一定要會            sql.append(table).append(" set id = id ");            // 通過使用工具類JDBCUtil 簡化根據主鍵修改部分其他欄位操作的代碼            List<Object> values = appendSet(sql, model); // 這里又呼叫了appendSet方法執行后回傳            return JDBCUtil1.update(sql.toString(), values);      }       private List<Object> appendSet(StringBuffer sql, DepartmentModel  model) { // 定義字串拼接方法            List<Object> values = new ArrayList<Object>();            String name = model.getName();            if (FmtEmpty.isEmpty(name)) { // 判斷有沒有物件以及是否為空 str == null || str.trim().isEmpty()                 sql.append(",name=? ");// 字串的拼接一定要會                 values.add(name);            }            String tel = model.getTel();            if (tel != null) {                 sql.append(" ,tel=? ");// 字串的拼接一定要會                 values.add(tel);            }            sql.append("where code = ? ");            values.add(model.getCode());            return values;      } } ajax請求實作資料修改操作(后半部分 更新)       (8) 將 結果再依次回傳  并將引數傳回到 upd.jsp 檔案中 繼續執行if 判斷 顯示相應提示 完成 更新操作, // 修改的后半部分 更新資料 formSubmit("upd","/DepartmentServlet",'text',function(data){//console.log(data)      if(data=https://www.cnblogs.com/xmczrj/archive/2022/01/17/=1){            layer.msg("修改成功",layerClose)      }else{            layer.msg("修改失敗")      } }) 分頁的實作                                 為了減少時間 暫時去掉了防盜鏈功能UserFilter類上面的注解 注釋了 最后記得取消掉啊!!!!!!!!! 三、互動程序   接受請求:   web-->servlet-->service-->dao-->sql  回應請求: table-->model-->dao( *jdbc - 資料庫和Java*)-->web-->servlet(*網頁和Java*)-->service   servlet (每個分支的程序(1接受請求、2獲取資料、3封裝物件、4呼叫方法、5回傳結果))   四、未實作錯誤點  
  1. dataType : "text",//text / json  可以
    dataType : "json",    不可以--- 原因是EmployeeServlet 中回傳型別不對應,不是json型別,暫時采用 例外拋出的方式 dataType:'text' 只能是文本 dataType:'json' 可以是文本也可以是json     網上尋找的方法:通過建立例外拋出將錯誤資訊展示出來(只能是湊合,不嚴謹 -- 屬于只能是勉強看上去是正確的!) function ajax(url,field,func){      //console.log(field)      $.ajax({//四個屬性一個方法            url : base.app + url,            type : "post",            data : field,            //dataType : "json",//text / json            success : func,          error:function(){// 例外處理               alert("注冊失敗,賬號重復");          }                  }); }       后來采用: function formSubmit(event,url,dataType,func){      //console.log(event) 除錯      form.on("submit(" +event+")",function(data){      //   console.log(data.field)除錯            ajax(url,data.field,dataType,func)      }) } function ajax(url,field,dataType,func){      //console.log(field)      $.ajax({//四個屬性一個方法            url : base.app + url,            type : "post",            data : field,            dataType : dataType, //后采用            //dataType : "text",//text / json            success : func      }); }   2.使用請求轉發的方式實作 回顯(get2)方法   未實作 報方法不可用     五、已解決錯誤點   判斷注冊輸入賬號是否存在  老師用的是 反射  EmployeeDaoImpl類中  //   private static String cols = "code,name,pass";      private static String cols =  "code,name,pass,code_dept,image";      // 此處的資料庫表欄位 在方法中可以不使用某一個,但是不能在方法中使用沒有的表欄位   控制臺報 SQL陳述句錯誤   code=‘網頁你輸入的數’   關于字串拼接(沒搞明白)===》 (苦思冥想 終于解決,但是原因居然是因為空格  ,append的空格沒對起來    還要記得里面有符號時要加 轉義字符   \     重要!!!!! 重要!!!!  重要!!!!) StringBuffer sql = new StringBuffer("select id,code,name,tel  from ").append(table); 不可以 (沒看出為什么來) StringBuffer sql = new StringBuffer("select id,code,name,tel  from ").append(table).append(" ") 改成這樣就可以了      append 拼接時一定不要忘了 陳述句間的 空格(切記!!!)   不要忘了空格(重要重要!!!)   不要忘了空格!!!   不要忘了空格!!!不要忘了空格!!!不要忘了空格!!!               StringBuffer sql = new StringBuffer("select  id,code,name,tel from department ");  可以 append  未解之謎(不是未解了 ,搞定了!!!) 為什么 StringBuffer sql = new StringBuffer("select id,code,name,tel  from ").append(table); 取到的值為空  但是StringBuffer sql = new StringBuffer("select  id,code,name,tel from department "); 就能取到  初步懷疑 是因為 JDBCUtil工具類中的selectList遍歷有問題   五、NullPointerException 有可能是快取的問題 1.   2. 六、解決報錯 問題的步驟   1.網頁 控制臺報 500 就是java端代碼報錯了    2.回到java控制臺     3.先去 FmtRequest方法中 用控制臺輸出可能產生為空的變數的值 如果沒有輸出     4. 去DepartmentServlet 中 輸出add分支中 可能為空的變數(req) 如果 還沒輸出就是 分支根本沒有執行 是jsp檔案中的錯誤     5.隱藏域中的方法和 java中 不對應導致的   6.修改后又包sql陳述句錯誤 然后去Department2DaoImpl 找insert 陳述句 發放插入sql陳述句錯誤 欄位對應不起來 修改后 成功添加 拼接容易出錯就用完整的sql陳述句 一點一點來實作   七、使用debug 方式來除錯     F5:跳入方法 F6:向下逐行除錯 F7:跳出方法 F8:直接跳轉到下一個斷點 debug 詳解  https://blog.csdn.net/chao430/article/details/65443449

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412912.html

標籤:其他

上一篇:常用快捷鍵和dos命令

下一篇:Javaweb后端學習筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more