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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

springMvc源码刨析笔记

發(fā)布時(shí)間:2024/4/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springMvc源码刨析笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

springMvc源碼刨析筆記

MVC 全名是 Model View Controller,是 模型(model)-視圖(view)-控制器(controller) 的縮寫, 是?種?于設(shè)計(jì)創(chuàng)建 Web 應(yīng)?程序表現(xiàn)層的模式。

1.執(zhí)行流程

2.九大組件

//文件上傳組件initMultipartResolver(context);//初始化本地語(yǔ)言環(huán)境initLocaleResolver(context);//初始化模板處理器initThemeResolver(context);//初始化HandleMappinginitHandlerMappings(context);//初始化參數(shù)適配器initHandlerAdapters(context);//初始化異常攔截器initHandlerExceptionResolvers(context);//初始化試視圖預(yù)處理器initRequestToViewNameTranslator(context);//試圖轉(zhuǎn)換器initViewResolvers(context);//falshMap管理器initFlashMapManager(context);

2.自定義springMvc框架

1.聲明創(chuàng)建(LgDispatcherServlet)并繼承Servlet

springmvc.properties

scanPackage=com.lagou.demo

LgDispatcherServlet 實(shí)現(xiàn)了servlet對(duì)象的init() doGet() doPost()方法

public class LgDispatcherServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }

2.聲明注解

LagouAutowired,LagouController,LagouRequestMapping,LagouService

@Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface LagouAutowired {String value() default ""; }

3.加載配置文件

private Properties properties = new Properties(); // 1 加載配置文件 springmvc.propertiesString contextConfigLocation = config.getInitParameter("contextConfigLocation");doLoadConfig(contextConfigLocation); // 加載配置文件private void doLoadConfig(String contextConfigLocation) {InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(contextConfigLocation);try {//加載文件properties.load(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}

4.掃描包

private List<String> classNames = new ArrayList<>(); // 緩存掃描到的類的全限定類名 // 2 掃描相關(guān)的類,掃描注解doScan(properties.getProperty("scanPackage"));private void doScan(String scanPackage) {//替換了包路徑名 /替換為.String scanPackagePath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + scanPackage.replaceAll("\\.", "/");File pack = new File(scanPackagePath);File[] files = pack.listFiles();for(File file: files) {if(file.isDirectory()) { // 子package// 遞歸doScan(scanPackage + "." + file.getName()); // com.lagou.demo.controller}else if(file.getName().endsWith(".class")) {//添加到全局類中String className = scanPackage + "." + file.getName().replaceAll(".class", "");classNames.add(className);}}}

5.初始化對(duì)象

// ioc容器// 基于classNames緩存的類的全限定類名,以及反射技術(shù),完成對(duì)象創(chuàng)建和管理private void doInstance() {if(classNames.size() == 0) return;try{for (int i = 0; i < classNames.size(); i++) {String className = classNames.get(i); // com.lagou.demo.controller.DemoController// 反射Class<?> aClass = Class.forName(className);// 區(qū)分controller,區(qū)分service'if(aClass.isAnnotationPresent(LagouController.class)) {// controller的id此處不做過(guò)多處理,不取value了,就拿類的首字母小寫作為id,保存到ioc中String simpleName = aClass.getSimpleName();// DemoControllerString lowerFirstSimpleName = lowerFirst(simpleName); // demoControllerObject o = aClass.newInstance();ioc.put(lowerFirstSimpleName,o);}else if(aClass.isAnnotationPresent(LagouService.class)) {LagouService annotation = aClass.getAnnotation(LagouService.class);//獲取注解value值String beanName = annotation.value();// 如果指定了id,就以指定的為準(zhǔn)if(!"".equals(beanName.trim())) {ioc.put(beanName,aClass.newInstance());}else{// 如果沒(méi)有指定,就以類名首字母小寫beanName = lowerFirst(aClass.getSimpleName());ioc.put(beanName,aClass.newInstance());}// service層往往是有接口的,面向接口開發(fā),此時(shí)再以接口名為id,放入一份對(duì)象到ioc中,便于后期根據(jù)接口類型注入Class<?>[] interfaces = aClass.getInterfaces();for (int j = 0; j < interfaces.length; j++) {Class<?> anInterface = interfaces[j];// 以接口的全限定類名作為id放入ioc.put(anInterface.getName(),aClass.newInstance());}}else{continue;}}}catch (Exception e) {e.printStackTrace();}}// 首字母小寫方法public String lowerFirst(String str) {char[] chars = str.toCharArray();if('A' <= chars[0] && chars[0] <= 'Z') {chars[0] += 32;}return String.valueOf(chars);}

6.實(shí)例化對(duì)象(AutoWired)

// 實(shí)現(xiàn)依賴注入doAutoWired();// 實(shí)現(xiàn)依賴注入private void doAutoWired() {if(ioc.isEmpty()) {return;}// 有對(duì)象,再進(jìn)行依賴注入處理// 遍歷ioc中所有對(duì)象,查看對(duì)象中的字段,是否有@LagouAutowired注解,如果有需要維護(hù)依賴注入關(guān)系for(Map.Entry<String,Object> entry: ioc.entrySet()) {// 獲取bean對(duì)象中的字段信息 也就是獲取方法的屬性Field[] declaredFields = entry.getValue().getClass().getDeclaredFields();// 遍歷判斷處理for (int i = 0; i < declaredFields.length; i++) {Field declaredField = declaredFields[i]; // @LagouAutowired private IDemoService demoService;if(!declaredField.isAnnotationPresent(LagouAutowired.class)) {continue;}// 有該注解LagouAutowired annotation = declaredField.getAnnotation(LagouAutowired.class);String beanName = annotation.value(); // 需要注入的bean的idif("".equals(beanName.trim())) {// 沒(méi)有配置具體的bean id,那就需要根據(jù)當(dāng)前字段類型注入(接口注入) IDemoServicebeanName = declaredField.getType().getName();}// 開啟賦值declaredField.setAccessible(true);try {declaredField.set(entry.getValue(),ioc.get(beanName));} catch (IllegalAccessException e) {e.printStackTrace();}}}}

7.HandlerMapping處理器映射器(url與method)

//private Map<String,Method> handlerMapping = now HashMap<>(); // 存儲(chǔ)url和Method之間的映射關(guān)系private List<Handler> handlerMapping = new ArrayList<>(); ===============================================================private void initHandlerMapping() {if(ioc.isEmpty()) {return;}for(Map.Entry<String,Object> entry: ioc.entrySet()) {// 獲取ioc中當(dāng)前遍歷的對(duì)象的class類型Class<?> aClass = entry.getValue().getClass();if(!aClass.isAnnotationPresent(LagouController.class)) {continue;}String baseUrl = "";if(aClass.isAnnotationPresent(LagouRequestMapping.class)) {LagouRequestMapping annotation = aClass.getAnnotation(LagouRequestMapping.class);baseUrl = annotation.value(); // 等同于/demo}// 獲取方法Method[] methods = aClass.getMethods();for (int i = 0; i < methods.length; i++) {Method method = methods[i];// 方法沒(méi)有標(biāo)識(shí)LagouRequestMapping,就不處理if(!method.isAnnotationPresent(LagouRequestMapping.class)) {continue;}// 如果標(biāo)識(shí),就處理LagouRequestMapping annotation = method.getAnnotation(LagouRequestMapping.class);String methodUrl = annotation.value(); // /queryString url = baseUrl + methodUrl; // 計(jì)算出來(lái)的url /demo/query// 把method所有信息及url封裝為一個(gè)HandlerHandler handler = new Handler(entry.getValue(),method, Pattern.compile(url));// 計(jì)算方法的參數(shù)位置信息 // query(HttpServletRequest request, HttpServletResponse response,String name)Parameter[] parameters = method.getParameters();for (int j = 0; j < parameters.length; j++) {Parameter parameter = parameters[j];if(parameter.getType() == HttpServletRequest.class || parameter.getType() == HttpServletResponse.class) {// 如果是request和response對(duì)象,那么參數(shù)名稱寫HttpServletRequest和HttpServletResponsehandler.getParamIndexMapping().put(parameter.getType().getSimpleName(),j);}else{handler.getParamIndexMapping().put(parameter.getName(),j); // <name,2>}}// 建立url和method之間的映射關(guān)系(map緩存起來(lái))handlerMapping.add(handler);}}}public class Handler {private Object controller; // method.invoke(obj,)private Method method;private Pattern pattern; // spring中url是支持正則的 路徑private Map<String,Integer> paramIndexMapping; // 參數(shù)順序,是為了進(jìn)行參數(shù)綁定,key是參數(shù)名,value代表是第幾個(gè)參數(shù) <name,2>}

