servlet的调用过程是这样的,在浏览器的页面中输入servlet的映射地址如:http://localhost:8081/area_demo/loadProv
请求servlet-mapping标签下url-parttern名为/loadProv的servlet的.java类。通俗的讲,虽然.java是这是一个类,但是也可以看做是一个请求的页面或者更准确的说是一个服务窗口(就像我们现实中行政审批大厅当中某个单位的服务窗口一样,它虽然没有门脸(也就是前端的显示页面),但是它的功能跟有前端显示页面的页面是一样的,都能够实现某个服务。),因此它是服务器端的一个功能窗口,也需要请求,也是就request。所以输入上面的地址,实在请求这个.java功能窗口。
下面我们给出一个简单的demo代码:


这是上面这个地址所请求的.java类的代码,这里doPost方法访问service层,service层访问Dao层,并在数据库取出了省的名称,并封装在List<Area>的provList中,那么问题来了。既然provList是服务器响应回来的内容,那么下面的代码为什么是req.SetAttribute("","")呢?为什么是req呢也就是request呢?不应该是response吗?
产生这个疑问是因为没有把.java这个"功能窗口"与.jsp这个“功能页面”分开。认为.java是.jsp页面后台代码,他们是一个属于同一个功能页面,这样的认识是全完错误的。其实他们完全是两个独立的“单位”。需要单独的去请求和响应。因此,这里用req就很明白了,这是因为在.java这个“窗口”中prolist有两个身份,它是服务器response给.java的内容。同时也是.java请求.jsp的request的内容。那么在这里用req.setAttribute("","")的原因就很明确了。
这不就跟我们去办事大厅的窗口去办事完全是一个道理吗?我们把材料提交给窗口,窗口将材料中的内容填写好后,再返回给我们,要我们拿着材料去下一个单位去办理后续的事项,那么这个材料,就是我们窗口返回给我们的内容,同时也是我们去请求下一个单位的内容。其中的内容发生了变化,身份也产生了变化。
既然是下一个页面的请求内容,那么在下一个页面中,我们就能够用JSTL在页面中取到它的值了。如下图:

本文解析了Servlet的请求过程及响应机制,通过一个具体的示例详细解释了如何通过URL映射请求特定的Servlet,以及如何理解Servlet作为服务器端功能窗口的角色。同时,探讨了在Servlet中使用request对象而非response对象的原因。
960

被折叠的 条评论
为什么被折叠?



