做为經典MVC观念的春天完成,它还可以协助大家开发设计灵便的JavaWeb应用软件。今日,使我们把刀挪到它上边,看一下它的里面是怎样完成的。大家能拷贝它吗?

最先大家在一张状态图看来一下springMVC的运作步骤。mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第1张图片最先,使我们根据一个状态图看来看springMVC的运作全过程。

SpringMVC运作全过程。

从里面的状态图中,我们可以见到一个叫dispatcherServlet的混蛋十分忙,他基本上参加了每一步。他为何那么忙?这和他的名字相关。

值班员/值班员' pt/n .智能变送器,值班员。

等同于M-V-C之中的快递员或是领导干部,承担启用每个部件。

使我们假定这一情景:

DispatcherServlet是MVC情景中的管理者,他本人对任何的事儿都承担,因此他务必阅读文章和准许全部的事儿。这一天,他接到一个客户要求,规定他给一个网页页面。

他马上门把举过主手眼前,说:“小杨,看一下这一份工作中。由谁来做?”当小杨门把投射见到员工档案表上有一个叫小赵的管制员担任时,小杨对领导干部说:“管制员小赵担任”。

这时领导干部DispatcherServlet没法立即寻找小赵,由于小赵只承担完成实际的业务流程,客户的要求过度抽象性,小赵没法了解,必须有些人帮他整理第一步干什么,第二步干什么。这时候工程项目经理HandlerAdaper线上上,领导干部寻找工程项目经理说“帮小赵梳理一下,这一工作中如何做”。

工程项目经理三次除于二完成了这件事情。以后,领导干部把解决好的每日任务交到了李。大家小赵也很有竞争能力,完成了。除此之外,他的新项目不但有业务流程(实体模型),也有好看的部件(主视图)。可是小赵同学们的审美观很差,不可以融合在一起。因此,带队DispatcherServlet跑去找学美术的viewRsolver,请她3D渲染。ViewRsolver的描画技巧十分精湛,多笔就能3D渲染出一个不仅有信息资讯又很美的网页页面。

这时,当一个新项目结束后,DispatcherServlet会将結果(如JSP等前面网页页面)展现给客户,客户令人满意并坦荡地付了钱,因此大家都富有拿…

看过Rod Johnson的springMVC的MVC步骤,里边的部件分工明确,能够进行许多繁杂的业务流程。可是,大家才刚开始发展,毫无疑问做不来那么多事儿。因而,今日大家将构筑一个简洁的版本号,仅有DispatcherServlet和各种各样业务员。销售员,或是只管理主要的业务流程,让领导干部做别的全部的工作中。

大家的步骤:

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第2张图片在人们的环节中,DispatcherServlet leader =前面控制板 投射CPU。

好确立我们要接的每日任务,如今建哥要从零课堂教学,开!

详尽流程

1.建立webApp框架的maven新项目。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第3张图片2.在pox.xml中引进依赖感

javax . servlet javax . servlet-AP 3 . 1 . 0 providedorg . reflections reflections 0 . 9 . 11

3.如下图所示,建立一个新包。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第4张图片4.撰写环境变量。

在資源文件目录下写一个环境变量:applicationContext.properties,內容是:特定扫描仪途径包,大家在这儿特定控制板所属的包。

package = com . cloud wise . controller

升级web.xml文件。

框架或是2.0版本号,大家这儿升级到4.0版本号。

并申请注册大家的管理者MyDispatcherServlet,并特定环境变量所属的contextConfigLocation。大家的领导干部会亲自做全部的事儿,使他在这儿阻拦全部的要求。

Archetype Created Web Applicationxxxcom.cloudwise.servlet.MyDispatcherServletcontextConfigLocationapplicationContext.propertiesxxx/

6.自定注解。

这儿注解的效果等同于给类/方式加了一个小尾巴。大家根据不一样的尾端鉴别不一样的控制板和方式。

大家界定了2个注解。

@MyControllerpackage com.cloudwise.annotition;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** @author Teacher 陈* @creat 2021-02-22-13:04* @describ 我的Controller注释,用以效仿spring中的@Controller* 可以功效于类上,标志此类是一个Controller*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface MyController {/*** 没有用,但为了更好地效仿spring中的@Controller,大家或是把它再加上* 大家的简单版选用默认设置的id:首写小写字母的类名*/String value() default ";}@MyRequestMappingpackage com.cloudwise.annotition;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** @author Teacher 陈* @creat 2021-02-22-13:11* @describ 用以效仿spring中的@RequestMapping* 可以功效于类和方式上,用以根据url特定相匹配的Controller和 Method*/@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MyRequestMapping {/*** 简单版,网站域名只有有一段,只有是/controllerName/methodName*/String value() default ";}

好啦,之上是一些准备工作。假如把效仿springMVC当作是建立一个精英团队,那麼上边的作业就等同于给精英团队找了一个工作中的地区。下列是对人物的叙述。最先,请热烈欢迎大家的领导干部MyDispatcherServlet。

写前面控制板。

撰写一个前面控制板(一个Servlet)并遮盖init和service方式。

MyDispatcherServlet

从总体上看

全部全过程紧紧围绕2个调用的方式进行,在其中init()是关键。

MyDispatcherServlet应当做的,一句话:看前面浏览详细地址,随后启用配对CPU(Controller)的相匹配方式。

要保证这一点,大家必须根据注解将某一字符串数组关联到Controller和方式,随后从前面推送的Url中寻找一样的字符串数组来进行配对。反射面在这个环节中起着至关重要的功效,许多姿势,例如在类头顶寻找注解,或是在注解中寻找值,都必须反射面。

特殊全过程

复位

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第5张图片服务项目表明:这儿Handler =控制板 方式。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第6张图片编码(逐渐)