8.post請(qǐng)求參數(shù)處理

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 處理請(qǐng)求:根據(jù)url,找到對(duì)應(yīng)的Method方法,進(jìn)行調(diào)用// 獲取uri // String requestURI = req.getRequestURI(); // Method method = handlerMapping.get(requestURI);// 獲取到一個(gè)反射的方法// 反射調(diào)用,需要傳入對(duì)象,需要傳入?yún)?shù),此處無(wú)法完成調(diào)用,沒(méi)有把對(duì)象緩存起來(lái),也沒(méi)有參數(shù)!!!!改造initHandlerMapping(); // method.invoke() //// 根據(jù)uri獲取到能夠處理當(dāng)前請(qǐng)求的hanlder(從handlermapping中(list))Handler handler = getHandler(req);if(handler == null) {resp.getWriter().write("404 not found");return;}// 參數(shù)綁定// 獲取所有參數(shù)類型數(shù)組,這個(gè)數(shù)組的長(zhǎng)度就是我們最后要傳入的args數(shù)組的長(zhǎng)度Class<?>[] parameterTypes = handler.getMethod().getParameterTypes();// 根據(jù)上述數(shù)組長(zhǎng)度創(chuàng)建一個(gè)新的數(shù)組(參數(shù)數(shù)組,是要傳入反射調(diào)用的)Object[] paraValues = new Object[parameterTypes.length];// 以下就是為了向參數(shù)數(shù)組中塞值,而且還得保證參數(shù)的順序和方法中形參順序一致Map<String, String[]> parameterMap = req.getParameterMap();// 遍歷request中所有參數(shù) (填充除了request,response之外的參數(shù))for(Map.Entry<String,String[]> param: parameterMap.entrySet()) {// name=1&name=2 name [1,2]String value = StringUtils.join(param.getValue(), ","); // 如同 1,2// 如果參數(shù)和方法中的參數(shù)匹配上了,填充數(shù)據(jù)if(!handler.getParamIndexMapping().containsKey(param.getKey())) {continue;}// 方法形參確實(shí)有該參數(shù),找到它的索引位置,對(duì)應(yīng)的把參數(shù)值放入paraValuesInteger index = handler.getParamIndexMapping().get(param.getKey());//name在第 2 個(gè)位置paraValues[index] = value; // 把前臺(tái)傳遞過(guò)來(lái)的參數(shù)值填充到對(duì)應(yīng)的位置去}int requestIndex = handler.getParamIndexMapping().get(HttpServletRequest.class.getSimpleName()); // 0paraValues[requestIndex] = req;int responseIndex = handler.getParamIndexMapping().get(HttpServletResponse.class.getSimpleName()); // 1paraValues[responseIndex] = resp;// 最終調(diào)用handler的method屬性try {handler.getMethod().invoke(handler.getController(),paraValues);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}private Handler getHandler(HttpServletRequest req) {if(handlerMapping.isEmpty()){return null;}///demo/queryString url = req.getRequestURI();for(Handler handler: handlerMapping) {Matcher matcher = handler.getPattern().matcher(url);if(!matcher.matches()){continue;}return handler;}return null;}

9.加入到web.xml

<servlet><servlet-name>lgoumvc</servlet-name><servlet-class>com.lagou.edu.mvcframework.servlet.LgDispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>springmvc.properties</param-value></init-param></servlet><servlet-mapping><servlet-name>lgoumvc</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>

自定義答案的核心類(LgDispatcherServlet)

