文档库 最新最全的文档下载
当前位置:文档库 › servlet相关总结

servlet相关总结

回顾:
1.servlet的生命周期
what:访问容器中的servlet时,servlet能够运行起来的过程
阶段:
阶段1:实例化(创建对象,只创建一个对象,可以访问的时候创建,也可以在容器启动时提前创建,如果是提前创建,在web.xml文件中添加如下配置:)
阶段2:初始化
请求到达容器后,容器创建req,res-->创建servlet对象-->容器会调用init方法-->为了给init方法传参,容器会提前创建好一个servletConfig对象.
为了servlet的运行所需要提前做的准备,都可以在init方法中进行.一般情况下不会重写有参的init方法,在GenericServlet中有一个无参的init方法,所以重写无参的init方法即可.
servletconfig对象用于读取在web.xml文件配置的初始参数.
参数的配置:



参数的读取:getInitParameter(name)
init方法只会执行一次
阶段3:就绪
容器调用servlet的service方法,来实现响应的具体操作.
service方法中,根据请求类型(get,post)进行分发,调用不同的方法(doGet,doPost).如果需要根据请求的种类来进行不同的响应,那么可以重写doGet或doPost方法,如果不需要区分请求的类型,重写service方法.但只要重写了service方法,doGet方法和doPost方法就失效了.
service可以被执行多次.
阶段4:销毁
容器根据自身的算法,删除servlet对象.删除之前容器会调用destroy()方法.将init方法中分配的资源在destroy方法中释放.
应用卸载时,一定会调用destroy方法.只会执行一次.
2.servlet的核心接口和类
servlet接口-->GenericServlet抽象类-->HttpServlet抽象类-->自定义的servlet类
3.servlet的线程安全问题
servlet是线程不安全的.可以使用同步的方式来解决,但是会影响效率.所以最好的解决方法是,不要再servlet中添加属性.
========================
jsp:
1.why?现有的servlet,编写过程中发现,用于输出显示的out语句增加的显示的难度,不利于控制.所以使用jsp技术将servlet中的out语句抽取出来.
2.what?
sun公司在制定的服务器端动态页面的组件规范.jsp页面中包含的内容是大量的html和少量的java代码
3.how?
step1:编写一个后缀为".jsp"的文件
step2:在文件中编写如下内容:
a)html代码(css,js)
编写规则:原来的html文件如何编写现在一样
b)java代码
i)小脚本 : <% %>
ii)表达式: <%= %>
c)隐含对象:在jsp页面中,由容器提前创建好的对象,直接拿来使用即可.
如:out,request,response (暂时记住3个)
d)指令:
语法:<%@指令名 属性名=属性值 %>
page指令:import属性用于导包
contentType属性
pageEncoding属性
include指令
taglib指令
e)注释

<%-- --%>
4.jsp的

运行原理?
jsp文件
--->(转义,翻译)java源文件
整个jsp页面变成一个servlet的service方法的内容
--->(编译).class
--->运行(执行service方法)得到最终的输出结果
5.转义jsp页面时的规则
a.page指令的import属性-->对应的import语句
b.page指令的contentType属性-->service方法中的response.setContentType
c.html标记-->变成service方法中的out.write()语句
d.<% %>-->原封不动的成为service方法里面的java代码
e.<%= %>-->变成service方法中的out.print语句
f.<%! %>--->成为转义完的servlet类的成员(属性,方法)
总结:整个jsp文件变成了一个servlet的类,代码都将变成service方法中的一部分.

5.转发
1.什么是转发?
答:一个组件未完成的工作交给另一个组件继续完成.例如:servlet收到请求后.获取数据(调用dao),讲数据交给善于展示的jsp组件
来继续完成显示工作(jsp可以继续使用表格显示)
2.如何实现转发?
答:1.绑定数据;
request.setAttribute(key,value);
request.getArrtibute(key);
2.获取转发;
request.getRequestDispatcher(pach).forward(request,response);
3.转发和重定向的区别;
重定向:客户端请求容器的资源A,A可以发回一个302的状态码和一个location的消息头,客户端收到302后,立即向location指向的位置发出请求.
转发:客户端发出请求服务器的资源A,A通知容器,由容器将控制权交给组件B继续完成后续的工作.
地址栏的变化:重定向后,地址栏会发生变化,转发后地址栏不会发生变化.
请求的资源:转发只能是应用内的资源,而重定向没有这个限制.
转发过程中涉及到的组件共享同一对request和response对象,而重定向不会.
什么时候用?
转发:一件事情没有做完,需要其他组件继续做
重定向:一件事情已经做完了,去做另外一件事
=============================
1.异常处理:
方式1:编程式
在catch中捕获异常之后,将异常信息绑定到request中,利用转发,跳转到指定的错误信息
显示页面来,显示绑定的说明信息;(单独设置一个跳转页面来显示异常信息,界面友好)
方式2:声明式
将异常信息抛给容器,提前通过在web.xml文件声明指定异常对应显示的页面之后,由容器
来完成在捕获异常之后的跳转
1.配置web.xml文件




2.将异常对象包装后抛出
throw new ServletException(e)
2.路径问题:
1.超链接:
2.表单:


3.重定向:response.sendRedirect();
4.转发:request.getRequestSispatcher();
相对路径:从当前页面出发,到达目标文件的所经过的路径,不易"/"开头
绝对路径:不管当前页面在什么位置,只要"/"开头,就会立即回到一个固定的位置,然后从这个固定的位置
出发到达目标文件

的路径,以"/"开头


相关文档