Servlet

一、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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值