前言

这篇文章接上一篇文章,上一篇文章分享了简单的自定义了MVC。本片文章就来分享自定义MVC优化。


一、中央控制器动态加载储存子控制器

我们自定义MVC最后要将它导出成jar包,那如果我们要加的子控制器怎么办,都导成jar包。

这里我们就要用到之前分享的内容XML。

通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息
同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可

     DispatcherServlet

package com.zhw.framework;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zhw.web.BookAction;
import com.zhw.xml.ActionModel;
import com.zhw.xml.ConfigModel;
import com.zhw.xml.ConfigModelFactory;//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
//  private Map<String,Action> actions = new HashMap<String,Action>();private ConfigModel configModel;/** 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息* 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可*/   @Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {configModel = ConfigModelFactory.bulid();} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       action.execute(req, resp);//ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误    ");}//是action子控制器的全路径名String type = actionModel.getType();try {//类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。Action action = (Action) Class.forName(type).newInstance();} catch (Exception e) {e.printStackTrace();}}
}

   config.xml

<?xml version="1.0" encoding="UTF-8"?><config><action path="/book" type="com.zhw.web.BookAction"><forward name="failed" path="/login.jsp" redirect="false" /><forward name="success" path="/main.jsp" redirect="true" /></action>
</config>

ConfigModel


package com.zhw.xml;import java.util.HashMap;
import java.util.Map;/*** 对应标签* @author zhw**/
public class ConfigModel {private Map<String,ActionModel> aMap = new HashMap<String,ActionModel>();public void push(ActionModel actionModel) {aMap.put(actionModel.getPath(), actionModel);}public ActionModel pop(String path) {return aMap.get(path);}
}

ConfigModelFactory

package com.zhw.xml;import java.io.InputStream;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 23种设计模式之工厂模式* sessionfactory* * @author zhw**/
public class ConfigModelFactory {public static ConfigModel bulid() throws Exception {String defaultPath = "/config.xml";InputStream in = ConfigModelFactory.class.getResourceAsStream(defaultPath);SAXReader s = new SAXReader();Document doc = s.read(in);ConfigModel configModel = new ConfigModel();List<Element> actionEles = doc.selectNodes("/config/action");for (Element ele : actionEles) {ActionModel actionModel = new ActionModel();actionModel.setPath(ele.attributeValue("path"));actionModel.setType(ele.attributeValue("type"));//将forwardModel 赋值并添加到ActionModelList<Element> forwardEles = ele.selectNodes("forward");for (Element fele : forwardEles) {ForwardModel forwardModel = new ForwardModel();forwardModel.setName(fele.attributeValue("name"));forwardModel.setPath(fele.attributeValue("path"));forwardModel.setRedirect("true".equals(fele.attributeValue("redirect")));actionModel.push(forwardModel);}configModel.push(actionModel);}return configModel;}
}

优化后运行:

二、参数传递封装

假设我们需要新增一本书籍,需要传的为书籍编号,书籍名称,书籍价格。三个参数,很方便,但是如果需要传三十个参数呢?为了这个问题,对参数传递封装

未优化前:

Demo

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>目前增删改查的方法</h3>
<a href="${pageContext.request.contextPath }/book/add">增加</a>
<a href="${pageContext.request.contextPath }/book/del">删除</a>
<a href="${pageContext.request.contextPath }/book/edit">修改</a>
<a href="${pageContext.request.contextPath }/book/list">查询</a>
<!-- r上述问题:1、关于单个实体/表操作场景越多,需要新建的类也就越多,造成了项目中类的数量过于庞大2、当新增了业务,除了要添加该业务对应的方法(load),同时还要改动原有的方法3、反射相关代码、在每一个实体类对应的Servlet中都存在4、每一个Servlets中都有doget、dopost-->
<h3>类数量过多问题的优化</h3>
<a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a><h3>订单类CRUD</h3>
<a href="${pageContext.request.contextPath }/order.action?methodName=add">增加</a>
<a href="${pageContext.request.contextPath }/order.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/order.action?methodName=edit">修改</a>
<a href="${pageContext.request.contextPath }/order.action?methodName=list">查询</a>
<a href="${pageContext.request.contextPath }/order.action?methodName=load">回显</a> <h3>xx</h3>
<a href="${pageContext.request.contextPath }/book.action?methodName=add&bid=123&bname=logo&price=99">增加</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
</body>
</html>

