Spring Mvc手写笔记

最近跟着享学课堂的James老师手敲复习了下Spring MVC的内容,在自己本地做了截图,放上来留着当备忘录了,也一起分享下。没有直接上传最后调试的源码了,把做初哥敲的过程和中间问题的过程记录了一下都截图了,希望对你也有点帮助。也希望以后哪位大牛闲来带带升级?

编程前热身:

  1. Class<?> clazz = Class.forName(com.enjoy.james.service.impl.OrderServiceImpl); //类加载,将类加载为class对象,必须是包名+类名
  2. clazz.newInstance() //反射创建OrderServiceImpl实例
  3. A a = new A(); Class<?> clazz = a.getClass(); //根据实例拿到A类
  4. Field[] fields = clazz.getDeclaredFields(); //拿到类里面定义的所有属性\
  5. Method[] method = clazz.getMethods(); //获取类里的所有方法
  6. method.invoke(instance, args[]) //从底层调用方法,args[]方法里的参数数组
  7. 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地址输入。。。苍了个天。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值