草庐IT

三,手写SpringMVC框架,第三次改进

lijili 2023-03-28 原文

1 .解决跳转问题:添加一个login方法,跳转返回一个字符串。

 

中央控制器DispacherServlet调用EmpController,所以字符串返回给中央控制器。如下图所示:中央控制器帮我们统一的做 资源的转发(forward/include) 重定向。

1.1 更新 EmpController代码

1.2 更该 DispatcherServlet 代码

 

 

 

 

 

 

 

 1.3 演示效果:

 

 

现在XxxController已经算一个普通的POJO类了,但是还是和Servlet耦合,方法的参数中还有HttpServletRquest

 

2 删除XxxControler中各方法中的response

 

改动了跳转后,就可以删除XxxController中的各个方法的中的HttpServletResponse参数了。

 

2.1 EmpController代码

 

 

 

 

 

下一步,我们改动传参。

几乎每个方法中,都有request.getParameter(“xxx”);方法,我们需要将该方法删掉,变成参数,让XxxController不要依赖Servlet 。

3.1 EmpController 代码

 

3.2 变成参数后,谁给我们传参?

将获取参数的过程 — request.getParameter(“xxx”),统一抽取到中央调度器DispatcherServlet中,来统一获取请求参数

如果在EmpController中写个delete方法参数名叫什么?如果写一个insertupdate方法呢,每个方法的参数都不一样。所以我到底要获取哪些参数是,根据当前这个方法的方法签名来决定的

3.3 DispatcherServlet添加统一获取请求参数的代码。

 

 

 

访问测试:http://127.0.0.1:8080/mymvc3/emp.do?ac=login

 

 

 报错:

 

 

因为EmpController的方法中没有,HttpServletRequestHttpServletResponse了。那么这句代码就无法获取到了。

 

 

 

3.4 修改DispatcherServlet代码

 

修改代码,通过反射机制获取所有的方法。然后只根据方法名来做判断。

 

 

 

 

3.5 测试:模拟登录

 

 

 

 

 

 

这么写,获取方法的参数的名字是arg0arg1……,并不能获取真实的方法名。

3.6 要想获取真实的参数名称需要加参数重新编译代码

JDK8.0开始,有一个反射的新特性,可以获取到参数的方法的名字。做一个小的设置。

java中获取接口(方法)中的参数名字(eclipse设置编译参数)java8 javac –parameters

 

 

这个就表示JVM虚拟机在编译的时候,所得到的Class文件里面就带有形参的名称了。

重新编译项目,debug运行。

 

 

 

 

 

 

再次debug运行看到已经获得了方法的参数的实际的名称。

 

 

3.6.1 maven工程如何更方便的设置?

3.7 修改DispatcherServlet代码

 

 

3.8 invoke进行调用的时候就不能传递requestresponse了。

 

 

3.9 修改EmpController代码,并新增delete删除方法

3.10 代码测试:

http://127.0.0.1:8080/mymvc3/emp.do?ac=login&ename=fbb&pwd=123456

http://127.0.0.1:8080/mymvc3/emp.do?ac=login

 

 

 

 

 

 

 

 

3.11 访问EmpControllerdelete方法,出现的错误:

 

访问:http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1  报错:

 

 

 

 

 

EmpControllerdelete方法的参数需要的是一个Integer类型,

通过反射机制我们该方法需要的类型ParameterInteger

但是前台传递到后台的是字符串”1”,而不是数字1,所以需要进行类型转换。

3.12 测试3.3.12问题,修改DispatcherServlet中的代码

 

 

 

 

3.13 解决3.3.12问题,再次修改DispatcherServlet中的代码

 

 

 

3.14 再次测试代码,成功。

http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1

 

                       DispatcherServlet中的完整代码

 

 

3.15 小结:对应的版本mymvc3

写到着,我们的Xxx只需要考虑,业务功能即可,不需要考虑如何获取参数,资源的跳转问题。那么之前所写的重复的,请求参数的获取和 请求转发或是重定向都不要了。关注业务即可。

 jackson jar包

 

有关三,手写SpringMVC框架,第三次改进的更多相关文章

  1. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  2. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  3. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  4. ruby-on-rails - 我可以用鸭子类型(duck typing)改进这种方法吗? - 2

    希望我没有误解“ducktyping”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。代码如下:defconvert_hash(hash)ifhash.keys.all?{|k|k.is_a?(Integer)}returnhashelsifhash.keys.all?{|k|k.is_a?(Property)}new_hash={}hash.each_pair{|k,v|new_hash[k.id]=v}returnnew_hashelseraise"CustomattributekeysshouldbeID'sorPropertyo

  5. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  6. ruby - 自动将院子文档框架添加到现有的 Rails 遗留代码中 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我希望能够将模板化的YARD文档样式注释插入到我现有的Rails遗留应用程序中。目前它的评论很少。我想要具有指定参数的类header和方法header(通过从我假定的方法签名中提取)和返回值的占位符。在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档header注释。在带有Ducktyping等的Ruby中,我确信诸如@params等类型之类

  7. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  8. python - Ruby 是否有相当于 Python 的扭曲框架作为网络抽象层? - 2

    据我了解,Python的扭曲框架为网络通信提供了更高级别的抽象(?)。我正在寻找在Rails应用程序中使用与twisted等效的Ruby。 最佳答案 看看EventMachine.它不像Twisted那样广泛,但它是围绕事件驱动网络编程的相同概念构建的。 关于python-Ruby是否有相当于Python的扭曲框架作为网络抽象层?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/9

  9. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  10. ruby - 需要帮助改进 Ruby DSL 以控制 Arduino 控制的饮料分配器(bar monkey) - 2

    我正在用Ruby编写DSL来控制我正在处理的Arduino项目;巴尔迪诺。这是一只酒吧猴子,将由软件控制来提供饮料。Arduino通过串行端口接收命令,告诉Arduino要打开什么泵以及打开多长时间。它目前正在读取一个食谱(见下文)并将其打印出来。串行通信的代码以及我在下面提到的其他一些想法仍然需要改进。这是我的第一个DSL,我正在处理之前的示例,所以它的边缘非常粗糙。任何批评、代码改进(是否有任何关于RubyDSL最佳实践或习语的良好引用?)或任何一般性评论。我目前有DSL的粗略草稿,因此饮料配方如下所示(Githublink):desc"Simpleglassofwater"rec

随机推荐