一、servlet含义
处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西。
二、tomcat和servlet的关系
tomcat是web应用服务器,是一个servlet/jsp容器。tomcat作为servlet容器,负责处理客户请求,把请求传送给Servlet,并将servlet的响应传送给客户。而Servlet是一种运行在支持java语言的服务器上的组件。
1》:tomcat将http请求文本接受并解析,然后封装成HttpServletRequest类型的request对象,所有的Http头数据读可以通过request对象调用对应的方法查询到。
2》:tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器
java Servlet API 是Servlet(tomcat)和servlet之间的接口,它定义了serlvet的各种方法,还定义了servlet容器传送给servlet的对象类,其中最重要的就是servletRequest和serveltResponse。
三、servlet的原理
1》servlet的生命周期
servlet的生命周期主要有三个阶段:初始化--服务--销毁。
初始化:主要包括 加载、配置、创建实例 三部分。
加载:在客户端首次请求该servlet时,或者在web.xml配置该servlet属性<load-on-startup>1</load-on-startup> 则随着web服务器启动而加载。
配置:为每个servlet设置信息产生一个servletConfig对象;
创建:调用servlet接口的init()方法,并将产生的servletConfig对象当作参数传入。在servlet的生命周期中,仅执 行一次init()方法。它在web服务器装入servlet时执行,负责初始化servlet对象。同一个类型的servlet对象在web服务器中以单例的形式存在。
init()方法是servlet生命的起点,一旦加载了某个servlet,服务器将立即调用它的init()方法。
服务:每一次请求来到容器时,会产生Httpservletrequest与httpservletResponse对象,并作为参数传给service()。
service()负责响应客户的请求。每当一个客户请求一个httpServlet对象,该对象的service()方法就要被调用,而且传递给这个方法一个“请求”(servletRequest)对象和一个“响应”(servletResponse)对象作为参数。然后该方法自动进行匹配(根据request类型),调用doGet()或doPost()方法来处理请求。
销毁:在服务器端停止且卸载servlet时调用destroy(),释放占用的资源。
四、servletConfig、servletContent、request、response对象
1》:servletConfig
获取途径:getServletConfig();
功能:getServletName();//获取servlet的名称,也就是在web.xml中配置的servlet-name
getServletContext();//获取ServletContext对象
getInitParameter(String);//获取在servlet中初始化参数的值
getInitParameterNames();//获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。
2》ServletContext对象
获取途径:getServletContext();
getServletConfig.getServletContext();
功能:tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗讲,就是一个web项目,就存在一个servletContext实例,每个servlet读可以访问到它。
1.web项目中共享数据:getAttribute(String name)通过指定名称获得内容、setAttribute(String name,Object obj)在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到、removeAttribute(String name)通过指定名称移除内容
2.整个web项目初始化参数 //这个就是全局初始化参数,每个servlet中都获取到该初始化值
getInitParameter(String name)//通过指定名称获取初始化值
getInitParameterNames()//获得枚举类型
3.获取web项目资源
3.1获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")
3.2获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(String path)
3.3 getResourcePath(String path) 指定路径下的所有内容
3》request对象
request就是将请求文本封装而成的对象,所以通过request能获得请求文本中的所有内容、请求头、请求体、请求行
3.1请求行内容获取
3.1.1统一资源标记符
request.getRequestURI();
3.1.2 统一资源定位符
request.getRequestURL();
3.1.3 协议和版本
request.getScheme();
request.getProtocol();
3.1.4主机(域名)
request.getServerName();
3.1.5端口
request.getServerPort();
3.1.6 发布到tomcat下的项目名称
request.getContextPath();
3.1.7 servlet路径
request.getServletPath();
3.1.8 所有请求参数
request.getQueryString();
3.1.9 远程主机的ip地址
request.getRemoteAddr();
2.请求头的获取
3.2.1获取指定头内容String
String request.getHeader(String name)
3.2.2获取指定头内容Date
Long request.getDateHeader(String name)
3.2.3获取指定头内容int
Int getIntHeader(String name)
3.2.4获取指定名称所有内容
Enumeration getHeaders(String name)
3.请求体的获取
3.3.1获取指定名称,一个请求参数值
String request.getParameter(String name)
3.3.2获取指定名称,所有请求参数值,如:checkbox、select等
String [] request.getParameterValues(String name)
3.3.3 获取所有的请求参数
Map<String,String[]> request.getParameterMap();
4.请求转发
request.getRequestDispatcher(String path).forward(request,response);
path:转发后跳转的页面,这里不管用不用“/”开头,都是已web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,所以这里一直都是从web项目根下开始的,
web项目根:
开发: D:\Workspaces\test\WebRoot\...
运行时: D:\tomcat\apache-tomcat-7.0.5\webapps\test\..
web站点根:
运行时: D:\tomcat\apache-tomcat-7.0.5\webapps\..
4》response对象
重定向
方式一:手动方案
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","http://www.ourpyw.com");
方式二:使用封装好的,通过response.sendRedirect("http://www.ourpyw.com") 服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器的地址中url会变,浏览器重新发起一个请求到另一个页面,所以request是重新发起的,跟请求转发不一样。
第一种:response.sendRedirect("/test/MyServlet");
//使用了“/”开头,说明是从web站点根开始,所以需要写test/MyServlet
第二种:response.sendRedirect("MyServlet");
//没有使用“/”开头,说明是从web项目根开始,那么就无需要写test了。
重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用“/”区分开来,如果使用了“/”开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用“/”开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。
五、RequestDispatcher对象
1.javax.servlet.ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。
2.javax.servlet.ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。
3.使用javax.servlet.ServletContext的getNameDispatcher(String name)得到名为name的一个web资源,包括Servlet和JSP页面。
web.xml配置
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/firstservlet/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet/secondservlet/</url-pattern>
</servlet-mapping>
</web-app>
FirstServlet和SecondServlet对应的类分别为ServletOne和ServletTwo
通过浏览器链接访问http://127.0.0.1:8081/servlet/firstservlet/
使用方法1:
RequestDispatcher rd = request.getRequestDispatcher("secondservlet");
rd.forward(request,response);
使用方法2:
RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/secondservlet");
rd.forward(request,response);
使用方法3:
web.xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:
RequestDispathcer rd = getServletContext().getNamedDispathcer("SecondServlet");
rd.forward(request,response);