package com.lagou.edu.mvcframework.servlet;import com.lagou.demo.service.IDemoService; import com.lagou.edu.mvcframework.annotations.*; import com.lagou.edu.mvcframework.pojo.Handler; import org.apache.commons.lang3.StringUtils;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;public class LgDispatcherServlet extends HttpServlet {private Properties properties = new Properties();private List<String> classNames = new ArrayList<>(); // 緩存掃描到的類的全限定類名// ioc容器private Map<String,Object> ioc = new HashMap<String,Object>();private Map<Handler,List<String>> securityMap = new HashMap<>();// handlerMapping//private Map<String,Method> handlerMapping = now HashMap<>(); // 存儲(chǔ)url和Method之間的映射關(guān)系private List<Handler> handlerMapping = new ArrayList<>();@Overridepublic void init(ServletConfig config) throws ServletException {// 1 加載配置文件 springmvc.propertiesString contextConfigLocation = config.getInitParameter("contextConfigLocation");doLoadConfig(contextConfigLocation);// 2 掃描相關(guān)的類,掃描注解doScan(properties.getProperty("scanPackage"));// 3 初始化bean對(duì)象(實(shí)現(xiàn)ioc容器,基于注解)doInstance();// 4 實(shí)現(xiàn)依賴注入doAutoWired();// 5 構(gòu)造一個(gè)HandlerMapping處理器映射器,將配置好的url和Method建立映射關(guān)系initHandlerMapping();System.out.println("lagou mvc 初始化完成....");// 等待請(qǐng)求進(jìn)入,處理請(qǐng)求}/*構(gòu)造一個(gè)HandlerMapping處理器映射器最關(guān)鍵的環(huán)節(jié)目的:將url和method建立關(guān)聯(lián)*/private void initHandlerMapping() {if(ioc.isEmpty()) {return;}for(Map.Entry<String,Object> entry: ioc.entrySet()) {// 獲取ioc中當(dāng)前遍歷的對(duì)象的class類型Class<?> aClass = entry.getValue().getClass();if(!aClass.isAnnotationPresent(LagouController.class)) {continue;}String baseUrl = "";if(aClass.isAnnotationPresent(LagouRequestMapping.class)) {LagouRequestMapping annotation = aClass.getAnnotation(LagouRequestMapping.class);baseUrl = annotation.value(); // 等同于/demo}// 獲取方法Method[] methods = aClass.getMethods();for (int i = 0; i < methods.length; i++) {Method method = methods[i];// 方法沒(méi)有標(biāo)識(shí)LagouRequestMapping,就不處理if(!method.isAnnotationPresent(LagouRequestMapping.class)) {continue;}// 如果標(biāo)識(shí),就處理LagouRequestMapping annotation = method.getAnnotation(LagouRequestMapping.class);String methodUrl = annotation.value(); // /queryString url = baseUrl + methodUrl; // 計(jì)算出來(lái)的url /demo/query// 把method所有信息及url封裝為一個(gè)HandlerHandler handler = new Handler(entry.getValue(),method, Pattern.compile(url));// 計(jì)算方法的參數(shù)位置信息 // query(HttpServletRequest request, HttpServletResponse response,String name)Parameter[] parameters = method.getParameters();for (int j = 0; j < parameters.length; j++) {Parameter parameter = parameters[j];if(parameter.getType() == HttpServletRequest.class || parameter.getType() == HttpServletResponse.class) {// 如果是request和response對(duì)象,那么參數(shù)名稱寫HttpServletRequest和HttpServletResponsehandler.getParamIndexMapping().put(parameter.getType().getSimpleName(),j);}else{handler.getParamIndexMapping().put(parameter.getName(),j); // <name,2>}}//*******************針對(duì)Security的處理,start************************// 必須先有Controller的權(quán)限,然后才能有Handler方法的權(quán)限,所以有如下情況// 1 如果Controller和Handler都配置了@Security(取交集)// 2 如果僅僅Controller配置了@Security(以Controller為準(zhǔn))// 3 如果僅僅Handler方法配置了@Security(以Handler方法為準(zhǔn))if(aClass.isAnnotationPresent(Security.class) && method.isAnnotationPresent(Security.class)) {Security controllerSecurity = aClass.getAnnotation(Security.class);String[] controllerUsernames = controllerSecurity.value();List<String> controllerUnameList = Arrays.asList(controllerUsernames);Security handlerSecurity = method.getAnnotation(Security.class);String[] handlerUsernames = handlerSecurity.value();List<String> handlerUnameList = Arrays.asList(handlerUsernames);// 求交集controllerUnameList = new ArrayList<>(controllerUnameList);handlerUnameList = new ArrayList<>(handlerUnameList);controllerUnameList.retainAll(handlerUnameList);securityMap.put( handler, controllerUnameList);}else if(aClass.isAnnotationPresent(Security.class)) {Security controllerSecurity = aClass.getAnnotation(Security.class);String[] controllerUsernames = controllerSecurity.value();List<String> controllerUnameList = Arrays.asList(controllerUsernames);securityMap.put( handler, controllerUnameList);}else if(method.isAnnotationPresent(Security.class)) {Security handlerSecurity = method.getAnnotation(Security.class);String[] handlerUsernames = handlerSecurity.value();List<String> handlerUnameList = Arrays.asList(handlerUsernames);securityMap.put( handler, handlerUnameList);}//*******************針對(duì)Security的處理,end************************// 建立url和method之間的映射關(guān)系(map緩存起來(lái))handlerMapping.add(handler);}}}// 實(shí)現(xiàn)依賴注入private void doAutoWired() {if(ioc.isEmpty()) {return;}// 有對(duì)象,再進(jìn)行依賴注入處理// 遍歷ioc中所有對(duì)象,查看對(duì)象中的字段,是否有@LagouAutowired注解,如果有需要維護(hù)依賴注入關(guān)系for(Map.Entry<String,Object> entry: ioc.entrySet()) {// 獲取bean對(duì)象中的字段信息Field[] declaredFields = entry.getValue().getClass().getDeclaredFields();// 遍歷判斷處理for (int i = 0; i < declaredFields.length; i++) {Field declaredField = declaredFields[i]; // @LagouAutowired private IDemoService demoService;if(!declaredField.isAnnotationPresent(LagouAutowired.class)) {continue;}// 有該注解LagouAutowired annotation = declaredField.getAnnotation(LagouAutowired.class);String beanName = annotation.value(); // 需要注入的bean的idif("".equals(beanName.trim())) {// 沒(méi)有配置具體的bean id,那就需要根據(jù)當(dāng)前字段類型注入(接口注入) IDemoServicebeanName = declaredField.getType().getName();}// 開啟賦值declaredField.setAccessible(true);try {declaredField.set(entry.getValue(),ioc.get(beanName));} catch (IllegalAccessException e) {e.printStackTrace();}}}}// ioc容器// 基于classNames緩存的類的全限定類名,以及反射技術(shù),完成對(duì)象創(chuàng)建和管理private void doInstance() {if(classNames.size() == 0) return;try{for (int i = 0; i < classNames.size(); i++) {String className = classNames.get(i); // com.lagou.demo.controller.DemoController// 反射Class<?> aClass = Class.forName(className);// 區(qū)分controller,區(qū)分service'if(aClass.isAnnotationPresent(LagouController.class)) {// controller的id此處不做過(guò)多處理,不取value了,就拿類的首字母小寫作為id,保存到ioc中String simpleName = aClass.getSimpleName();// DemoControllerString lowerFirstSimpleName = lowerFirst(simpleName); // demoControllerObject o = aClass.newInstance();ioc.put(lowerFirstSimpleName,o);}else if(aClass.isAnnotationPresent(LagouService.class)) {LagouService annotation = aClass.getAnnotation(LagouService.class);//獲取注解value值String beanName = annotation.value();// 如果指定了id,就以指定的為準(zhǔn)if(!"".equals(beanName.trim())) {ioc.put(beanName,aClass.newInstance());}else{// 如果沒(méi)有指定,就以類名首字母小寫beanName = lowerFirst(aClass.getSimpleName());ioc.put(beanName,aClass.newInstance());}// service層往往是有接口的,面向接口開發(fā),此時(shí)再以接口名為id,放入一份對(duì)象到ioc中,便于后期根據(jù)接口類型注入Class<?>[] interfaces = aClass.getInterfaces();for (int j = 0; j < interfaces.length; j++) {Class<?> anInterface = interfaces[j];// 以接口的全限定類名作為id放入ioc.put(anInterface.getName(),aClass.newInstance());}}else{continue;}}}catch (Exception e) {e.printStackTrace();}}// 首字母小寫方法public String lowerFirst(String str) {char[] chars = str.toCharArray();if('A' <= chars[0] && chars[0] <= 'Z') {chars[0] += 32;}return String.valueOf(chars);}// 掃描類// scanPackage: com.lagou.demo package----> 磁盤上的文件夾(File) com/lagou/demoprivate void doScan(String scanPackage) {String scanPackagePath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + scanPackage.replaceAll("\\.", "/");File pack = new File(scanPackagePath);File[] files = pack.listFiles();for(File file: files) {if(file.isDirectory()) { // 子package// 遞歸doScan(scanPackage + "." + file.getName()); // com.lagou.demo.controller}else if(file.getName().endsWith(".class")) {String className = scanPackage + "." + file.getName().replaceAll(".class", "");classNames.add(className);}}}// 加載配置文件private void doLoadConfig(String contextConfigLocation) {InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(contextConfigLocation);try {properties.load(resourceAsStream);} catch (IOException 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 {// 處理請(qǐng)求:根據(jù)url,找到對(duì)應(yīng)的Method方法,進(jìn)行調(diào)用// 獲取uri // String requestURI = req.getRequestURI(); // Method method = handlerMapping.get(requestURI);// 獲取到一個(gè)反射的方法// 反射調(diào)用,需要傳入對(duì)象,需要傳入?yún)?shù),此處無(wú)法完成調(diào)用,沒(méi)有把對(duì)象緩存起來(lái),也沒(méi)有參數(shù)!!!!改造initHandlerMapping(); // method.invoke() //// 根據(jù)uri獲取到能夠處理當(dāng)前請(qǐng)求的hanlder(從handlermapping中(list))Handler handler = getHandler(req);if(handler == null) {resp.getWriter().write("404 not found");return;}// 安全認(rèn)證List<String> usernameList = securityMap.get(handler);// 不為空說(shuō)明需要認(rèn)證,那么不包含的話就returnif(usernameList != null && !usernameList.contains(req.getParameter("username"))) {resp.getWriter().write("sorry,the request has been forbidden---security");return;}// 參數(shù)綁定// 獲取所有參數(shù)類型數(shù)組,這個(gè)數(shù)組的長(zhǎng)度就是我們最后要傳入的args數(shù)組的長(zhǎng)度Class<?>[] parameterTypes = handler.getMethod().getParameterTypes();// 根據(jù)上述數(shù)組長(zhǎng)度創(chuàng)建一個(gè)新的數(shù)組(參數(shù)數(shù)組,是要傳入反射調(diào)用的)Object[] paraValues = new Object[parameterTypes.length];// 以下就是為了向參數(shù)數(shù)組中塞值,而且還得保證參數(shù)的順序和方法中形參順序一致Map<String, String[]> parameterMap = req.getParameterMap();// 遍歷request中所有參數(shù) (填充除了request,response之外的參數(shù))for(Map.Entry<String,String[]> param: parameterMap.entrySet()) {// name=1&name=2 name [1,2]String value = StringUtils.join(param.getValue(), ","); // 如同 1,2// 如果參數(shù)和方法中的參數(shù)匹配上了,填充數(shù)據(jù)if(!handler.getParamIndexMapping().containsKey(param.getKey())) {continue;}// 方法形參確實(shí)有該參數(shù),找到它的索引位置,對(duì)應(yīng)的把參數(shù)值放入paraValuesInteger index = handler.getParamIndexMapping().get(param.getKey());//name在第 2 個(gè)位置paraValues[index] = value; // 把前臺(tái)傳遞過(guò)來(lái)的參數(shù)值填充到對(duì)應(yīng)的位置去}int requestIndex = handler.getParamIndexMapping().get(HttpServletRequest.class.getSimpleName()); // 0paraValues[requestIndex] = req;int responseIndex = handler.getParamIndexMapping().get(HttpServletResponse.class.getSimpleName()); // 1paraValues[responseIndex] = resp;// 最終調(diào)用handler的method屬性try {handler.getMethod().invoke(handler.getController(),paraValues);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}private Handler getHandler(HttpServletRequest req) {if(handlerMapping.isEmpty()){return null;}String url = req.getRequestURI();for(Handler handler: handlerMapping) {Matcher matcher = handler.getPattern().matcher(url);if(!matcher.matches()){continue;}return handler;}return null;}}

3.源碼刨析

1.getHandler()

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {if (this.handlerMappings != null) {for (HandlerMapping mapping : this.handlerMappings) {HandlerExecutionChain handler = mapping.getHandler(request);// public java.lang.String com.lagou.edu.controller.DemoController.handle01(java.lang.String,java.util.Map<java.lang.String, java.lang.Object>)if (handler != null) {return handler;}}}return null;}

2.getHandlerAdapter()

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {if (this.handlerAdapters != null) {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}} }

3.handle()

public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {//執(zhí)行請(qǐng)求 參數(shù)Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);setResponseStatus(webRequest);} //======================================================public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {//獲取方法參數(shù)值Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);return doInvoke(args);} //=================getMethodArgumentValues=================================== protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {//獲取方法的參數(shù)MethodParameter[] parameters = getMethodParameters();if (ObjectUtils.isEmpty(parameters)) {return EMPTY_ARGS;}Object[] args = new Object[parameters.length];for (int i = 0; i < parameters.length; i++) {MethodParameter parameter = parameters[i];parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);args[i] = findProvidedArgument(parameter, providedArgs);args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);return args;}

4.processDispatchResult()

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); //======================processDispatchResult試圖處理 private void processDispatchResult({if (mv != null && !mv.wasCleared()) {render(mv, request, response);//試圖處理if (errorView) {WebUtils.clearErrorRequestAttributes(request);}}if (mappedHandler != null) {//攔截器的第三次執(zhí)行的地方mappedHandler.triggerAfterCompletion(request, response, null);}} //======================render() protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {// 處理view = resolveViewName(viewName, mv.getModelInternal(), locale, request);} //======================resolveViewName() public View resolveViewName(String viewName, Locale locale) throws Exception {if (view == null) {synchronized (this.viewCreationCache) {view = this.viewCreationCache.get(cacheKey);if (view == null) {// Ask the subclass to create the View object.//創(chuàng)建視圖view = createView(viewName, locale);if (view == null && this.cacheUnresolved) {view = UNRESOLVED_VIEW;}if (view != null) {this.viewAccessCache.put(cacheKey, view);this.viewCreationCache.put(cacheKey, view);}}}}return (view != UNRESOLVED_VIEW ? view : null);}}

4.什么是 RESTful

REST(英?:Representational State Transfer,簡(jiǎn)稱 REST)描述了?個(gè)架構(gòu)樣式的?絡(luò)系統(tǒng),

1.RESTfu有哪些l區(qū)別

原有的url設(shè)計(jì)http://localhost:8080/user/queryUserById.action?id=3
restful設(shè)計(jì) http://localhost:8080/user/3
常規(guī)操作就是增刪改查
根據(jù)請(qǐng)求?式不同,代表要做不同的操作
get 查詢,獲取資源 /account/1 HTTP GET :得到 id = 1 的 account
post 增加,新建資源
put 更新 /account/1 HTTP PUT:更新 id = 1 的 account
delete 刪除資源 /account/1 HTTP DELETE:刪除 id = 1 的 account

<form method="post" action="/demo/handle"><input type="text" name="username"/><input type="submit" value="提交rest_post請(qǐng)求"/></form><form method="post" action="/demo/handle/15/lisi"><input type="hidden" name="_method" value="put"/><input type="submit" value="提交rest_put請(qǐng)求"/></form> @RequestMapping(value = "/handle/{id}/{name}",method = {RequestMethod.PUT})public ModelAndView handlePut(@PathVariable("id") Integer id,@PathVariable("name") String username) {Date date = new Date();ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("date",date);modelAndView.setViewName("success");return modelAndView;} <!--配置springmvc請(qǐng)求?式轉(zhuǎn)換過(guò)濾器,會(huì)檢查請(qǐng)求參數(shù)中是否有_method參數(shù),如果有就 按照指定的請(qǐng)求?式進(jìn)?轉(zhuǎn)換--><filter><filter-name>hiddenHttpMethodFilter</filter-name><filterclass>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>hiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

5.自定義攔截器

1.接口實(shí)現(xiàn)HandlerInterceptor

/** * ?定義springmvc攔截器 */ public class MyIntercepter01 implements HandlerInterceptor {/*** 會(huì)在handler?法業(yè)務(wù)邏輯執(zhí)?之前執(zhí)?* 往往在這?完成權(quán)限校驗(yàn)?作* @param request* @param response* @param handler* @return 返回值boolean代表是否放?,true代表放?,false代表中?* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyIntercepter01 preHandle......");return true;}/*** 會(huì)在handler?法業(yè)務(wù)邏輯執(zhí)?之后尚未跳轉(zhuǎn)??時(shí)執(zhí)?* @param request* @param response* @param handler* @param modelAndView 封裝了視圖和數(shù)據(jù),此時(shí)尚未跳轉(zhuǎn)??呢,你可以在這?針對(duì)返回的 數(shù)據(jù)和視圖信息進(jìn)?修改* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyIntercepter01 postHandle......");}/*** ??已經(jīng)跳轉(zhuǎn)渲染完畢之后執(zhí)?* @param request* @param response* @param handler* @param ex 可以在這?捕獲異常* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyIntercepter01 afterCompletion......");} }

2.注冊(cè)SpringMVC攔截器

<mvc:interceptors><!--攔截所有handler--><!--<bean class="com.lagou.edu.interceptor.MyIntercepter01"/>--><mvc:interceptor><!--配置當(dāng)前攔截器的url攔截規(guī)則,**代表當(dāng)前?錄下及其??錄下的所有url--><mvc:mapping path="/**"/><!--exclude-mapping可以在mapping的基礎(chǔ)上排除?些url攔截--><!--<mvc:exclude-mapping path="/demo/**"/>--><bean class="com.lagou.edu.interceptor.MyIntercepter01"/></mvc:interceptor></mvc:interceptors>

6.整合SSM

數(shù)據(jù)庫(kù)連接池以及事務(wù)管理都交給Spring容器來(lái)完成

SqlSessionFactory對(duì)象應(yīng)該放到Spring容器中作為單例對(duì)象管理

Mapper動(dòng)態(tài)代理對(duì)象交給Spring管理,我們從Spring容器中直接獲得Mapper的代理對(duì)象

6.1web.xml

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml</param-value></context-param><!--spring框架啟動(dòng)--><listener><listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass></listener><!--springmvc啟動(dòng)--><servlet><servlet-name>springmvc</servlet-name><servletclass>org.springframework.web.servlet.DispatcherServlet</servletclass><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app

6.2整合springMvc(springmvc.xml)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/springcontext.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd "><!--掃描controller--><context:component-scan base-package="com.lagou.edu.controller"/><mvc:annotation-driven/> </beans>

6.3整合Dao(applicationContext-dao.xml)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd "><!--包掃描--><context:component-scan base-package="com.lagou.edu.mapper"/><!--數(shù)據(jù)庫(kù)連接池以及事務(wù)管理都交給Spring容器來(lái)完成--><!--引?外部資源?件--><context:property-placeholderlocation="classpath:jdbc.properties"/><!--第三?jar中的bean定義在xml中--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!--SqlSessionFactory對(duì)象應(yīng)該放到Spring容器中作為單例對(duì)象管理原來(lái)mybaits中sqlSessionFactory的構(gòu)建是需要素材的:SqlMapConfig.xml中的內(nèi) 容--><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><!--別名映射掃描--><property name="typeAliasesPackage" value="com.lagou.edu.pojo"/><!--數(shù)據(jù)源dataSource--><property name="dataSource" ref="dataSource"/></bean><!--Mapper動(dòng)態(tài)代理對(duì)象交給Spring管理,我們從Spring容器中直接獲得Mapper的代理對(duì) 象--><!--掃描mapper接?,?成代理對(duì)象,?成的代理對(duì)象會(huì)存儲(chǔ)在ioc容器中--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--mapper接?包路徑配置--><property name="basePackage" value="com.lagou.edu.mapper"/><property name="sqlSessionFactoryBeanName"value="sqlSessionFactory"/></bean> </beans>

6.4applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:lgContext="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd "><!--包掃描--><lgContext:component-scan base-package="com.lagou.edu.service"/><!--事務(wù)管理--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--事務(wù)管理注解驅(qū)動(dòng)--><tx:annotation-driven transaction-manager="transactionManager"/> </beans>

7.設(shè)計(jì)模式

1.策略模式

策略模式(Strategy),就是?個(gè)問(wèn)題有多種解決?案,選擇其中的?種使?,這種情況下我們使?策略模式來(lái)實(shí)現(xiàn)靈活地選擇,也能夠?便地增加新的解決?。?如做數(shù)學(xué)題,?個(gè)問(wèn)題的解法可能有多種;再?如商場(chǎng)的打折促銷活動(dòng),打折?案也有很多種,有些商品是不參與折扣活動(dòng)要按照原價(jià)銷售,有些商品打8.5折,有些打6折,有些是返現(xiàn)5元等

//打折接口的父類 public abstract class AbstractDiscount {protected double finalPrice;//最終的價(jià)格protected String desc;//詳細(xì)信息public AbstractDiscount(String desc) {this.desc = desc;}public abstract double discount(double price);//打折的方案方法 } //打折的具體方法 public class Discount6 extends AbstractDiscount {public Discount6() {super("該商品可享受6折優(yōu)惠");}@Overridepublic double discount(double price) {finalPrice = price * 0.6;return finalPrice;} } //商品對(duì)象 public class BuyGoods {private String goods; //商品名稱private double price;//商品的價(jià)格private AbstractDiscount abstractDiscount;//商品的打折類public BuyGoods(String goods, double price, AbstractDiscountabstractDiscount) {this.goods = goods;this.price = price;this.abstractDiscount = abstractDiscount;}//打折后的價(jià)格public double calculate() {double finalPrice = abstractDiscount.discount(this.price);String desc = abstractDiscount.getDesc();System.out.println(MessageFormat.format("商品:{0},原價(jià):{1},{2},最終價(jià)格為:{3}", goods, price, desc, finalPrice));return finalPrice;} } //測(cè)試類public static void main(String[] args) {BuyGoods buyGoods1 = new BuyGoods("Java編程思想", 99.00, newDiscount85());buyGoods1.calculate();BuyGoods buyGoods2 = new BuyGoods("羅技?標(biāo)", 66, new Discount6());buyGoods2.calculate();} //商品:Java編程思想,原價(jià):99,該商品可享受8.5折優(yōu)惠,最終價(jià)格為:84.15 //商品:羅技?標(biāo),原價(jià):66,該商品可享受6折優(yōu)惠,最終價(jià)格為:39.6

2.模板方法

模板?法模式是指定義?個(gè)算法的?架,并允許?類為?個(gè)或者多個(gè)步驟提供實(shí)現(xiàn)。模板?法模式使得?類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟,屬于?為型設(shè)計(jì)模式。采?模板?法模式的核?思路是處理某個(gè)流程的代碼已經(jīng)具備,但其中某些節(jié)點(diǎn)的代碼暫時(shí)不能確定。此時(shí)可以使?模板?法。

//主類 public abstract class Interview {private final void register() {System.out.println("?試登記");}//不確定的方法protected abstract void communicate();private final void notifyResult() {System.out.println("HR?姐姐通知?試結(jié)果");}protected final void process() {this.register();this.communicate();this.notifyResult();} } //繼承調(diào)整方法 public class Interviewee1 extends Interview{public void communicate() {System.out.println("我是?試?員1,來(lái)?試Java?程師,我們聊的是Java相關(guān)內(nèi)容");} } //測(cè)試類public static void main(String[] args) {// ?試Java?程師Interview interviewee1 = new Interviewee1();interviewee1.process();} //?試登記 //我是?試?員1,來(lái)?試Java?程師,我們聊的是Java相關(guān)內(nèi)容 //HR?姐姐通知?試結(jié)果

3.適配器模式

使得原本由于接?不兼容?不能?起?作、不能統(tǒng)?管理的那些類可以?起?作、可以進(jìn)?統(tǒng)?管理解決接?不兼容?不能?起?作問(wèn)題

看下??個(gè)?常經(jīng)典的案例

在中國(guó),??電都是220v交流電,但是?機(jī)鋰電池?的都是5v直流電。因此,我們給?機(jī)充電時(shí)就需要使?電源適配器來(lái)進(jìn)?轉(zhuǎn)換。使?代碼還原這個(gè)?活場(chǎng)景

//220V類 public class AC220 {public int outputAC220V() {int output = 220;System.out.println("輸出交流電" + output + "V");return output;} } //5V接口 public interface DC5 {int outputDC5V(); }//5V適配 public class PowerAdapter implements DC5 {private AC220 ac220;public PowerAdapter(AC220 ac220) {this.ac220 = ac220;}public int outputDC5V() {int adapterInput = ac220.outputAC220V();// 變壓器...int adapterOutput = adapterInput / 44;System.out.println("使? PowerAdapter 輸?AC:" + adapterInput + "V 輸出DC:" + adapterOutput + "V");return adapterOutput;} } //測(cè)試類public static void main(String[] args) {DC5 dc5 = new PowerAdapter(new AC220());dc5.outputDC5V();}

問(wèn)題

1.攔截器,監(jiān)聽器,過(guò)濾器

  • 過(guò)濾器(Filter):在web.xml中配置 用來(lái)配置Post請(qǐng)求的編碼過(guò)濾器

    對(duì)Request請(qǐng)求起到過(guò)濾的作用,如果配置為/ 可以對(duì)所有的資源訪問(wèn)進(jìn)行過(guò)濾

  • <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  • 監(jiān)聽器(Listener):實(shí)現(xiàn)了javax.servlet.ServletContextListener 接?的服務(wù)器端組件,它隨

    Web應(yīng)?的啟動(dòng)?啟動(dòng),只初始化?次,然后會(huì)?直運(yùn)?監(jiān)視,隨Web應(yīng)?的停??銷毀

    作??:做?些初始化?作,web應(yīng)?中spring容器啟動(dòng)ContextLoaderListener

    作??:監(jiān)聽web中的特定事件,?如HttpSession,ServletRequest的創(chuàng)建和銷毀;變量的創(chuàng)建、

    銷毀和修改等。可以在某些動(dòng)作前后增加處理,實(shí)現(xiàn)監(jiān)控,?如統(tǒng)計(jì)在線?數(shù),利?

    HttpSessionLisener等。

    public class MyHttpSessionListener implements HttpSessionListener {//在線人數(shù)public static int online = 0;@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("創(chuàng)建session");online ++;}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("銷毀session");}} //controller@RequestMapping("/online")@ResponseBodypublic Object online() {return "當(dāng)前在線人數(shù):" + MyHttpSessionListener.online + "人";} <!--*****配置spring的核心監(jiān)聽器*****--><!--指定spring的配置文件的位置--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/application*.xml</param-value></context-param><!--spring封裝的核心監(jiān)聽器ContextLoaderListener--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  • 攔截器(Interceptor):是SpringMVC、Struts等表現(xiàn)層框架??的,不會(huì)攔截jsp/html/css/image的訪問(wèn)等,只會(huì)攔截訪問(wèn)的控制器?法(Handler)

  • /** * ?定義springmvc攔截器 */ public class MyIntercepter01 implements HandlerInterceptor {/** 往往在這?完成權(quán)限校驗(yàn)?作* @param request* @param response* @param handler* @return 返回值boolean代表是否放?,true代表放?,false代表中?* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyIntercepter01 preHandle......");return true;}/*** 會(huì)在handler?法業(yè)務(wù)邏輯執(zhí)?之后尚未跳轉(zhuǎn)??時(shí)執(zhí)?* @param request* @param response* @param handler* @param modelAndView 封裝了視圖和數(shù)據(jù),此時(shí)尚未跳轉(zhuǎn)??呢,你可以在這?針對(duì)返回的 數(shù)據(jù)和視圖信息進(jìn)?修改* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyIntercepter01 postHandle......");}/*** ??已經(jīng)跳轉(zhuǎn)渲染完畢之后執(zhí)?* @param request* @param response* @param handler* @param ex 可以在這?捕獲異常* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyIntercepter01 afterCompletion......");} }

    注冊(cè)SpringMvc攔截器

    <!--攔截所有handler--><!--<bean class="com.lagou.edu.interceptor.MyIntercepter01"/>--><mvc:interceptors><mvc:interceptor><!--配置當(dāng)前攔截器的url攔截規(guī)則,**代表當(dāng)前?錄下及其??錄下的所有url--><mvc:mapping path="/**"/><!--exclude-mapping可以在mapping的基礎(chǔ)上排除?些url攔截--><!--<mvc:exclude-mapping path="/demo/**"/>--><bean class="com.lagou.edu.interceptor.MyIntercepter01"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.lagou.edu.interceptor.MyIntercepter02"/></mvc:interceptor></mvc:interceptors>

    配置的角度

    從配置的?度也能夠總結(jié)發(fā)現(xiàn):serlvet、fifilter、listener是配置在web.xml中的,?interceptor是配置在表現(xiàn)層框架??的配置?件中的

    2.Pattern和Matcher用法

    Pattern pattern = Pattern.compile("Java"); String test="123Java456Java789Java"; String[] result = pattern.split(test); for(String s : result) System.out.println(s); } //123 456 789

    Pattern類也自帶一個(gè)靜態(tài)匹配方法matches(String regex, CharSequence input),但只能進(jìn)行全字符串匹配并且只能返回是否匹配上的boolean值

    String test1 = "Java"; String test2 = "Java123456";System.out.println(Pattern.matches("Java",test1));//返回true System.out.println(Pattern.matches("Java",test2));//返回false

    3.亂碼問(wèn)題解決

    ###3.1 Post亂碼
    Post請(qǐng)求亂碼,web.xml中加?過(guò)濾器

    <!-- 解決post亂碼問(wèn)題 --> <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 設(shè)置編碼參是UTF8 --><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param> </filter> <filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

    3.2get亂碼

    Get請(qǐng)求亂碼(Get請(qǐng)求亂碼需要修改tomcat下server.xml的配置)

    <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    4.自定義框架式 參數(shù)是arg2

    在web.xml中配置參數(shù)

    <!--編譯插件定義編譯細(xì)節(jié)--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>8</source><target>8</target><encoding>utf-8</encoding><!--告訴編譯器,編譯的時(shí)候記錄下形參的真實(shí)名稱--><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin>

    單詞

    Flash 閃光
    retrieve檢索
    specific特殊的,具體的
    delegates 代表
    Determine 確定決定
    Modified 修改
    process 進(jìn)程,流程
    theme 主題
    previous 以前
    Internal 內(nèi)部
    discoverer 發(fā)現(xiàn)
    Destruction 破壞
    Discovery發(fā)現(xiàn)
    Provided提供,假如 》findProvidedArgument
    resolve 解析,決心》resolveArgument

    總結(jié)

    以上是生活随笔為你收集整理的springMvc源码刨析笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    91网页版免费观看 | 国产精品一区二区三区久久 | 91在线文字幕 | 欧美日韩免费在线视频 | www亚洲国产 | 四虎国产精品成人免费影视 | 五月激情五月激情 | 亚洲va欧美va人人爽 | 中文字幕资源网 | 一区二区三区在线观看免费视频 | 又黄又爽又湿又无遮挡的在线视频 | 色婷婷久久久 | 国产五十路毛片 | 黄色成人影院 | 97在线免费观看 | 人人添人人澡人人澡人人人爽 | 天天操夜夜拍 | 国产一区二区久久久久 | 一区二区三区观看 | 美女福利视频在线 | 日韩av一区二区在线播放 | 国产成人三级在线播放 | 在线观看视频精品 | 一区二区三区电影大全 | 日日成人网 | 免费中文字幕在线观看 | 一级片视频免费观看 | 日韩大陆欧美高清视频区 | 欧美成人亚洲 | 久久免费视屏 | 久久不卡国产精品一区二区 | 亚洲人人爱 | 色婷婷狠狠18 | 狠色在线| 九草在线视频 | 成人国产网址 | 欧美天堂视频在线 | 啪啪动态视频 | 成人黄色视| 久久视频网址 | 五月天婷婷在线播放 | 欧美精品在线观看免费 | 日韩专区在线 | 91精品综合在线观看 | 国产精品高清免费在线观看 | 亚洲天堂网在线视频观看 | 成人动态视频 | 91在线九色 | 国产精品黄色av | 欧美日韩综合在线 | 最近高清中文字幕在线国语5 | 欧美一区在线看 | 欧美一区二区在线刺激视频 | 97免费在线视频 | 日本深夜福利视频 | 91在线永久 | 亚洲少妇xxxx | 国产精品色视频 | 91xav| 免费一级片久久 | 青青河边草免费观看 | 久久国产影院 | 亚洲精品国偷自产在线99热 | 久久夜色网 | 啪啪肉肉污av国网站 | 69绿帽绿奴3pvideos | 操操操干干干 | 香蕉久草在线 | 久久综合天天 | 99色免费视频 | 午夜精品一区二区三区在线视频 | www一起操 | 亚洲精品www. | 日本中文字幕在线一区 | 日本中文字幕电影在线免费观看 | 日日夜夜综合网 | 国产伦理一区 | 国产精品尤物视频 | 国产亚洲综合在线 | 久久精品亚洲一区二区三区观看模式 | 国产高清av免费在线观看 | 在线观看一区二区视频 | 五月婷婷丁香 | 天天操夜夜逼 | 天堂网一区二区 | 国产精品久久久久久久免费 | 国产精品第一页在线观看 | 免费97视频 | 国产丝袜制服在线 | 一本—道久久a久久精品蜜桃 | 亚洲国产成人在线播放 | 久久成人国产精品 | 在线观看一区视频 | 激情综合五月婷婷 | 欧美日韩亚洲第一 | 亚洲免费观看在线视频 | 日本精品视频在线观看 | 成人毛片在线视频 | www.av在线.com| 视频在线观看入口黄最新永久免费国产 | 国产精品免费观看久久 | 日本中文字幕一二区观 | 日韩精品一区二区三区水蜜桃 | 激情五月av | 黄色成人在线观看 | 国产剧情一区 | 玖操| 国产专区欧美专区 | 成年人免费电影在线观看 | 青草视频在线播放 | 亚洲中字幕 | 狠狠干在线 | 欧美黑人猛交 | 亚洲老妇xxxxxx| 亚洲成人免费在线观看 | 亚洲美女在线一区 | 欧美大jb| 成人国产精品免费 | 国产免费观看视频 | 精品久久久久久综合日本 | 日韩丝袜在线观看 | 国产免费一区二区三区最新 | 天天插狠狠干 | 色婷婷综合久久久中文字幕 | 成人在线观看你懂的 | www久久精品 | 成人a免费看 | 99视频免费播放 | 久久综合久久综合这里只有精品 | 亚洲在线| 亚洲午夜精品一区 | 免费在线观看一级片 | 亚洲综合小说电影qvod | av丝袜天堂 | 日本在线精品视频 | 丁香婷婷深情五月亚洲 | 国产精品中文字幕在线播放 | 午夜私人影院 | 免费观看的黄色 | 91麻豆精品国产自产在线游戏 | 黄色在线免费观看网站 | 91一区啪爱嗯打偷拍欧美 | 日本久久久精品视频 | 精品国产激情 | 色爱区综合激月婷婷 | 久久久久久久免费 | 在线观看av的网站 | 精品国产一区二区三区不卡 | 免费精品在线观看 | 中文字幕欧美激情 | 天天干天天操人体 | www.久久视频 | 日韩久久激情 | 婷婷av网站| 中文av字幕在线观看 | 亚洲春色综合另类校园电影 | 91精品国产综合久久婷婷香蕉 | 成人香蕉视频 | 91视频在线播放视频 | 午夜国产一区二区三区四区 | 日日摸日日碰 | 国产高清在线精品 | 久久网站av | 狠狠操操网 | 91超级碰| 91手机视频在线 | 国产精品久久久久久99 | 麻豆精品在线视频 | av大全在线 | 色综合久久88色综合天天免费 | 国产一区二区三区免费在线观看 | 二区在线播放 | 在线观看av大片 | 网址你懂的在线观看 | 狠狠狠的干 | 91麻豆精品国产 | 免费在线观看成人 | 日韩精品一区二区三区电影 | 国产小视频你懂的在线 | 91精品国自产拍天天拍 | 亚洲精品视频免费 | 久久人人精 | 国产精品porn | 波多野结衣在线中文字幕 | 日韩乱码中文字幕 | 97免费视频在线 | 国产又粗又硬又长又爽的视频 | 天天射射天天 | 人人爽夜夜爽 | 天天综合网 天天 | 五月婷婷国产 | 黄色av大片| 久草剧场 | 国产永久免费观看 | 正在播放国产精品 | 97超碰人人网 | 国产成人亚洲精品自产在线 | 成人精品福利 | av大全在线 | 免费黄av| 99精品偷拍视频一区二区三区 | 亚洲91视频 | 绯色av一区 | 激情综合网色播五月 | 亚洲天堂精品 | 亚洲精品免费在线视频 | 亚洲波多野结衣 | 国产精品爽爽爽 | 久久草在线精品 | 欧美日韩在线观看一区二区三区 | 亚洲国产欧美一区二区三区丁香婷 | 伊人国产女| 精品人妖videos欧美人妖 | 亚洲国产精品传媒在线观看 | se婷婷| 国产精美视频 | 免费观看高清 | 久久电影中文字幕视频 | 97夜夜澡人人双人人人喊 | 久久精品在线免费观看 | 日本三级久久久 | 久久久精品久久日韩一区综合 | 免费在线观看视频a | 丁香五月网久久综合 | 午夜精品久久久久久久99水蜜桃 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 色网站在线免费 | 亚洲视频在线看 | 欧美aa在线| 99视频免费在线观看 | 国产精品欧美久久久久无广告 | 天天综合入口 | 99久久这里有精品 | 最新高清无码专区 | 婷婷在线不卡 | 欧美性久久久 | 99久久99久国产黄毛片 | 中文字幕在线观看av | 久久99久国产精品黄毛片入口 | 国产黄色av影视 | 久草在线综合 | 91日韩在线专区 | av线上免费看| 中文字幕久久精品一区 | 日韩精品播放 | 久久tv | 欧美另类美少妇69xxxx | 最新av在线播放 | 亚洲视频在线视频 | 最新在线你懂的 | 色全色在线资源网 | 欧美日韩裸体免费视频 | 亚洲日本va中文字幕 | 97在线看片 | 亚洲精品午夜国产va久久成人 | 又紧又大又爽精品一区二区 | 国产三级午夜理伦三级 | 国产精品久久久久永久免费观看 | 国产精品久久一区二区三区, | 久久xx视频| 精品亚洲欧美一区 | 久久国产精品小视频 | 国产丝袜高跟 | 成人在线免费观看视视频 | 国产乱对白刺激视频不卡 | 日日日天天天 | 日韩av资源在线观看 | 国产第一页精品 | 国产精品久久久久av免费 | 永久免费av在线播放 | 亚洲五月 | 伊人久久电影网 | 看黄色91 | 久久精品91久久久久久再现 | 免费网址在线播放 | 91精品国产麻豆国产自产影视 | 欧美日韩不卡在线 | 亚洲韩国一区二区三区 | 看全黄大色黄大片 | 精品国产伦一区二区三区观看说明 | 精品婷婷| 一区二区三区在线观看中文字幕 | 在线免费av网 | 开心激情五月婷婷 | av丝袜在线 | av在线短片| 中文免费 | www激情com | 久久久久久久久久福利 | 欧美日韩精品二区第二页 | 欧美日韩免费观看一区二区三区 | av福利网址导航大全 | 久久婷婷色综合 | 午夜在线资源 | 亚洲视频精品 | 欧美一级日韩免费不卡 | 国产在线观看你懂得 | 天堂久色 | 久草视频在线资源站 | 色婷婷激情网 | 亚洲精品永久免费视频 | 国产一区私人高清影院 | 久草在线免费电影 | 天天操天天操天天操天天操天天操天天操 | 国产精品久久久久久久电影 | 免费亚洲黄色 | 久久草在线视频国产 | 久久在线免费观看 | 免费视频黄色 | 亚洲精品免费在线播放 | 国产一区二区不卡视频 | 五月婷婷六月丁香激情 | 中文字幕在线观看一区二区 | 一区二区男女 | 色婷婷国产 | 国产一区成人在线 | 中文高清av | 少妇啪啪av入口 | 日韩色在线 | 久久精品香蕉视频 | 91原创在线观看 | www免费在线观看 | 国产区第一页 | 久久久久国产精品午夜一区 | 欧美精品久久久久久久 | 日韩在线一区二区免费 | 五月激情天 | 欧美日韩国产综合网 | 日韩在线资源 | 麻豆视传媒官网免费观看 | 国产精品99久久久精品免费观看 | 高清免费在线视频 | 国产高清专区 | 麻豆免费看片 | 久久久久久久久久久免费视频 | 日韩美女免费线视频 | 黄色片免费电影 | 国产在线视频一区二区三区 | 成人免费观看完整版电影 | 国产成人精品综合 | 97电影在线 | 91黄在线看 | 日韩视频中文字幕在线观看 | 国色天香永久免费 | 欧美日韩国产免费视频 | 丁香激情婷婷 | 91中文在线 | 欧美在线视频第一页 | 欧洲视频一区 | 91丨九色丨国产在线观看 | 成人免费精品 | 美女网站在线观看 | 久久精品视频网站 | 99爱爱| 欧美日韩精品在线观看 | 日韩av电影网站在线观看 | 91精品国产92久久久久 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久草在线国产 | 免费在线中文字幕 | 中文在线www | 成人在线一区二区三区 | 免费国产在线精品 | av免费看在线 | 狠狠干网| 99久久国产免费,99久久国产免费大片 | 久久草网站 | 激情伊人五月天 | 免费看污网站 | 7799av| 国产色视频 | 日韩黄色软件 | 免费男女羞羞的视频网站中文字幕 | 欧洲精品亚洲精品 | 国产精品久久久久久久电影 | 黄av在线 | 欧美日韩精品在线 | 亚洲综合在线播放 | 日产乱码一二三区别在线 | av丝袜美腿 | 日韩中文字幕第一页 | 狠狠色丁香婷婷综合视频 | 国产欧美日韩精品一区二区免费 | 日日爽夜夜操 | 精品一区二区影视 | 中文字幕日韩免费视频 | 成年人黄色免费网站 | 狠狠色狠狠色 | 久久成视频| 在线观看日本高清mv视频 | 亚洲成人av片 | 国产高清视频在线播放一区 | 伊人黄色网 | 日韩在线观看第一页 | 色开心| 日韩肉感妇bbwbbwbbw | 中文字幕在线观看资源 | 色婷婷激婷婷情综天天 | 又粗又长又大又爽又黄少妇毛片 | 麻豆成人小视频 | 狠狠干夜夜爽 | 免费看的av片 | 日韩精品在线播放 | 天天艹日日干 | 日韩三级视频在线观看 | 高清在线一区 | 日韩一区正在播放 | 99热日本| 国产色网站 | 一区二区三区国 | 国产不卡在线观看 | 色偷偷888欧美精品久久久 | av成人在线观看 | 国产精品美女www爽爽爽视频 | 国产91电影在线观看 | 国产精品乱码在线 | 91精品1区2区 | 亚洲欧美日韩一区二区三区在线观看 | 国产精品久99 | 天天操天天综合网 | www.黄色小说.com | 久草国产精品 | 一区二区三区精品在线视频 | 久草.com| 手机看片1042| 9在线观看免费高清完整 | 中文字幕资源在线观看 | 国产中文字幕亚洲 | 日本中文字幕高清 | 最新91在线视频 | 国产在线欧美在线 | 久久免费视频3 | 丁香av| 国产精品久久一区二区三区不卡 | 国产小视频在线观看 | 亚洲成av人影片在线观看 | 网址你懂的在线观看 | 日韩va亚洲va欧美va久久 | 99免费观看视频 | 久久久国产一区二区三区 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 日韩a在线| 国产传媒中文字幕 | 天天综合天天做 | 色网站在线看 | 婷婷色 亚洲| 婷婷综合国产 | 91精品啪在线观看国产线免费 | 99精品视频免费全部在线 | 国产白浆视频 | 久久综合九色综合欧美狠狠 | 91桃色免费视频 | 五月天丁香视频 | 久久精品视频在线播放 | 久久激情婷婷 | 天天天色综合a | 亚洲成人av在线播放 | 久久久久久久久久久久久影院 | 五月婷婷在线观看视频 | 久久夜夜操 | 亚洲欧美乱综合图片区小说区 | 亚洲欧美视频在线观看 | 少妇搡bbbb搡bbb搡aa | 亚洲成av | 天天干天天操人体 | 亚洲欧美激情精品一区二区 | 色播六月天| 精品视频区 | 狠狠狠色 | 97国产在线 | 天天操天天舔天天干 | 日韩av视屏在线观看 | avove黑丝 | 在线亚州 | 日韩在线视频免费播放 | 色婷婷久久一区二区 | 日韩一二三| avlulu久久精品 | 国产黄影院色大全免费 | 久久综合婷婷国产二区高清 | 久久99亚洲网美利坚合众国 | 色偷偷中文字幕 | 91免费高清观看 | 婷婷伊人五月 | 国产精品美女久久久网av | 免费观看xxxx9999片 | 国产在线观看91 | 国产日韩在线一区 | a视频免费在线观看 | 日本三级不卡 | 五月婷婷综合久久 | 国产资源免费在线观看 | 综合精品在线 | 免费日韩一区二区三区 | 色丁香综合 | 99久久99视频只有精品 | 午夜狠狠操 | 日韩免费电影在线观看 | 色婷婷导航 | 成年人免费电影在线观看 | 欧美精品xxx | 亚洲精品美女久久久久 | 中文电影网 | 99在线热播| 91看片淫黄大片91 | 81精品国产乱码久久久久久 | 天天色天天操综合 | 中文字幕在线视频国产 | 69精品在线观看 | 玖草影院| 天天干天天操天天入 | 久久高清免费观看 | 99久久精品国产系列 | 人人干免费 | 色 中文字幕 | 不卡的一区二区三区 | 亚洲精品在 | 久草在线久 | 久草在线资源视频 | 亚洲精品66 | 99免费看片 | 久久毛片网| 伊人首页 | 97理论片| 久久精品视频播放 | 免费99精品国产自在在线 | 久九视频 | 久久久国产精品视频 | 日韩三级免费 | av网站地址 | 麻豆国产在线视频 | 久久免费视频4 | 在线观看免费版高清版 | 久草视频免费看 | 亚洲黄电影 | 亚洲精品视频免费在线 | 日韩欧美在线播放 | 91av官网| 免费看网站在线 | 成人在线视频免费 | 午夜久久久精品 | 最近中文字幕免费av | 国产一区二区在线播放 | 99久热在线精品视频观看 | 色视频 在线 | 91女子私密保健养生少妇 | 免费人成在线观看 | 日韩精品一区二区三区三炮视频 | 久久av网址 | 涩av在线 | 国产精品精品久久久久久 | 狠狠色丁香婷婷综合基地 | 国产91精品在线播放 | 国产精品一区二区果冻传媒 | 福利视频网站 | 亚洲午夜久久久影院 | 国产美女黄网站免费 | 日本久久视频 | 丁香激情五月 | 成人av教育 | 久久久久久久久久久免费视频 | 99久久久国产精品 | 久久草在线精品 | 国产香蕉视频在线观看 | 成人精品一区二区三区电影免费 | 九九一级片 | 婷婷黄色片 | 91视频在线 | 午夜黄色大片 | 在线观看免费av片 | 久久久久在线观看 | 天天搞天天| 三级av免费观看 | 激情综合网在线观看 | 免费的黄色的网站 | 日韩中文字幕免费 | 久综合网 | 中文高清av | 国产精品一区二区麻豆 | 欧美久久久 | 国产精品中文字幕在线播放 | 18国产精品福利片久久婷 | 天天草天天干天天射 | 国产明星视频三级a三级点| 午夜视频免费播放 | 成人97视频一区二区 | 99久久电影| 国产精品久久av | 在线观看中文字幕2021 | 亚洲精品18日本一区app | 天天干天天操天天入 | 中文字幕在线观看网址 | 黄色一级在线视频 | 狂野欧美激情性xxxx欧美 | 日韩在线观看视频一区二区三区 | 亚洲欧洲成人精品av97 | 日韩中字在线 | 日韩黄色中文字幕 | 一区三区视频 | 99国产在线 | 精品无人国产偷自产在线 | 国产 欧美 日产久久 | 就操操久久 | 91在线porny国产在线看 | 天天爱天天射天天干天天 | 激情五月婷婷激情 | 国产成人精品一区二区三区网站观看 | 国产一级淫片免费看 | 久久精品视频18 | 综合国产在线观看 | 免费www视频 | 在线亚洲观看 | 视频一区在线免费观看 | 91麻豆免费视频 | 91av视频导航| 成人免费在线视频 | 天天操天天射天天操 | 精品人妖videos欧美人妖 | 91喷水 | 在线 影视 一区 | 国产色秀视频 | 国产精品久久一区二区三区不卡 | 中文字幕黄网 | 97热久久免费频精品99 | 国产精品久久精品国产 | 国产五月天婷婷 | 五月天天色 | 在线观看黄色大片 | 国产精品完整版 | 亚洲精品一区中文字幕乱码 | 精品99在线观看 | 黄色网免费| 久久免费视频99 | 婷五月激情 | 中文字幕欲求不满 | 99久久国产免费,99久久国产免费大片 | 在线av资源 | 在线国产99| 中文字幕在线观看亚洲 | 国产.精品.日韩.另类.中文.在线.播放 | 四川bbb搡bbb爽爽视频 | 国产99色 | 在线观看中文字幕视频 | 亚洲精品国产精品久久99热 | 97精品在线观看 | 国产黄在线免费观看 | 美女免费视频一区二区 | 四月婷婷在线观看 | 亚洲精品久久久久999中文字幕 | 国产精品11 | 国产精品美女久久久久久网站 | 91在线porny国产在线看 | 亚洲精品一区二区18漫画 | 免费看三级黄色片 | 久久狠狠一本精品综合网 | 国产精品破处视频 | 一区二区激情视频 | 在线黄色免费 | 久久这里 | 成人国产精品免费观看 | 亚洲午夜小视频 | 青春草免费在线视频 | 天天爱天天干天天爽 | 日本黄色免费看 | 久久视频热 | 婷婷深爱 | 在线观看亚洲免费视频 | 69性欧美 | 免费看片色 | 女人魂免费观看 | 国产视频久久 | 中文字幕一区二区三区视频 | 国产一级视屏 | 久草视频免费在线观看 | 久久综合国产伦精品免费 | 久久一线 | 五月激情片 | 国产精品美女在线观看 | 久久国产精品99国产精 | 日韩亚洲在线观看 | 日韩电影中文字幕在线 | 精品国产乱码久久久久久久 | 久久精品在线视频 | 久久综合色影院 | 久久久久日本精品一区二区三区 | 午夜av在线免费 | 99久久夜色精品国产亚洲 | 亚洲一区av | 日韩手机视频 | 十八岁以下禁止观看的1000个网站 | 日本不卡久久 | 国产中文字幕亚洲 | 综合色亚洲 | 在线观看中文字幕dvd播放 | 成人av片免费看 | av在线播放不卡 | 欧美另类网站 | 国产精品永久久久久久久久久 | 日韩影视在线 | 视频在线观看日韩 | 精品久久久久久久久久久久 | 亚州精品在线视频 | 国产精品自在线 | 九九九在线 | 成人午夜电影久久影院 | 久久国产精品久久精品国产演员表 | 久久久久国产免费免费 | 国产伦精品一区二区三区… | 国产精品久久电影观看 | 黄网站色成年免费观看 | 免费亚洲精品视频 | 国产精品一区二区三区久久久 | 深爱激情亚洲 | 日韩在线大片 | 天天干天天在线 | 国产精品久久久久婷婷 | 最新日韩在线观看 | 久久九九久久九九 | 欧美精品久久 | 中文字幕av免费 | 成年人在线观看网站 | 激情综合网在线观看 | 色多多视频在线观看 | 日韩国产欧美在线视频 | 狠狠干电影 | 久要激情网| 亚洲成人精品 | 成人av动漫在线 | 日日干 天天干 | 91亚洲精品久久久久图片蜜桃 | 国产成人综合在线观看 | 久久久久亚洲a | 日韩爱爱片 | 国产少妇在线观看 | 中文字幕乱码电影 | 99久久婷婷国产一区二区三区 | 国内精品久久久久影院一蜜桃 | 欧美成人69av| 亚洲另类久久 | 国产精品嫩草影院9 | 一二区电影 | 国内精品久久久久久 | japanesexxxhd奶水| 国精产品一二三线999 | 亚洲在线黄色 | 欧美久久久久 | 国产色久| 中文在线字幕免费观看 | 黄色三级av | 色吊丝在线永久观看最新版本 | 国产一级二级视频 | 97色综合 | 久久人人爽人人爽 | 日韩欧美69| 国产高清黄 | 欧美精品九九 | 激情视频二区 | 免费看国产一级片 | 欧美一级视频一区 | 日韩高清不卡一区二区三区 | 麻豆传媒视频在线播放 | 亚洲视频专区在线 | 精品久久久久久久久久久久久久久久 | 亚洲国产精品500在线观看 | 精品一区二区三区四区在线 | 日日综合网 | 99久视频 | 亚洲高清激情 | 天天爽夜夜操 | 国产亚洲精品久久久久5区 成人h电影在线观看 | www日韩欧美| 国产精品不卡在线播放 | 久久最新视频 | 精品久久久久久久久久久久久久久久 | 国产精品理论在线观看 | 97网站| 国产精品18久久久久白浆 | 色在线最新| 日韩在线观看网址 | 日韩视频一二三区 | 国产视频亚洲 | 欧美专区日韩专区 | 亚洲欧美综合精品久久成人 | 天天综合色天天综合 | 亚洲专区在线视频 | 波多野结衣综合网 | 精品视频久久 | 欧美最爽乱淫视频播放 | 在线国产能看的 | 麻豆观看| 精品视频久久 | 怡春院av| 中国一区二区视频 | 手机在线视频福利 | 亚洲成人二区 | 欧美精品国产综合久久 | 天天激情综合网 | 亚洲精品黄色在线观看 | 欧美一区二区三区在线播放 | 91精品办公室少妇高潮对白 | 成人精品福利 | 国产一区二区视频在线 | 国产一级黄色电影 | 国产精品videossex国产高清 | 国产亚洲无| 夜夜爽88888免费视频4848 | 国产又粗又猛又爽又黄的视频先 | 福利视频一区二区 | 日韩精品视频免费在线观看 | 色先锋av资源中文字幕 | 91精品国产福利 | 免费情缘 | 亚洲好视频 | 亚洲精品婷婷 | 久久久精品综合 | 91精品久久久久久粉嫩 | 精品久久久久久久久久久久久久久久久久 | 免费看的黄色的网站 | 欧美大香线蕉线伊人久久 | 精品一区二区在线免费观看 | 成人小视频在线播放 | 国产精品中文久久久久久久 | 爱av在线网| 色视频在线免费 | 午夜视频免费在线观看 | 在线国产中文 | 视频91| 超碰97中文| 久久亚洲精品电影 | 麻花传媒mv免费观看 | 超碰九九 | 婷婷六月久久 | 久久久.com| 国产小视频在线免费观看 | x99av成人免费 | 成人91在线 | 狠狠狠狠狠干 | 伊人色综合久久天天 | 亚洲一级黄色 | 狠狠操影视 | 热久久精品在线 | 久久少妇av | 国产视频亚洲 | 亚洲综合日韩在线 | 国际av在线 | 麻豆精品在线 | 97超碰人人网 | 国产亚洲成av片在线观看 | 亚洲高清视频在线 | 国产在线a免费观看 | av色图天堂网 | 日韩精品久久久久 | 草久久久久| 国产精品久久久久影视 | 国产无限资源在线观看 | 午夜手机电影 | 成人在线视频论坛 | 天天天干夜夜夜操 | 最近中文字幕大全中文字幕免费 | 精品91| 日本在线观看中文字幕 | 久久av中文字幕片 | 97福利在线观看 | 在线免费看片 | 日韩理论 | 久久成人免费视频 | 在线成人免费电影 | 亚洲天堂视频在线 | 在线精品视频在线观看高清 | 91在线精品一区二区 | 五月天天av | 日本久久精品 | 综合色伊人 | av丝袜在线 | 波多野结衣网址 | 国产一及片| 中文字幕亚洲不卡 | 欧美在线99 | 国产二区视频在线观看 | 精品一区二区综合 | 欧美一级久久 | 香蕉视频色| 国产精品一区二区在线观看 | 日韩欧美精品免费 | 亚洲伦理中文字幕 | 2019天天干夜夜操 | 久久成人免费电影 | 999精品视频| 国精产品满18岁在线 | 欧美性生交大片免网 | 欧美小视频在线 | 在线观看国产www | 激情久久久久久久久久久久久久久久 | 久久草草影视免费网 | 久久人人97超碰精品888 | 日精品| www国产一区 | 国产精品一区二区精品视频免费看 | 亚洲伊人av | 日韩av片免费在线观看 | 99久久久久久国产精品 | 黄色三级在线观看 | 国产一级黄 | 亚洲在线视频观看 | 99理论片| 国产一级黄 | 在线精品亚洲 | 开心激情久久 | 波多野结衣电影一区二区三区 | 久久精品99 | 免费看片在线观看 | 99久久久国产免费 | 91探花国产综合在线精品 | 99久在线精品99re8热视频 | 黄影院| 国产精品久久综合 | 国产99久久精品 | 天天干天天弄 | 亚洲成aⅴ人片久久青草影院 | 免费高清在线观看电视网站 | 天天av在线播放 | 狠狠色狠狠色合久久伊人 | 99情趣网视频 | 国产xxxx性hd极品 | 蜜桃麻豆www久久囤产精品 | 美女中文字幕 | 91精品久久久久久久久久入口 | 成人在线网站观看 | 一区二区三区韩国免费中文网站 | 99在线热播精品免费99热 | 国产精品久久久久久影院 | 在线观看完整版免费 | 成人免费在线观看av | 亚洲 欧美日韩 国产 中文 | 一级a性色生活片久久毛片波多野 | 91精品毛片 | 精品视频在线观看 | 91毛片在线 | 久久免费福利 | 激情五月看片 | 极品国产91在线网站 | 天天射网站 | 伊甸园永久入口www 99热 精品在线 | 欧美日韩首页 | 国产午夜影院 | 综合色站导航 | 91九色视频在线 | 2018亚洲男人天堂 | 色综合天天做天天爱 | 国产成人久久精品一区二区三区 | 欧美日韩国产一区二区在线观看 | 欧美中文字幕第一页 | 亚洲另类久久 | 日韩免费二区 | 欧美91精品久久久久国产性生爱 | 色婷婷视频在线 | 日韩理论电影网 | 精品久久久久久久久久岛国gif | 在线看欧美 | 又长又大又黑又粗欧美 | 伊人影院得得 | 国产精品国产三级在线专区 | 91综合久久一区二区 | 欧美性生活久久 | 国产在线观看av | 中文字幕欧美日韩va免费视频 | 欧美日韩中文在线视频 | 亚洲中字幕 | 国产玖玖视频 | 久久精品免费看 | 少妇精品久久久一区二区免费 | 国产高清在线永久 | 伊人成人精品 | 免费人成网ww44kk44 | 国产高清福利在线 | www.亚洲精品 | 天天射,天天干 | 免费看一级特黄a大片 | 综合色站| 精品伊人久久久 | 91九色视频在线观看 | 免费看黄的视频 | 激情欧美国产 | 丁香网五月天 | 久久经典国产 | 亚洲亚洲精品在线观看 | 国产精品高清一区二区三区 | 亚洲国产中文在线 | 黄色三级免费 | 久草久草在线 | 中文字幕成人在线 | 伊人狠狠色丁香婷婷综合 | 欧美日韩久久一区 | 99热国产在线 | 亚洲成aⅴ人在线观看 | 成人日韩av| 91香蕉视频色版 | 超碰在线公开 |