天天看点

Servlet生命周期以及路径的使用与选择

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”);

}