建立一个承继httpservlet并调用2个方式的dispatcherServlet。

public class MyDispatcherServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}

下一步是填好2个方式,第一个是init()方式。

大概可以分成四个流程。

载入环境变量扫描仪controller包复位controller复位Handler映射器(Handler = controller method)

大家现在开始。撰写编码以载入环境变量。

1.载入环境变量。

最先,大家在这儿挑选特性文档的方式开展配备,因此大家必须有一个properties目标。

/*** 大家将必须扫描仪的包放到一个.properties文件中* 必须在复位的情况下载入它*/private Properties properties = new Properties();再写一个专用工具性的方法/*** 载入环境变量* @param fileName*/private void loadConfigfile(String fileName) throws IOException {//以流的方法获得資源InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(fileName);properties.load(resourceAsStream);resourceAsStream.close();}以后,我们在init()中启用该方式@Overridepublic void init(ServletConfig config) throws ServletException {//1. 载入环境变量//这儿我们在web.xml中安装的复位主要参数contextConfigLocation就具有作用了String initParameter = config.getInitParameter("contextConfigLocation");try {loadConfigfile(initParameter);} catch (IOException e) {e.printStackTrace();}}

如今,大家的第一步是载入环境变量的编码。

别的三个流程选用同样的念头。

2.扫描仪控制板包。

界定需要的特性。

/*** 大家必须一个Set,将全部可以回应的Controller存起來*/private Set entryClass = entry.getValue().getClass();if (!entryClass.isAnnotationPresent(MyController.class)){continue;}//Controller类上的requestMapping值,如果有则获得String baseUrl = ";if (entryClass.isAnnotationPresent(MyRequestMapping.class)){MyRequestMapping annotation = entryClass.getAnnotation(MyRequestMapping.class);baseUrl = annotation.value();}//获得全部方式Method[] methods = entryClass.getMethods();for (Method method : methods) {if (method.isAnnotationPresent(MyRequestMapping.class)){MyRequestMapping annotation = method.getAnnotation(MyRequestMapping.class);String url = annotation.value();url = baseUrl url;//将该方式放进方式集methodMap.put(url,method);//将该controller方法CPU集controllerMap.put(url,entry.getValue());//到此,复位进行,后面蓄势待发}}}}

在init()中启用。

@Overridepublic void init(ServletConfig config) throws ServletException {//1. 载入环境变量String initParameter = config.getInitParameter("contextConfigLocation");try {loadConfigfile(initParameter);} catch (IOException e) {e.printStackTrace();}//2. 扫描仪controller包,储存全部可以回应的ControllerscanPackage(properties.getProperty("package"));//3. 复位controllertry {initController();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}//4. 复位Handler映射器initHandlerMapping();}

到此,大家的领导干部MyDispatcherServlet的复位一部分完成了,如今他对自身的精英团队组员了然于胸:许多业务员(有一些同学们很有可能会问:刘老师,你还是沒有界定控制板!如今,使我们调用他的service()方式,那样他就可以在外面接工作中了。

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (methodMap.isEmpty()){return;}String uri = req.getRequestURI();String contextPath = req.getContextPath();//获得合理urlString url = uri.replace(contextPath,");//要是没有相匹配的url,回到404if (!methodMap.containsKey(url)){resp.getWriter().println("404");}else {//有得话,根据invoke方式实行相匹配controller的methodMethod method = methodMap.get(url);Object controller = controllerMap.get(url);try {method.invoke(controller);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}

到此,MyDispatcherServlet的全部编码都早已进行,他能够变成一名优秀的管理者。

之上一部分代码比较零散,我的DispatcherServlet详细编码放到文尾,供学生们参照。

最终,撰写一个控制板开展检测。

package com.cloudwise.controller;/*** @author Teacher 陈* @creat 2021-02-22-14:57* @describ*/import com.cloudwise.annotition.MyController;import com.cloudwise.annotition.MyRequestMapping;/*** @author :Teacher 陈* @date :Created in 2021/2/22 14:57* @description:我的试验性Controller* @modified By:* @version:*/@MyController@MyRequestMapping(value = "/test")public class MyFirstController {@MyRequestMapping(value = "/test1")public void test1(){System.out.println("test1被启用了");}@MyRequestMapping(value = "/test2")public void test2(){System.out.println("test2被启用了");}@MyRequestMapping(value = "/test3")public void test3(){System.out.println("test3被启用了");}}

实验

1.因此新项目配备tomcat。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第7张图片2.快逃。

3.1在网页地址栏键入相应的URL。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第8张图片控制面板取得成功打印出日志信息内容。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第9张图片3.2在网页地址栏键入失效URL,网页页面回到404。

mvc架构图用什么画-mvc框架图书馆管理系统jdbc-第10张图片到此,今日笔写的springMVC早已进行。

自然这一新项目也有许多必须完善的地区,例如json数据信息不可以回到,控制板不可以有主要参数这些。可是大家不太可能一夜之间完工罗马帝国。要一步一步把握springMVC的运作全过程,为之后更难的新项目奠定基础。

编码(简述)

package com.cloudwise.servlet;/*** @author Teacher 陈* @creat 2021-02-22-13:44* @describ*/import com.cloudwise.annotition.MyController;import com.cloudwise.annotition.MyRequestMapping;import org.reflections.Reflections;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.IOException;import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.*;/*** @author :Teacher 陈* @date :Created in 2021/2/22 13:44* @description:我的前面控制板dispather* @modified By:* @version:*/public class MyDispatcherServlet extends HttpServlet {/*** 大家将必须扫描仪的包放到一个.properties文件中* 必须在复位的情况下载入它*/private Properties properties = new Properties();/*** 大家必须一个Set,将全部可以回应的Controller存起來*/private Set

评论(0条)

刀客源码 游客评论