我們定義兩個(gè)注解
@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* 能夠作用于類上,標(biāo)識(shí)該類是一個(gè)Controller*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface MyController {/*** 沒(méi)有用,但為了模仿spring中的@Controller,我們還是把它加上* 我們的簡(jiǎn)單版采用默認(rèn)的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* 能夠作用于類和方法上,用于通過(guò)url指定對(duì)應(yīng)的Controller和 Method*/@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MyRequestMapping {/*** 簡(jiǎn)單版,域名只能有一段,只能是/controllerName/methodName*/String value() default "";}好了上面的就是一些準(zhǔn)備性的工作,如果說(shuō)把仿寫springMVC看成是組成一個(gè)團(tuán)隊(duì)的話,上面的工作相當(dāng)于給團(tuán)隊(duì)找工作場(chǎng)地,下面就是對(duì)人物的刻畫了,首先有請(qǐng)我們的領(lǐng)導(dǎo)MyDispatcherServlet
編寫前端控制器編寫前端控制器(一個(gè)Servlet),并重寫init和service方法
MyDispatcherServlet
總覽整個(gè)過(guò)程圍繞兩個(gè)重寫的方法而展開(kāi),其中init()是重點(diǎn) 。
MyDispatcherServlet要做的事,用一句話來(lái)說(shuō):看前端的訪問(wèn)地址,然后調(diào)用匹配的處理器(Controller)的對(duì)應(yīng)方法(method)
要完成這些,我們需要通過(guò)注解,為Controller和method綁定上一定的字符串,然后通過(guò)分析前端傳過(guò)來(lái)的Url中的字符串,找到兩者相同的,以此完成匹配 。反射在此過(guò)程中發(fā)揮了巨大作用,不論是找到類頭上的注解,還是找到注解中的值等諸多動(dòng)作都需要反射 。
具體流程Init
Service 注:在此處Handler = controller + method
代碼(分步)創(chuàng)建一個(gè)dispatcherServlet繼承httpservlet 并重寫兩個(gè)方法
public class MyDispatcherServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}接下來(lái)就是填充兩個(gè)方法了,首先是init()方法
它大概可以分為4步
加載配置文件掃描controller包初始化controller初始化Handler映射器(Handler = controller + method)那我們開(kāi)始吧,寫加載配置文件的代碼
1.加載配置文件首先,我們?cè)谶@里選用properties文件的形式進(jìn)行配置,因此,需要有一個(gè)properties對(duì)象
/*** 我們將需要掃描的包放在一個(gè).properties文件中* 需要在初始化的時(shí)候讀取它*/private Properties properties = new Properties();再寫一個(gè)工具性的方法/*** 加載配置文件* @param fileName*/private void loadConfigfile(String fileName) throws IOException {//以流的方式獲取資源InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(fileName);properties.load(resourceAsStream);resourceAsStream.close();}之后,我們?cè)趇nit()中調(diào)用該方法@Overridepublic void init(ServletConfig config) throws ServletException {//1. 加載配置文件//這里我們?cè)趙eb.xml中配置的初始化參數(shù)contextConfigLocation就起到效果了String initParameter = config.getInitParameter("contextConfigLocation");try {loadConfigfile(initParameter);} catch (IOException e) {e.printStackTrace();}}那么至此,我們的第一步加載配置文件部分的代碼就寫完啦
另外三步采用同樣的思路
2.掃描controller包定義所需屬性
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 出新的治理框架 阿富汗總統(tǒng)加尼弟弟宣誓效忠塔利班
- 網(wǎng)頁(yè)前端開(kāi)發(fā) 前端快速開(kāi)發(fā)框架有哪些
- 詳解ajax框架作用 ajax框架教程
- 簡(jiǎn)單快速構(gòu)建后臺(tái)管理系統(tǒng) 后臺(tái)模板框架的模板
- struts2和springMVC的區(qū)別 struts2配置文件詳解
- 十個(gè)前端UI優(yōu)秀框架 前端ui框架有哪些
- 基于ssm框架的圖書(shū)管理系統(tǒng) 網(wǎng)站框架模板代碼
- 單點(diǎn)登錄失敗解決措施 單點(diǎn)登錄框架有哪些
- java開(kāi)發(fā)常用的框架 java框架都有哪些
- 免費(fèi)google賬號(hào)注冊(cè) google服務(wù)框架安裝
