日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

mvc框架upgrade

發布時間:2023/12/10 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mvc框架upgrade 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

upgrade...

  • 1. actionservlet核心控制器更改以上1,2點
  • 2. 工具類(對反射拿到的屬性對象數據轉型)
  • 3. 業務服務類使用適配器設計模式

  • 針對上一篇文字做出了改造,既然要寫手寫lowb版mvc框架,就得付出一定代價,加大代碼量,只考慮實現業務
    上一篇的升級版
  • 更改的地方:
  • 使用xml配置文件代替config.properties,更靈活方便,用來映射請求方式與實現業務類的路徑
  • 按規則封裝了request請求對象中的數據,規則(a. 表單中的表單元素名稱同實體類中屬性的名稱一樣 b. 表單中的元素名稱 以 實體對象.屬性名稱命名)
  • 一個服務類就可完成增刪改查業務邏輯操作

1. actionservlet核心控制器更改以上1,2點

  • action.xml 映射請求路徑和服務類全路徑
  • 描述action.xml 的數據結構
package com.lovely.mvc;/*** * @author echo lovely* * action.xml 映射數據, 加載xml中的類**/ public class MapperAction {private String path; // 請求路徑private String type; // 類的全路徑public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getType() {return type;}public void setType(String type) {this.type = type;}@Overridepublic String toString() {return "MapperAction [path=" + path + ", type=" + type + "]";}}
  • 核心控制器實現更改
package com.lovely.mvc;import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;import com.lovely.util.ConvertUtil;public class ActionServlet extends HttpServlet {/*** 核心控制servlet* 根據訪問方式 和 類的路徑信息 到對應的servlet來處理*/private static final long serialVersionUID = 1L;Map<String, MapperAction> map = new HashMap<String, MapperAction>();@Overridepublic void init() throws ServletException {// 加載xml內容 調用具體服務類SAXReader reader = new SAXReader();InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/action.xml");try {Document doc = reader.read(in);List<Element> list = doc.selectNodes("//action");for (Element action : list) {String path = action.elementText("path");String type = action.elementText("type");MapperAction mapper = new MapperAction();mapper.setPath(path);mapper.setType(type);map.put(path, mapper);}} catch (DocumentException e) {e.printStackTrace();} finally {try {if (in != null)in.close();} catch (IOException e) {e.printStackTrace();}}}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String uri = req.getRequestURI();String key = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));// 根據請求對象 拿到對應的類 進行服務String value = map.get(key).getType();if (value == null) {resp.sendError(404, key + "不在配置文件xml中");return;}try {// 反射拿到類對象Class<?> c = Class.forName(value);// 創建action對象Action action = (Action) c.newInstance();// 對request請求數據進行封裝 // xxx服務類直接拿到 前臺數據Map<String, String[]> requestMap = req.getParameterMap();Set<Entry<String,String[]>> entrySet = requestMap.entrySet();// 對表單提交過來的每個值 封裝到xxxaction服務類中的屬性for (Entry<String, String[]> entry : entrySet) {// 表單的名字String name = entry.getKey();// 表單的值 String[] formValue = entry.getValue();// 判斷表單元素的名稱是p.name 或者 是name 這里判斷是 nameif (name.indexOf(".") == -1) {// 直接提交屬性名 為xxxAction中的屬性賦值try {Field field = c.getDeclaredField(name);field.setAccessible(true);// 屬性的類型可能是 String int/Integer double/Double boolean Date/Timstamp Integer[]/int[] Double[]/doble[] 轉型field.set(action, ConvertUtil.convert(field, formValue));} catch (NoSuchFieldException e) {//e.printStackTrace(); 可能沒這個屬性} catch (SecurityException e) {e.printStackTrace();}} else {// 提交的值 封裝到對象中try {// p.name p.age 表單元素的名稱寫法 對象.屬性String[] split = name.split("\\.");// 父級對象屬性Field fieldEntity = c.getDeclaredField(split[0]);fieldEntity.setAccessible(true);// 取到對象Object entity = fieldEntity.get(action);// 空對象if (entity == null) {// 拿到屬性對象的類型 創建對象entity = fieldEntity.getType().newInstance();fieldEntity.set(action, entity);} // 取到二級對象 // f.name 取到name // 父級屬性類對象Class<?> ff = fieldEntity.getType();Field field = ff.getDeclaredField(split[1]);field.setAccessible(true);// 設置 p.name 的值 轉型field.set(entity, ConvertUtil.convert(field, formValue));} catch (NoSuchFieldException e) {// e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}}}String result = action.service(req, resp);if (result == "")return;if (result != null) {// 根據返回結果 決定是請求轉發 還是重定向if (result.startsWith("forward")) {String path = result.split(":")[1];req.getRequestDispatcher(path).forward(req, resp);} else if (result.startsWith("redirect")) {String path = result.split(":")[1];resp.sendRedirect(req.getContextPath() + path);} else {// 寫路徑默認請求轉發req.getRequestDispatcher(result).forward(req, resp);} }} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}

2. 工具類(對反射拿到的屬性對象數據轉型)

  • 由于數據庫dao層使用ConverUtil中的convert, 所以為了不改代碼,使用重載設計
package com.lovely.util;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.sql.Date; import java.sql.Timestamp; import java.text.SimpleDateFormat;public class ConvertUtil {/*** 把數據庫查出來的string轉換為對應的屬性類型* @param f 屬性對象* @param value rs結果集中返回的string值* @return 返回屬性對象的值*/public static Object convert(Field f, String value) {if (value == null)return null;Object obj = null;try {if (f.getType() == Date.class) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");java.util.Date date = sdf.parse(value); // 把util日期轉換成 sql 日期obj = new Date(date.getTime());} else if (f.getType() == Timestamp.class) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");java.util.Date date = sdf.parse(value);obj = new Timestamp(date.getTime());} else {// 屬性對象 是Double Integer 之類的轉型Class<?> type = f.getType();// getClass 得到本身類名路徑 getType得到當前類型// System.out.println(type + "\t" + f.getClass() + "\t" + (type == f.getClass()));Constructor<?> con = type.getDeclaredConstructor(String.class);obj = con.newInstance(value);} } catch (Exception e) {e.printStackTrace();}return obj;}/*** 封裝的屬性對象值可能是 各種類型滴 考慮轉型...* @param f 要被賦值的屬性對象* @param value 被轉換的值* @return 轉換屬性對象對應類型的值*/public static Object convert(Field f, String[] value) {if (value == null || value.length == 0)return null;Object obj = null;try {if (f.getType() == Date.class) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");java.util.Date date = sdf.parse(value[0]); // 把util日期轉換成 sql 日期obj = new Date(date.getTime());} else if (f.getType() == Timestamp.class) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");java.util.Date date = sdf.parse(value[0]);obj = new Timestamp(date.getTime());} else if ((f.getType() == int.class || f.getType() == Integer.class) && value[0] != "") { // 判斷提交的數不是空字符obj = new Integer(value[0]);} else if ((f.getType() == double.class || f.getType() == Double.class) && value[0] != "") {obj = new Double(value[0]);} else if (f.getType() == String.class && value[0] != "") {obj = value[0];} else if (f.getType() == Integer[].class) {Integer[] integer = new Integer[value.length];for (int i = 0; i < value.length; i++) {integer[i] = new Integer(value[i]);}obj = integer;} else if (f.getType() == int[].class) {int[] arr = new int[value.length];for (int i = 0; i < arr.length; i++) {arr[i] = Integer.parseInt(value[i]);}} else if ((f.getType() == boolean.class || f.getType() == Boolean.class) && value[0] != "") {if (value[0] == "y" || value[0] == "1" || value[0] == "true") {obj = true;} else {obj = false;} }} catch (Exception e) {e.printStackTrace();}return obj;}}

3. 業務服務類使用適配器設計模式

  • 表現層接口
package com.lovely.mvc;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public interface Action {// service服務方法接口public String service(HttpServletRequest req, HttpServletResponse resp);}
  • 適配器實現接口
package com.lovely.mvc;import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;// 實體服務類規范 public class DispatcherAction implements Action {public String service(HttpServletRequest req, HttpServletResponse resp) {// 反射執行子類方法Class<?> c = this.getClass();// 請求方法String method = req.getParameter("method");String returnValue = "";try {// 反射拿到子類的方法對象Method methodObj = c.getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);// 調用具體的方法returnValue = methodObj.invoke(this, req, resp).toString(); } catch (NoSuchMethodException e) {try {resp.sendError(404, method + "方法不存在...");} catch (IOException e1) {e1.printStackTrace();}} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} return returnValue;}}
  • 作為使用者,使用服務類完成業務
package com.lovely.action;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.lovely.dao.CommonDao; import com.lovely.entity.Ticket; import com.lovely.mvc.DispatcherAction;public class TicketAction extends DispatcherAction {CommonDao dao = new CommonDao();// 查詢public String queryAll(HttpServletRequest req, HttpServletResponse resp) {req.setAttribute("list", dao.queryAll(Ticket.class));return "/index.jsp";}// 會被核心控制器封裝數據的 對象private Ticket t;// 新增票public String save(HttpServletRequest req, HttpServletResponse resp) {System.out.println(t);int count = dao.save(t);if (count > 0)return "/TicketAction.do?method=queryAll";return "/add.jsp";}// 根據id查詢票public String findOneTicket(HttpServletRequest req, HttpServletResponse resp) {req.setAttribute("ticket", dao.queryOne(t));return "/update.jsp";}// 修改票public String update(HttpServletRequest req, HttpServletResponse resp) {int count = dao.update(t);if (count > 0)return "redirect:/TicketAction.do?method=queryAll";return "/TicketAction.do?method=findOneTicket";}// 刪除票public String delete(HttpServletRequest req, HttpServletResponse resp) {int count = dao.delete(t);if (count > 0)return "/TicketAction.do?method=queryAll";else return "/TicketAction.do?method=queryAll";}}

總結

以上是生活随笔為你收集整理的mvc框架upgrade的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。