要手写SpringMVC IOC就要先对SpringMCV 的后台模式有个了解,首先是根据web.xml配置最关键的DispatcaherServlet,DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点。SpringMVC 实现WEB访问的顺序如下:
在访问时,先由DispatcherServlet 获取到请求,然后去容器中寻找所对应的具体请求类和方法。
要想实现上面的内容,所以要新建一个Maven Web Project 具体的实现方法自行百度。
由于是要实现Servlet,所以要在POM 文件需要引入一个jar包:
javax.servlet
servlet-api
2.5
web.xml配置如下:
从配置中可以看到 ,我新建的是application.properties,并非之前的application.xml ,也是为了和之前的区分开。
下面开始准备搭建项目框架,Spring MVC是如何区分层次和逻辑的呢,很明显是利用的注解,常用的注解有这几个:
@Controller(在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示)
@RequestMapping (RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。)
@AutoWired(注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用)
@Service
@RequestParam(主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。)
springMCV 常用注解详细说明如下:点击打开链接
所以我也对应创建了这几个注解,Controller注解内容如下:
package com.zyx.demo;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ZyxController {
String value() default "";
}
Documented 注解
Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。
Target 注解
Target Annotation表示的是这个Annotation可以应用在哪里,是对Annotation应用的限制,如果没有这个标识的话,Annotation可以用在任何地方,比如类上,方法上,变量、属性上等,可以从java.lang.Enum.ElementType这个枚举里选择 ElementType。
Retention注解
Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:
1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
其余的所有注解都按照Controller差不多的写法,注意好修改target。
下面开始搭建项目,我自己搭建的目录结构如下(请忽略项目报错):
两个action处理不同的请求,Service做对应的请求处理,action代码如下:
package com.zyx.demo.mvc.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zyx.demo.service.IDemoService;
import com.zyx.mvcframework.annotation.ZyxAutowired;
import com.zyx.mvcframework.annotation.ZyxController;
import com.zyx.mvcframework.annotation.ZyxRequestMapping;
import com.zyx.mvcframework.annotation.ZyxRequestParam;
@ZyxController
@ZyxRequestMapping("/demo")
public class TestAction {
@ZyxAutowired IDemoService demoService;
@ZyxRequestMapping("/edit.json")
public void edit(HttpServletRequest request, HttpServletResponse response, @ZyxRequestParam("name") String name) {
System.out.println(demoService.sayHello(name));
}
}
service代码:
package com.zyx.demo.service.impl;
import com.zyx.demo.service.IDemoService;
import com.zyx.mvcframework.annotation.ZyxService;
@ZyxService
public class DemoService implements IDemoService{
@Override
public String sayHello(String name) {
System.out.println("DemoService : hello "+name+"!");
return "hello";
}
}
其中Controller和Service对应引入相应的Annotation。
下面开始进入最重要的环节啦!手写DispatcherServlet!
放在第二节
注明:本人尽量把感悟和想法贴出来,但是由于平时上班时间忙,没时间更新,还望见谅(尬聊QQ 1004811281)。