日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mvc框架upgrade

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

upgrade...

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

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

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

  • action.xml 映射請求路徑和服務類全路徑
  • 描述action.xml 的數(shù)據(jù)結(jié)構(gòu)
package com.lovely.mvc;/*** * @author echo lovely* * action.xml 映射數(shù)據(jù), 加載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 + "]";}}
  • 核心控制器實現(xiàn)更改
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* 根據(jù)訪問方式 和 類的路徑信息 到對應的servlet來處理*/private static final long serialVersionUID = 1L;Map<String, MapperAction> map = new HashMap<String, MapperAction>();@Overridepublic void init() throws ServletException {// 加載xml內(nèi)容 調(diào)用具體服務類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("."));// 根據(jù)請求對象 拿到對應的類 進行服務String value = map.get(key).getType();if (value == null) {resp.sendError(404, key + "不在配置文件xml中");return;}try {// 反射拿到類對象Class<?> c = Class.forName(value);// 創(chuàng)建action對象Action action = (Action) c.newInstance();// 對request請求數(shù)據(jù)進行封裝 // xxx服務類直接拿到 前臺數(shù)據(jù)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[] 轉(zhuǎn)型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) {// 拿到屬性對象的類型 創(chuàng)建對象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 的值 轉(zhuǎn)型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) {// 根據(jù)返回結(jié)果 決定是請求轉(zhuǎn)發(fā) 還是重定向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 {// 寫路徑默認請求轉(zhuǎn)發(fā)req.getRequestDispatcher(result).forward(req, resp);} }} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}

2. 工具類(對反射拿到的屬性對象數(shù)據(jù)轉(zhuǎn)型)

  • 由于數(shù)據(jù)庫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 {/*** 把數(shù)據(jù)庫查出來的string轉(zhuǎn)換為對應的屬性類型* @param f 屬性對象* @param value rs結(jié)果集中返回的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日期轉(zhuǎn)換成 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 之類的轉(zhuǎn)型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;}/*** 封裝的屬性對象值可能是 各種類型滴 考慮轉(zhuǎn)型...* @param f 要被賦值的屬性對象* @param value 被轉(zhuǎn)換的值* @return 轉(zhuǎn)換屬性對象對應類型的值*/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日期轉(zhuǎn)換成 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] != "") { // 判斷提交的數(shù)不是空字符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. 業(yè)務服務類使用適配器設計模式

  • 表現(xiàn)層接口
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);}
  • 適配器實現(xiàn)接口
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;// 實體服務類規(guī)范 public class DispatcherAction implements Action {public String service(HttpServletRequest req, HttpServletResponse resp) {// 反射執(zhí)行子類方法Class<?> c = this.getClass();// 請求方法String method = req.getParameter("method");String returnValue = "";try {// 反射拿到子類的方法對象Method methodObj = c.getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);// 調(diào)用具體的方法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;}}
  • 作為使用者,使用服務類完成業(yè)務
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";}// 會被核心控制器封裝數(shù)據(jù)的 對象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";}// 根據(jù)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";}}

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。