最近跟着享学课堂的James老师手敲复习了下Spring MVC的内容,在自己本地做了截图,放上来留着当备忘录了,也一起分享下。没有直接上传最后调试的源码了,把做初哥敲的过程和中间问题的过程记录了一下都截图了,希望对你也有点帮助。也希望以后哪位大牛闲来带带升级?
编程前热身:
- Class<?> clazz = Class.forName(com.enjoy.james.service.impl.OrderServiceImpl); //类加载,将类加载为class对象,必须是包名+类名
- clazz.newInstance() //反射创建OrderServiceImpl实例
- A a = new A(); Class<?> clazz = a.getClass(); //根据实例拿到A类
- Field[] fields = clazz.getDeclaredFields(); //拿到类里面定义的所有属性\
- Method[] method = clazz.getMethods(); //获取类里的所有方法
- method.invoke(instance, args[]) //从底层调用方法,args[]方法里的参数数组
- Request.getRequestURI(); //获取请求路径,比如路径为 ./james-springmvc/order/buy
语言:JAVA,工具:Eclipse IDE JDK版本:java version "1.8.0_191"
创建springmvc工程:
此时因为打成了war包,是一个web项目,需要有一个web.xml文件,所以报错“web.xml is missing and <failOnMissingWebXml> is set to true”,此时可以选择工程,右键,选择“JAVA EE Tools --> Generate Deployment Descriptor Stub”创建即可
为防止打包时引用的api冲突报错,使用作用域标签<scope>provided</scope>,声明打包时使用自己的JDK
创建一个包,里面放入我们工程内可能要用到的各种注解
在新建的包下面创建一个类,类名为了与系统的Autowired区分,取名为EnjoyAutowired
由于该类的目的是创建注解,因此需要将声明内的class修改为@interface
在注解上有3个变量
同一路径下新建另一个控制类注解EnjoyController
同一路径下新建第三个注解EnjoyRequestMapping
同一路径下新建第四个注解EnjoyRequestParam
同一路径下新建第四个注解EnjoyService
创建一个包controller,作为控制层
创建控制文件,完成文件后可先不考虑该文件内容。
继续创建新的Service包,并创建Service接口文件,在其中定义方法
在Service包下创建impl包,在里面创建Service接口的实现类
在该实现类中实现之前我们自己声明的注解
由于我们声明的@EnjoyService注解中存在value,即其后可带参数
到此,Service的内容基本上完成,接下来需要进行controll的编辑。在前面创建的JamesController.java内新增注解和路径
在JamesController.java内注入声明的JamesService
写实现方法
如果遇到上图的报错,则需检查对应的注解文件中所声明的作用范围是否正确,将其修正为 PARAMETER
至此,该工程基础框架搭建完成
创建底层的servlet,建包,并新建DispatcherServlet类
在web.xml内配置HttpServlet参数,加载DispatcherServlet
加载servlet-Mapping,配置对请求的路径拦截
同时加上一句话,以达到在初始化的时候将init方法进行加载
此时完成web.xml的配置后,对DispatcherServlet.java进行编写。第一步我们需要进行路径文件的扫描,获取路径下的所有class文件
第二步,根据当前的class类,创建实例化对象
第三步,对注解进行依赖注入
接下来还剩下url的内容还没有进行编辑,需要将方法和地址进行映射关联。
到此,初始化部分的内容编写完成,接下来到和业务相关的内容。我们可知,通常的调用顺序可以理解为127.0.0.1:8080/xxx/xxxx/ --> 转到servlet --> 转到doPost --> 调用method,我们在此先写doPost的内容
里面的hand方法实现参数处理
doPost的内容编辑完成,我们可以设置下Tomcat测试一下。观察你的控制台是否有Servers页,如果有,可以直接点击它的提示进行新增Tomcat配置
选择Tomcat服务点击启动,我的默认端口8088
查看控制台是否存在报错,如果存在,进行日志跟踪
启动时出现“java.lang.ClassNotFoundException: com/enjoy/[Ljava/lang/String;@297471b7james”的问题,结合控制台日志,该问题是由于找不到类的来源所导致,往上检查来源(文件夹/文件路径)处理部分scanPackage函数,排查是否路径处理时出现问题
scanPackage函数内71行,filesStr此时是一个包含了文件和文件夹的list,我们要对一个全路径进行扫描,因此应该加上的是它的前缀部分,应该使用fileStr
观察工程,发现有这个错误的提示“An error occurred while filtering resources”
解决方法:选择工程-->右键”Maven”-->Update Project...-->在弹出的对话框内勾选对应的工程
点击OK后工程刷新,问题解决。
修改后保存,重新启动Tomcat,显示启动正常。
打开浏览器,输入http://127.0.0.1:8088/james-mvc/james/query?name=zhang&age=20尝试是否可以正常显示
如果出现打不开的情况,再试下
此时二者都不行的话,有可能是因为eclipse将tomcat的项目发布目录(tomcat 目录中的webapp)重定向了,所以你会发现在tomcat安装目录下的webapp目录里面找不到你的项目文件。此时我们可以重新配置下tomcat服务器:
在eclipse的控制台中的server页中,双击tomcat服务,显示
可以看到红圈中选择的是 Use workspace metadata(does not modify Tomcat installion),而它此时无法进行修改,所以我们必须得先把tomcat中的部署的服务都移除。
通过右键单击tomcat服务器选择 Add and Remove,在弹出的对话框中移除已部署的项目。移除完确定后,将看到上面的选项面板部分可编辑了。
如果移除以后还是不能编辑的,可以考虑直接将该tomcat服务删除,然后重新配置服务
重新进行tomcat服务配置
建立服务后,双击服务,进行配置修改,选择Use tomcat installation(Task control of Tomcat installation) 即选择tomcat的安装目录来作为项目的发布目录
然后,下来看到"Deploy Path"位置,它后面的值默认是"wtpwebapps", 把它改成"webapps", 也就是tomcat中发布项目所在的文件夹名字。
修改后关掉该页面,保存配置。这样就将项目部署到了tomcat安装目录下的webapp。重启tomcat服务器
访问http://localhost:8088 可以正常访问
输入http://127.0.0.1:8088/james-mvc/james/query?name=zhang&age=20尝试是否可以正常显示
此时还是无法正常访问,尝试使用http://localhost:8088/james-mvc/james/query?name=zhang&age=20进行访问
此时控制台输出报错:java.lang.reflect.InvocationTargetException(反射异常)
往下看日志提示,在JamesController.java文件内进行错误检查,文件中第27行出现空指针异常错误(java.lang.NullPointerException)
name和age的值依赖于jamesService的实现方法JamesServiceImpl内开始注入到系统map中的value值,我们在JamesServiceImpl.java中通过@EnjoyService将key值(JamesServiceImpl)放到了map中,此时要根据注解进行值的注入则需要通过@EnjoyAutowired的key值进行依赖查找,检查代码该key值首字母拼写错误,对齐进行修正
重启Tomcat服务,在浏览器内输入http://localhost:8088/james-mvc/james/query?name=zhang&age=20进行访问
界面上可以正确显示结果。然后在该浏览器上输入http://127.0.0.1:8088/james-mvc/james/query?name=zhang&age=20
额。。。使用IP访问还是不行,然后再重新检查一次配置后,并没有发现问题,想着会不会是浏览器的兼容性问题,然后换一个浏览器,进行IP地址输入。。。苍了个天。。。