东莞道滘网站建设,百度做网站联系电话,ppt模板资源网站,网站建设要求有哪些MVC框架MVC是一种设计模式#xff08;设计模式就是日常开发中编写代码的一种好的方法和经验的总结#xff09;。模型#xff08;model#xff09;-视图#xff08;view#xff09;-控制器#xff08;controller#xff09;#xff0c;三层架构的设计模式。用于实现前端…MVC框架MVC是一种设计模式设计模式就是日常开发中编写代码的一种好的方法和经验的总结。模型model-视图view-控制器controller三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。Spring MVC的主要组件前端控制器 DispatcherServletSpring的MVC框架是围绕DispatcherServlet来设计的它用来处理所有的HTTP请求和响应。此模块不需要程序员开发。作用接收请求、响应结果相当于转发器有了DispatcherServlet 就减少了其它组件之间的耦合度。处理器映射器HandlerMapping此功能不需要程序员开发。作用根据请求的URL来查找Handler处理器适配器HandlerAdapter作用进行视图的解析根据视图逻辑名解析成真正的视图view视图View需要程序员开发jsp。View是一个接口 它的实现类支持不同的视图类型jspfreemarkerpdf等等用户发送请求至前端控制器DispatcherServletDispatcherServlet收到请求后调用HandlerMapping处理器映射器请求获取Handle处理器映射器根据请求url找到具体的处理器生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServletDispatcherServlet 调用 HandlerAdapter处理器适配器HandlerAdapter 经过适配调用 具体处理器(Handler也叫后端控制器)Handler执行完成返回ModelAndViewHandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServletDispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析ViewResolver解析后返回具体ViewDispatcherServlet对View进行渲染视图即将模型数据填充至视图中DispatcherServlet响应用户。手写模拟SpringMvc源码spring mvc调用到Controller执行的原理通过加载配置文件web.xml进而加载spring-mvc.xml。根据配置文件给定的目录来扫描整个项目。扫描所有加了Controller注解的类。当扫描到加了Controller注解的类之后遍历里面所有的方法。拿到方法对象之后 解析方法上面是否加了RequestMapping注解。定义一个Map集合把RequstMapping的value 与方法对象绑定起来即MapString,Method。定义一个Map把声名该方法的类的对象绑定起来即MapString,Object。拦截到请求之后拿到请求的URI。处理请求例如执行指定方法返回字符串或跳转到相应视图。目录导入依赖 dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/version/dependency!-- 解析xml文件--dependencygroupIddom4j/groupIdartifactIddom4j/artifactIdversion1.6.1/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.9/version/dependency代码DispatcherServlet类public class DispatcherServlet extends HttpServlet {private ApplicationContext applicationContext;private ListMyHandle myHandleListnew ArrayList();Overridepublic void init() throws ServletException {String contextConfigLocation this.getServletConfig().getInitParameter(contextConfigLocation);System.out.println(contextConfigLocation);applicationContext new ApplicationContext(contextConfigLocation);applicationContext.refresh();initHandleMappinng(applicationContext);}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {excuteDispatch(req,resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}public void initHandleMappinng(ApplicationContext applicationContext){if(applicationContext.beanDefinitionConcurrentHashMap.size()0){throw new RuntimeException(Spring容器为空);}for (Map.EntryString, BeanDefinition stringBeanDefinitionEntry : applicationContext.beanDefinitionConcurrentHashMap.entrySet()) {Class clazz stringBeanDefinitionEntry.getValue().getClazz();for (Method declaredMethod : clazz.getDeclaredMethods()) {boolean annotationPresent declaredMethod.isAnnotationPresent(RequestMapping.class);if(annotationPresenttrue){String value declaredMethod.getAnnotation(RequestMapping.class).value();MyHandle myHandlenew MyHandle(value,declaredMethod,clazz);myHandleList.add(myHandle);}}}}public void excuteDispatch(HttpServletRequest request,HttpServletResponse response){MyHandle handle getHandle(request);if(handlenull){try {response.getWriter().print(404);} catch (IOException e) {e.printStackTrace();}}else {Method method handle.getMethod();Class?[] parameterTypes method.getParameterTypes();Object[] paramsnew Object[parameterTypes.length];MapString, String[] parameterMap request.getParameterMap();for (Map.EntryString, String[] stringEntry : parameterMap.entrySet()) {String key stringEntry.getKey();String value stringEntry.getValue()[0];int i GetRequestParams(method, key);if(i0)params[i]value;else {//反射获取的是arg0官方这里用的不是反射机制}}try {Object invoke method.invoke(handle.getClazz().newInstance(), params);PrintWriter writer response.getWriter();writer.print(invoke);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}public MyHandle getHandle(HttpServletRequest request){String requestURI request.getRequestURI();for (MyHandle myHandle : myHandleList) {if(myHandle.getUrl().equals(requestURI))return myHandle;}return null;}public int GetRequestParams(Method method,String name){Parameter[] parameters method.getParameters();for (int i0;iparameters.length;i) {boolean annotationPresent parameters[i].isAnnotationPresent(RequestParam.class);if(annotationPresent){String value parameters[i].getAnnotation(RequestParam.class).value();if(value.equals(name))return i;}}return -1;}}XmlPaser类public class XmlPaser {public static String getbasePackage(String xml){SAXReader saxReadernew SAXReader();InputStream inputStream XmlPaser.class.getClassLoader().getResourceAsStream(xml);try {Document document saxReader.read(inputStream);Element rootElement document.getRootElement();Element componentScan rootElement.element(component-scan);Attribute attribute componentScan.attribute(base-package);String text attribute.getText();return text;} catch (DocumentException e) {e.printStackTrace();}return ;}
}
web.xml?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0display-nameApplication/display-nameservletservlet-nameDispatcherServlet/servlet-nameservlet-classcom.example.demo.springmvc.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-app
代码下载地址https://download.csdn.net/download/qq_43649937/87558006