一、实验内容整理
1. 为什么从request中获取session?
疑问:客户端请求服务器,服务器开辟一块Session空间,创建Session对象。所以Session是由服务器产生的,但是获取Session却是Request对象的方法,所以产生的疑惑。
解答:通过查资料了解到Session产生和使用的完整过程:
(1)服务器第一次接到请求,创建Session对象,同时生成一个sessionId
(2)服务器通过响应头的Set-Cookie:JSESSIONID=xx,向客户端发送要求设置Set-Cookie的响应
(3)客户端再本机设置一个JSESSIONID=xx的Cookie信息,客户端每次向同一个网站发送请求时,请求头都会带上该Cookie信息,浏览器通过读取请求头中的Cookie信息,获取名为JSESSIONID的值,得到此次请求的sessionId。
总结(个人理解):session依赖于Cookie,sessionId保存在客户端的Cookie中,通过sessionId查找服务端的session信息。
反思:学习知识时不能只了解一个大概不深究,这样就会留下很多理解并不透彻的地方,就不能很好的运用,所以以后学习的时候一定要多问问自己为什么。
2. 请求转发与重定向的区别?
疑问:同样是资源跳转,为什么请求转发使用request对象,重定向使用response对象?
解答:
请求转发:客户端发送一个请求到服务器,服务器发现匹配的OneServlet,并指定它去执行。当这个servlet执行完之后,它要调用getRequestDispacther()方法,并使用forward()将request,response作为参数传递给TwoServlet,最后响应到浏览器中。整个过程是一个请求,一个响应。
重定向: 客户端发送一个请求到服务器,服务器匹配OneServlet,servlet处理完之后调用response的sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端必须要再发送一个请求,去访问TwoServlet。所以客户端按照要求发请求TwoServlet,这两个请求互不干扰,相互独立。重定向是两个请求,两个响应。
总结(个人理解):重定向需要告诉客户端重新发一个请求,所以需要response将这个要求传回客户端,所以sendRedirect()必须是response的方法才能达到这种效果。而请求转发只有一次请求,所以getRequestDispacther()必须是request的方法,才能只发一次请求就能达到转发的效果。
反思:学习时通过画图能很好的理解整个流程,在以后可以多使用这种方法。
3. JSP的本质是servlet,那么JSP是如何编译成servlet的呢?
解答:WEB容器接收到以.jsp为扩展名的URL的访问请求时,它将把该请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
总结(个人理解):SP本质也是一个Servlet,只是JSP相当于把HTML代码写在Servlet里,Tomcat把这个JSP翻译成Servelt,原本写在JSP中的HTML代码就自动放在out.println()里面了,也就是说,JSP自动做了把HTML代码复制到Servlet里面这一步。
反思:理解一个技术为什么会出现,要从过去程序员在使用中的痛点出发,才能更好的理解JSP这种设计的出现,本质是为了让我们操作html代码更方便。
4. 映射路径的配置
1.精确匹配
精确匹配是指< url-pattern>中配置的值必须与 url 完全精确匹配。
<servlet-mapping><servlet-name>demoServlet</servlet-name><url-pattern>/demo.do</url-pattern></servlet-mapping>
2.扩展名匹配
在< url-pattern>允许使用统配符“”作为匹配规则,“”表示匹配任意字符。在扩展 名匹配中只要扩展名相同都会被匹配和路径无关。
注意,在使用扩展名匹配时在< url-pattern> 中不能使用“/”,否则容器启动就会抛出异常。
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3.路径匹配
根据请求路径进行匹配,在请求中只要包含该路径都匹配。“*”表示任意路径以及子路径。
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/suibian/*</url-pattern>
</servlet-mapping>
4.任意匹配
匹配“/”。匹配所有但不包含 JSP 页面
<url-pattern>/</url-pattern>
<!-- 匹配所有 -->
<url-pattern>/*</url-pattern>
5.优先顺序
当一个 url 与多个 Servlet 的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径 > 扩展名”这样的优先级匹配到对应的 Servlet。
6.实例分析
Servlet1 映射到 /abc/
Servlet2 映射到 /
Servlet3 映射到 /abc
Servlet4 映射到 .do
当请求 URL 为“/abc/a.html”,“/abc/”和“/”都匹配,Servlet 引擎将调用 Servlet1。
当请求 URL 为“/abc”时,“/abc/”和“/abc”都匹配,Servlet 引擎将调用 Servlet3。
当请求 URL 为“/abc/a.do”时,“/abc/”和“.do”都匹配,Servlet 引擎将调用 Servlet1。
当请求 URL 为“/a.do”时,“/”和“.do”都匹配,Servlet 引擎将调用 Servlet2。
当请求 URL 为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,Servlet 引擎将调用 Servlet2。
二、心得体会
通过这次上机实验深入理解了session的运作原理,通过画图深入理解了转发和重定向的区别,了解的映射路径的配置,复习了很多有些遗忘的内容,感觉比以前理解的更深入,很有收获。
