现有的问题
在之前的案例里,以展示所有用户为例,调用业务逻辑和显示结果页面都在同一个servlet里
这样不符合单一职责原则、各司其职的思想,也不利于后续的维护
解决方法
于是我们把业务逻辑和显示结果相分离
在这个样例里,业务逻辑其实就这两行
现在我们把它们放到ShowAllAdminController类里面,由它来实现业务逻辑,注意这个类也要继承httpservlet,并重写两个方法,在get方法里调用我们的业务逻辑
然后我们把显示结果部分代码转至ShowAllAdminController类中,但值得注意的是,JSP类中已然没有admins,这该怎么办呢
JSP做的事情只有显示结果,但数据它是没有的,数据在哪呢,在ShowAllAdminController里
这个时候我们就会产生两个问题:
业务逻辑和显示分离后,如何跳转到显示结果的Servlet里?
业务逻辑得到的数据如何传递给显示结果的servlet?
这时就引出我们的转发知识了!
转发
转发的作用在服务器端,将请发送给服务器上的其他资源,以共同完成一次请求的处理。
页面跳转,可以在调用业务逻辑的servlet中:
request.getRequestDispatcher("/目标URL-pattern").forward(request,response);
这样我们就解决了第一个问题,客户端发送请求给的是A servlet,A通过请求的转发发送给了B,来共同完成一次请求,B就可以显示结果了。
这里我们注意forward表示的是一次请求,是在服务器内部跳转,可以共享一次request作用域中的数据
requset作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以有多次转发)
•存数据,以键值对的形式存储在request作用域中,key为string类型,value为object类型
request.setAttribute(key,value);
•取数据,通过string类型的key方位object类型的value
request.getAttribute(key,value);
现在我们回到第二个问题,在controller里面,我们就可以把数据存入request里面,然后通过转发跳转到JSP里面
然后我们就可以在JSP的servlet用request做一个数据的接收
大功告成,现在访问showAllController,成功显示数据
项目地址
https://github.com/Layton-sy/My_Servlet