                             BookAction 

package com.zhw.web;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zhw.entity.Book;
import com.zhw.framework.ActionSupport;public class BookAction extends ActionSupport{private void list(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用list方法");}private void edit(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用edit方法");}private void del(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用del方法");  }private void add(HttpServletRequest req, HttpServletResponse resp) {String bid = req.getParameter("bid");String bname = req.getParameter("bname");String price = req.getParameter("price");Book book = new Book();book.setBid(Integer.valueOf(bid));book.setBname(bname);book.setPrice(Float.valueOf(price));System.out.println("在同样一个Servlet中调用add方法");}private void load(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用load方法");}}

Book

package com.zhw.entity;public class Book {private int bid;private String bname;private float price;public int getBid() {return bid;}public void setBid(int bid) {this.bid = bid;}public String getBname() {return bname;}public void setBname(String bname) {this.bname = bname;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public Book() {// TODO Auto-generated constructor stub}@Overridepublic String toString() {return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";}
}

优化后:

DispatcherServlet

package com.zhw.framework;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.zhw.web.BookAction;
import com.zhw.xml.ActionModel;
import com.zhw.xml.ConfigModel;
import com.zhw.xml.ConfigModelFactory;
import com.zhw.xml.ForwardModel;//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
//  private Map<String,Action> actions = new HashMap<String,Action>();private ConfigModel configModel;/** 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息* 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可*/   @Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {String configLocation = this.getInitParameter("configLocation");if(configLocation == null ||"".equals(configLocation)) {}configModel = ConfigModelFactory.bulid();} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       action.execute(req, resp);//ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误    ");}//是action子控制器的全路径名String type = actionModel.getType();try {//类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。Action action = (Action) Class.forName(type).newInstance();if(action instanceof ModelDriven) {ModelDriven md = (ModelDriven)action;Object model = md.getModel();//将前端所有参数值封装进实体类BeanUtils.populate(model, req.getParameterMap());}
//          正式调用放法,book中的属性要被赋值
//          action.execute(req, resp);} catch (Exception e) {e.printStackTrace();}}
}

Demo

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>参数传递封装的优化</h3>
<a href="${pageContext.request.contextPath }/book.action?methodName=add&bid=989898&bname=laoliu&price=89">增加</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>
</body>
</html>

    BookAction

package com.zhw.web;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zhw.entity.Book;
import com.zhw.framework.ActionSupport;
import com.zhw.framework.ModelDriven;public class BookAction extends ActionSupport implements ModelDriven<Book>{private Book book = new Book();private String list(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用list方法");return "success";}private void edit(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用edit方法");}private void del(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用del方法");    }private String add(HttpServletRequest req, HttpServletResponse resp) {
//      String bid = req.getParameter("bid");
//      String bname = req.getParameter("bname");
//      String price = req.getParameter("price");
//      Book book = new Book();
//      book.setBid(Integer.valueOf(bid));
//      book.setBname(bname);
//      book.setPrice(Float.valueOf(price));System.out.println("在同样一个Servlet中调用add方法");return "failed";}private void load(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用load方法");}@Overridepublic Book getModel() {return book;}}

三、方法执行结果优化

对方法的执行结果进行优化,如果增加成功就用转发,失败就用重定向。

DispatcherServlet

package com.zhw.framework;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.zhw.web.BookAction;
import com.zhw.xml.ActionModel;
import com.zhw.xml.ConfigModel;
import com.zhw.xml.ConfigModelFactory;
import com.zhw.xml.ForwardModel;//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
//  private Map<String,Action> actions = new HashMap<String,Action>();private ConfigModel configModel;/** 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息* 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可*/   @Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {String configLocation = this.getInitParameter("configLocation");if(configLocation == null ||"".equals(configLocation)) {}configModel = ConfigModelFactory.bulid();} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       action.execute(req, resp);//ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误    ");}//是action子控制器的全路径名String type = actionModel.getType();try {//类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。Action action = (Action) Class.forName(type).newInstance();if(action instanceof ModelDriven) {ModelDriven md = (ModelDriven)action;Object model = md.getModel();//将前端所有参数值封装进实体类BeanUtils.populate(model, req.getParameterMap());}
//          正式调用放法,book中的属性要被赋值action.execute(req, resp);String result = action.execute(req, resp);ForwardModel forwardModel = actionModel.pop(result);boolean redirect =  forwardModel.isRedirect();if(forwardModel == null) {throw new RuntimeException("forward config error");}String path = forwardModel.getPath();if(redirect)resp.sendRedirect(req.getServletContext().getContextPath()+path);elsereq.getRequestDispatcher(path).forward(req, resp);} catch (Exception e) {e.printStackTrace();}}
}

xml

<?xml version="1.0" encoding="UTF-8"?><config><action path="/book" type="com.zhw.web.BookAction"><forward name="success" path="/Demo2.jsp" redirect="false" /><forward name="failed" path="/Demo3.jsp" redirect="true" /></action>
</config>

forwardModel

package com.zhw.xml;/*** @author zhw**/
public class ForwardModel {
//  <forward name="failed" path="/reg.jsp" redirect="false" />private String name;private String path;private Boolean redirect;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public Boolean getRedirect() {return redirect;}public void setRedirect(Boolean redirect) {this.redirect = redirect;}public boolean isRedirect() {return redirect;}}

四、框架配置文件可变

DispatcherServlet

package com.zhw.framework;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.zhw.web.BookAction;
import com.zhw.xml.ActionModel;
import com.zhw.xml.ConfigModel;
import com.zhw.xml.ConfigModelFactory;
import com.zhw.xml.ForwardModel;//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
//  private Map<String,Action> actions = new HashMap<String,Action>();private ConfigModel configModel;/** 通过之前的建模我们可以知道,configModel对象会包含config.xml中的所有子控制器信息* 同时为了解决中央控制器能够动态的加载保存子控制器的信息,我们只需要引入configModel对象即可*/   @Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {String configLocation = this.getInitParameter("configLocation");if(configLocation == null ||"".equals(configLocation)) {}configModel = ConfigModelFactory.bulid();} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       action.execute(req, resp);//ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误    ");}//是action子控制器的全路径名String type = actionModel.getType();try {//类类是反射的开始,通过子控制器的全路径名用newInstance方法得到子控制器。Action action = (Action) Class.forName(type).newInstance();if(action instanceof ModelDriven) {ModelDriven md = (ModelDriven)action;Object model = md.getModel();//将前端所有参数值封装进实体类BeanUtils.populate(model, req.getParameterMap());}
//          正式调用放法,book中的属性要被赋值action.execute(req, resp);String result = action.execute(req, resp);ForwardModel forwardModel = actionModel.pop(result);boolean redirect =  forwardModel.isRedirect();if(forwardModel == null) {throw new RuntimeException("forward config error");}String path = forwardModel.getPath();if(redirect)resp.sendRedirect(req.getServletContext().getContextPath()+path);elsereq.getRequestDispatcher(path).forward(req, resp);} catch (Exception e) {e.printStackTrace();}}
}

web.xml 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>ss</display-name><servlet><servlet-name>mvc</servlet-name><servlet-class>com.zhw.framework.DispatcherServlet</servlet-class><init-param><param-name>configLocation</param-name><param-value>laoliu</param-value></init-param></servlet><servlet-mapping><servlet-name>mvc</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>
</web-app>

将config.xml改为laoliu.xml


总结

在上一次的简单的自定义mvc后,我们对此进行了优化,优化后减少了代码量,缩短开发时间。

本次的内容分享到这。如有错误,还望指正。

简单自定义MVC优化相关推荐

  1. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  2. gradle spring_使用Gradle的简单Spring MVC Web应用程序

    gradle spring 除了我们现在将使用Spring MVC而不是原始servlet之外,该文章将与我们之前的文章Simple Gradle Web Application相似. 使用Gradl ...

  3. 使用Intellij Idea自定义MVC框架

    今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(co ...

  4. 自定义mvc框架复习(crud)

    目录 一.搭建自定义mvc框架的环境 1.1导入框架的jar包依赖 1.2导入框架配套的工具类 1.3导入框架的配置文件 1.4将框架与web容器进行集成,配置web.xml 二.完成实体类与数据库表 ...

  5. 自定义MVC原理与框架

    目录 一.自定义MVC 二.如何优化增删改查 三.自定义MVC框架 一.自定义MVC 1.自定义MVC的概念: MVC全称名是Model(模型层) View(视图层) control(控制层),这三个 ...

  6. 搭建一个简单的MVC框架

    背景 为何要用MVC框架?首先我们知道不用框架的话,在javaweb项目中每个请求都要写一个servlet,并且要在web.xml中对每个servlet类的映射作配置,不方便开发,因此引入MVC框架. ...

  7. J2EE_07 快速入门 自定义MVC书籍项目

    目录 一.什么是MVC? 二.MVC结构及原理 三.项目布局 实现效果: 3.1 数据库表的构建 3.2 创建一个JavaWeb项目 3.2.1 我们先导入指定的jar包文件 3.2.2 导入完成ja ...

  8. 在Java中搭建一个简单的MVC框架

    搭建一个简单的Java MVC框架 一 . 前言 二. 代码实现 1. 思路分析 2. 代码实现 2.1 Controller注解 2.2 RequestMapping注解 2.3 UserContr ...

  9. php mvc实例下载,php实现简单的MVC框架实例

    本文实例讲述了php实现简单的MVC框架.分享给大家供大家参考.具体如下: 在开始之前需要知道的知识 1.php基础知识 2.单一入口, 不知道的可以看看这里 具备以上两点, 那我们就可以开始啦. 哈 ...

  10. R语言使用caret包对GBM模型自定义参数调优:自定义参数优化网格

    R语言使用caret包对GBM模型自定义参数调优:自定义参数优化网格 目录 R语言使用caret包对GBM模型自定义参数调优:自定义优化参数网格

最新文章

  1. 别光发Paper,搞点实际问题
  2. LinearGradient线性渲染
  3. autofac 作用域_控制作用域和生命周期
  4. Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】
  5. ASP.NET MVC的生命周期与网址路由
  6. java 序列化 uid,Java中的序列化版本uid
  7. 今日恐慌与贪婪指数为92 贪婪程度有所上升
  8. Review JDBC
  9. Web服务器用户权限设置,Windows系统下WEB服务器权限的设置详解(四)
  10. 面试经验|传音控股自动化测试
  11. SolidWorks导入3DSource零件库的模型方法介绍
  12. JavaScript|日期格式化、今天、昨天、明天和某天
  13. Audio专业名词解析
  14. 在大学生思想政治教育中融入传统礼仪2019管理学EI会议的实现路径
  15. 初探树莓派与阿里云物联网平台
  16. 2011-09-06 [plus_format_fck.js代码]
  17. 计算机C语言二级操作题之编程题
  18. jk触发器改为四进制_锁存器、触发器、寄存器和缓冲器的区别
  19. 部署AlphaSSL
  20. bzoj4864: [BeiJing 2017 Wc]神秘物质

热门文章

  1. itunes下载管理appstore老版本app
  2. 第二集 第一魂环 第十五章
  3. TCR+fc型svc无功补偿仿真模型有详细资料
  4. 小程序:emoji等表情base64后乱码解决方案
  5. 百度一下,你就知道.2
  6. 02C++对C的增强
  7. pip2 python2.7 安装opencv-python cv2遇到问题的可能解决办法 skbuild list(pattern)
  8. RxJava2.0_1:基础学习和理解
  9. 一文读懂nginx charset
  10. 卸载python2.7_完美的.NET Framework卸载工具(支持卸载framework 1.0~4.7.2)