Servlet的生命周期
1.类加载
(1)用户在客户端请求某个serlet:http://localhost:8080/servlet/LifeServlet
(2)Tocat截取servlet路径:/servlet/LifeServlet,并且在web-xml中查找
/servlet/LifeServlet
(3)如果没有找到,404错误;
如果找到了,直接找到对应的类
(4)获取Servlet的完整路径字符串
(5)获取类的结构信息
2.实例化
Clazz.newInstance();//得到一个类对象
3.初始化(init())
Method initMethod = Clazz.getMethod(“init”,ServletConfig.class)
initMethod.invoke(servlet,var1)
4.服务(servlet())
Method serviceMethod =
clazz.getMethod(“service”,ServletRequest.clazz,ServletResponse.class);
serviceMethod.invoke(servlet,request,response);
5.销毁(destory())
Method destoryMethod = clazz.getMethod(“destory”);
DestoryMethod.invoke(servlet);
注意
1.Servlet的声明周期由Tomcat来完成
2.Servlet的声明周期中实例化和各个方法的调用离不开反射
3.加载类不能忽略
4.什么时候加载类和实例化
情况1:饿汉模式(启动项目的时候会自动的加载类和实例化)
1
情况2:懒汉模式(第一次请求该Servlet的时候才类加载和实例化)
绝对路径
根路径:相对于服务器
相对路径:
1.相对于当前文件自身
2.相对于基准路径
基准路径的写法:
“Http://localhost:8080/myservlet1/servlet/LoginServlet”
<%
String basePath
= request.getScheme()+”?/”+request.getServerName()+”:”+request.getServerPort()+
Request.getContextPath+”/”;
%>
路径的选择
1.访问其他服务器的资源,只能使用绝对路径
2.访问当前服务器的其他项目,建议使用根路径
3.访问当前服务器的当前项目,建议使用相对路径
建议使用相对与基准路径
以上路径的使用范围只使用与HTML
不适用与JSP路径
转发
重定向
文件包含
转发与重定向的共同点:都实现了跳转,都跳到了下一个资源,并且都是程序控制的
转发与重定向不同点:
1.语句不同
Request.getRequestDispatcher().forward()
Response.sendRedirect()
2.跳转后的地址栏路径不同
转发:跳转之前地址
重定向:跳转之后的地址
3.是否可以共享同一个request的数据
转发可以
重定向不可以
4.原理不同
5.效率高低
转发效率高
6.跳转范围
转发:只限于当前项目(最大也就是当前服务器)
重定向:可以重定向到互联网的任意位置
7.路径的不同:
绝对路径
转发不支持绝对路径(转发只能在当前服务器下)
绝对路径支持
根路径
转发/代表当前项目 应用
重定向/代表当前服务器
相对路径
只能相对于当前文件自身,不能相对于基准路径(在java类里不能添加<base href=>标签)
转发和重定向时使用哪个路径?
1.要跳转到其他服务器,必须使用重定向,也必须使用绝对路径
2.要跳转到当前服务器,建议使用根路径
重定向:建议使用request.getContextPath()动态获取上下文路径
转发:指定在当前项目转发,/代表当前项目的根路径
跳转时到底该用转发还是重定向:
某些情况别无选择
希望前后两个组件共享request数据,只能选择转发
跳转到同一个应用的WEB-INF目录下只能用转发(WEB-INF不能出现在Browser的地址框中)
跳转到不同的应用只能用重定向
使用Cookie存储数据需要使用重定向
跳转到同一个应用,那种方式好
使用转发效率高,尽量使用转发
使用转发需要解决提交问题,尤其是添加操作
注销之后一般用重定向
连续表单页面之间建议使用重定向,避免属性冲突
转发是把请求在服务器端来回传递,因为是同一个请求所以可以共享请求中的数据,然而这一切客户端并不知道,它只是得到了最后的响应结果
重定向是将产生的响应再传给客户端,客户端收到302的状态码,自动再次发送请求, 因为不是一个请求所以不可以共享请求数据。
请求与相应
public class MoreServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//关于请求头的更多信息
//请求头
String userAgent = request.getHeader(“User-Agent”);
System.out.println(userAgent);
//关于表单数据
// String username = request.getParameter(“username”);
// String [] hobby = request.getParameterValues(“hobby”);
// System.out.println(Arrays.toString(hobby));//将数组输出
//服务器和客户端的地址
//远程指的客户端
System.out.println(request.getRemoteHost());//客户端主机名
System.out.println(request.getRemoteAddr());//客户端地址
System.out.println(request.getRemotePort());//客户端端口
//本地指的是服务器端
System.out.println(request.getLocalName());//本地名
System.out.println(request.getLocalAddr());//本地地址
System.out.println(request.getLocalPort());//本地端口
//url地址 eg:http;//192.168.141.145:8080/form/servletLogin/MoreServlet?username=sxt&hobby=art
System.out.println(request.getScheme());//http协议
System.out.println(request.getServerName());//地址196.168.141.145
System.out.println(request.getServerPort());//8080
System.out.println(request.getContextPath());//模块名
System.out.println(request.getServletPath());//从上下文开始(模块名,不包含模块名)到?之前
System.out.println(request.getRequestURL());//从http开始包含http
System.out.println(request.getRequestURI());///form/servletLogin/MoreServlet
System.out.println(request.getQueryString());//查询字符串?以后username=sxt&hobby=art
//获取Servlet的其他对象
Cookie [] cookies = request.getCookies();
HttpSession session = request.getSession();
ServletContext context = request.getServletContext();
// ServletContext context = this.getServletContext();
//关于响应的更多内容
//已经学习的内容
// response.sendRedirect("");//重定向
// response.setContentType(“text/html;charset=utf-8”);//动态网页 响应Ajax请求时使用 解决网页乱码问题
// PrintWriter out = response.getWriter();//动态网页中使用 响应 Ajax请求使用
//
response.setHeader(“key1”,“value1”);
response.setHeader(“key1”,“value1”);
response.addHeader(“key2”,“value1”);
response.addHeader(“key2”,“value2”);
//下载
response.setContentLength(1024);
// response.setContentType(“img/jpeg”);
response.setHeader(“Content-Type”,“img/jpeg”);
response.setHeader(“Content-Disposition”,“attachment;filename=logo.jpg”);
}