Java Web(一) Servlet详解!!

  • 时间:
  • 浏览:8
  • 来源:五分时时彩_五分时时彩正规平台_五分时时彩平台网址

    这篇文章到上一篇,距离的怪怪的遥远呀,隔了最少有原来月把,上边在家过了个年,哈哈~ 现在重新始于英文英文拾起。

                                        --WZY

一、什么是servlet?

    防止请求和发送响应的过程是由一种 叫做Servlet的程序运行来完成的,假如有一天Servlet是为了防止实现动态页面而衍生的东西。理解你这个 的前提是了解咋样让 http协议的东西,假如有一天知道B/S模式(浏览器/服务器)。

    B/S:浏览器/服务器。 浏览器通过网址来访问服务器,比如访问百度,在浏览器中输入www.baidu.com,你这个 过后浏览器就会显示百度的首页,越来越你这个 具体的过程,步骤是咋样的呢?你这个 就了解一下http请求和响应了

                  

    请求,响应:通过给的链接应该并能知道这原来具体的内容

二、tomcat和servlet的关系

    Tomcat 是Web应用服务器,是原来Servlet/JSP容器. Tomcat 作为Servlet容器,负责防止客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种 运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品.

    从http协议中的请求和响应并能得知,浏览器发出的请求是原来请求文本,而浏览器接收到的也应该是原来响应文本。假如有一天在上边你这个 图中,并我想知道是咋样转变的,只知道浏览器发送过来的请求也越来越来太满request,亲戚亲戚朋友儿儿响应回去的就用response。忽略了其中的细节,现在就来探究一下。

              

      ①:Tomcat将http请求文本接收并解析,假如有一天封装成HttpServletRequest类型的request对象,所有的HTTP头数据读并能通过request对象调用对应的土法律依据查询到。

      ②:Tomcat同回会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就并能控制要输出到浏览器的内容,假如有一天将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

    Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种土法律依据,还定义了Servlet容器传送给Servlet的对象类,其中最重要的越来越来太满ServletRequest和ServletResponse。越来越来太满说亲戚亲戚朋友儿儿在编写servlet时,并能实现Servlet接口,按照其规范进行操作。

三、编写Servlet

    在前面,亲戚亲戚朋友儿儿假如有一天知道了servlet是什么,咋样么并能servlet?(为了实现动态网页,而都是显示静态网页,具体状况并能百度查查),tomcat和servlet的关系?等大间题。现在来手动编写原来Servlet。

    3.1、手动编写servlet。

      1、创建原来MyServlet继承HttpServlet,重写doGet和doPost土法律依据,也越来越来太满看请求的土法律依据是get还是post,假如有一天用不同的防止土法律依据来防止请求,

            

      2、在web.xml中配置MyServlet,咋样么并能配置?让浏览器发出的请求知道到达哪个servlet,也越来越来太满让tomcat将封装好的request找到对应的servlet让其使用。

            配置有一个东西。

                

            配置过后,浏览器是咋样通过亲戚亲戚朋友儿儿配置的信息来找到对应的servlet的。

                

            按照步骤,首先浏览器通过http://localhost:10001000/test01/MyServlet来找到web.xml中的url-pattern,这越来越来太满第一步,匹配到了url-pattern后,就会找到第二步servlet的名字MyServlet,知道了名字,就并能通过servlet-name找到第三步,到了第三步,也就并能知道servlet的位置了。假如有一天到其中找到对应的防止土法律依据进行防止。

       3、实验,验证上边配置成功。

               

            

    3.2、利用向导新建MyServlet

        你这个 就相对简单了,web.xml不必亲戚亲戚朋友儿儿手动配置,工具直接帮亲戚亲戚朋友儿儿自动配置了

            1、右击项目,在new选项所含直接新建servlet的选项

            2、配置MyServlet类中的信息

                

          3、配置web.xml中的servlet信息

                  

        4、查看MyServle01类中的代码和web.xml,其中的配置跟手动的配置是一样的,越来越来太满用图形化界面,让亲戚亲戚朋友儿儿更方便的创建servlet而产生的。

    3.3、详解创建servlet的原理

        1、servlet的生命周期是什么?

        2、咋样么创建的servlet是继承自httpServlet,而都是直接实现Servlet接口?

        3、servlet的生命周期中,并能看出,执行的是service土法律依据,咋样么亲戚亲戚朋友儿儿就只并能写doGet和doPost土法律依据呢?

        等你这个 系列的大间题,亲戚亲戚朋友儿儿都应该知道,而不应该就单纯的知道咋样配置和使用servlet?上边的大间题,一一来解答。

        1、servlet的生命周期是什么?

          服务器启动时(web.xml中配置load-on-startup=1,默认为0)假如有一天第一次请求该servlet时,就会初始化原来Servlet对象,也越来越来太满会执行初始化土法律依据init(ServletConfig conf)

          该servlet对象去防止所有客户端请求,在service(ServletRequest req,ServletResponse res)土法律依据中执行

          最后服务器关闭时,才会销毁你这个 servlet对象,执行destroy()土法律依据。

              

        2、咋样么创建的servlet是继承自httpServlet,而都是直接实现Servlet接口?

        3、servlet的生命周期中,并能看出,执行的是service土法律依据,咋样么亲戚亲戚朋友儿儿就只并能写doGet和doPost土法律依据呢?

          查看源码,httpServlet的继承形状。

             httpServlet继承GenericServlet。懂的人立马就应该知道,GenericServlet(通用Servlet)的作用是什么?最少的越来越来太满将实现Servlet接口的土法律依据,复杂化编写servlet的步骤。具体下面详解

                

             GenericServlet的继承形状,实现了Servlet接口和ServletConfig接口,

                    

             Servlet接口内容

                  

                从这里并能都看,Servlet生命周期的原来关键土法律依据,init、service、destroy。还有另外原来土法律依据,原来getServletConfig()土法律依据来获取ServletConfig对象,ServletConfig对象并能获取到Servlet的咋样让 信息,ServletName、ServletContext、InitParameter、InitParameterNames、通过查看ServletConfig你这个 接口就并能知道

             ServletConfig接口内容

                 

                其中ServletContext对象是servlet上下文对象,功能有越来越来太满,获得了ServletContext对象,就能获取大每段亲戚亲戚朋友儿儿并能的信息,比如获取servlet的路径,等土法律依据。

               到此,就知道了Servlet接口中的内容和作用,总结起来越来越来太满,原来生命周期运行的土法律依据,获取ServletConfig,而通过ServletConfig又并能获取到ServletContext。而GenericServlet实现了Servlet接口后,也越来越来太满明亲戚亲戚朋友儿儿并能直接继承GenericServlet,就并能使用上边亲戚亲戚朋友儿儿所介绍Servlet接口中的那有几个土法律依据了,能拿到ServletConfig,也并能拿到ServletContext,不过那样太麻烦,非要直接获取ServletContext,越来越来太满GenericServlet除了实现Servlet接口外,还实现了ServletConfig接口,那样,就并能直接获取ServletContext了。

              GenericServlet类的内容详解

                     

                看上图,用红色框框起来的越来越来太满实现Servlet和ServletConfig接口所实现的土法律依据,有9个,这很正常,假如有一天亲戚亲戚朋友儿儿并能发现,init土法律依据有原来,原来是所含参数ServletConfig的,原来否是参的土法律依据,咋样么原来 设计?这里并能知道其中做了什么事情,来看看这原来土法律依据分别做了什么事?

                init(ServletConfig config)

                      

                init()

                      

                原来成员变量config

                      

                getServletConfig()

                      

                通过这有几个土法律依据一块儿来讲解,首先看init(ServletConfig config)土法律依据,假如有一天非要init(ServletConfig config)中所含ServletConfig对象,为了方便并能在咋样让 地方并能直接使用ServletConfig对象,而不仅仅局限在init(ServletConfig config)土法律依据中,越来越来太满创建原来私有的成员变量config,在init(ServletConfig config)土法律依据中就将其赋值给config,假如有一天通过getServletConfig()土法律依据就并能获取ServletConfig对象了,你这个 并能理解,假如有一天在init(ServletConfig config)中,158行,还调用了原来init()土法律依据,假如有一天你这个 init()土法律依据是空的,什么读越来越,这是咋样么呢?你这个 意味是为了防止一件事情,当亲戚亲戚朋友儿儿并能在init土法律依据中做咋样让 别的事情,亲戚亲戚朋友儿儿想到的土法律依据越来越来太满继承GenericServlet假如有一天重写了init(ServletConfig config)土法律依据,原来 依赖,就破坏了原来 在GenericServlet类中init(ServletConfig config)写的代码了,也越来越来太满在GenericServlet类中的成员变量config会老要是null,无法得到赋值,假如有一天被重写了,就不必在执行GenericServlet中init(ServletConfig config)土法律依据中的代码。要想赋值,就并能在重写的init(ServletConfig config)土法律依据中调用父类的init(ServletConfig config)土法律依据,也越来越来太满super.init(ServletConfig config),原来 一来,就很不方便,怕有过回会忘了写这句代码,越来越来太满在GenericServlet类中增加原来init()土法律依据,过后并能在init土法律依据中并能初始化别的数据,只并能重写init()你这个 土法律依据,而非要去覆盖init(ServletConfig config)你这个 土法律依据,原来 设计,就好越来越来太满,不必在管init(ServletConfig config)你这个 其中的内容了。越来越来太满用出先咋样让 的大间题。

                service(ServletRequest req, ServletResponse res)

                      

                   原来抽象土法律依据,说明在GenericServlet类中并越来越实现该内容,越来越亲戚亲戚朋友儿儿想到的是,在它上边肯定还有一层,也越来越来太满还有原来子类继承它,实现该土法律依据,越来越来太满让亲戚亲戚朋友儿儿被委托人写的Servlet继承GenericServlet,并能被委托人写service土法律依据,那岂都是累死,假如有一天亲戚亲戚朋友儿儿并能都看,service土法律依据中的参数还是ServletRequest,ServletResponse。并越来越跟http相关对象挂钩,越来越来太满亲戚亲戚朋友儿儿接着往下面看。

           HttpServlet类详解

               继承了GenericServlet类,通过亲戚亲戚朋友儿儿上边的推测,你这个 类主要的功能肯定是实现service土法律依据的各种细节和设计。假如有一天通过类名并能知道,该类就跟http挂钩了。

                     

                关注service(HttpServletRequest req, HttpServletResponse resp)土法律依据和service(ServletRequest req, ServletResponse res)土法律依据。

                  service(ServletRequest req, ServletResponse res)土法律依据

                        

                    该土法律依据中就做一件事情,越来越来太满将ServletRequest和ServletResponse这原来对象强转为HttpServletRequest和HttpServletResponse对象。咋样么能原来 转?

                      首不能自己知道req、res是什么类型,通过打印System.out.println(req),并能知道,req实际上的类型是org.apache.catalina.connector.RequestFacade                         Tomcat中的源码。

                        

                          

                    通过图并能得知,req的继承形状:RequestFacade、httpServletRequest、ServletRequest,亲戚亲戚朋友儿儿知道一种 req是ServletRequest,越来越从继承形状上看,它也并能看成HttpServletRequest,也并能看成ServletRequest,越来越来太满强转为HttpServletRequest是并能的,假如有一天不明白,我举个例子,ArrayList、List、Object 你这个 ,Object obj = new ArrayList();  List list = new ArrayList();  原来ArrayList对象并能看成List对象, 也并能看成原来Object对象,现在obj是都是并能堪称List对象呢?答案是并能的,假如有一天obj越来越来太满ArrayList对象,既然是ArrayList对象,越来越就并能看成是List对象。一样的道理,RequestFacade 对应 ArrayList、httpServleRequest对应 List、 ServletRequest 对应 Object。

                    转换为httpServletRequest和HttpServletResponse对象过后,在调用service(HttpServletRequest req, HttpServletResponse resp)土法律依据。

                service(HttpServletRequest req, HttpServletResponse resp)

                    你这个 土法律依据越来越来太满判断浏览器过来的请求土法律依据是哪种,每段的防止土法律依据不一样,亲戚亲戚朋友儿儿常用的越来越来太满get,post,假如有一天,亲戚亲戚朋友儿儿防止的土法律依据假如有一天有越来越来太满的内容,越来越来太满,在该土法律依据内会将get,post等咋样让 5种请求土法律依据提取出来,变成单个的土法律依据,假如有一天亲戚亲戚朋友儿儿并能编写servlet时,就并能直接重写doGet假如有一天doPost土法律依据就行了,而都是重写service土法律依据,更加有针对性。越来越来太满这里就回到了亲戚亲戚朋友儿儿上边编写servlet时的状况,继承httpServlet,而假如有一天重写原来土法律依据,原来doGet,原来doPost,人太好越来越来太满service土法律依据会调用这原来土法律依据中的原来(看请求土法律依据)。越来越来太满也就解答了亲戚亲戚朋友儿儿一始于英文英文提的大间题3。  

四、有几个重点的对象。ServletConfig、ServletContext,request、response

       讲解四大类,ServletConfig对象,ServletContext对象、request对象,response对象

    ServletConfig对象

        获取途径:getServletConfig(); 

        功能:上边最少提及了一下,能得到有一个东西,

              

            getServletName();  //获取servlet的名称,也越来越来太满亲戚亲戚朋友儿儿在web.xml中配置的servlet-name

            getServletContext(); //获取ServletContext对象,该对象的作用看下面讲解

            getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。你这个 获取的越来越来太满在该servlet下的初始化参数

                

             getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也越来越来太满key值,并能通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型

                

                

                

           注意:在上边亲戚亲戚朋友儿儿所分析的源码过程中,亲戚亲戚朋友儿儿就知道,人太好并能不必先获得ServletConfig,假如有一天在获取其各种参数,并能直接使用其土法律依据,比如上边亲戚亲戚朋友儿儿用的ServletConfig().getServletName();并能直接写成getServletName();而不必在先获取ServletConfig();了,意味越来越来太满在GenericServlet中,假如有一天帮亲戚亲戚朋友儿儿获取了什么数据,亲戚亲戚朋友儿儿只并能直接拿就行。

      ServletContext对象

           获取途径:getServletContext(); 、getServletConfig().getServletContext();  //你这个种 获取土法律依据的区别就跟上边的解释一样,第一种 是直接拿,在GenericServlet中假如有一天帮亲戚亲戚朋友儿儿用getServletConfig().getServletContext();拿到了ServletContext。亲戚亲戚朋友儿儿只并能直接获取就行了,第二种就最少亲戚亲戚朋友儿儿被委托人在获取一遍,一种 读是一样的。

           功能:tomcat为每个web项目都创建原来ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在原来web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,越来越来太满原来web项目,就地处原来ServletContext实例,每个Servlet读并能访问到它。

              1、web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

                  setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到

                  getAttribute(String name) 通过指定名称获得内容

                  removeAttribute(String name) 通过指定名称移除内容   

                   

                     

                    

              2、整个web项目初始化参数 //你这个 越来越来太满全局初始化参数,每个Servlet中都能获取到该初始化值

                  getInitPatameter(String name)  //通过指定名称获取初始化值

                  getInitParameterNames()  //获得枚举类型

                   web.xml 配置 整个web项目的初始化

                      

                      

                      

              3、获取web项目资源

                  3.1获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")

                    

                    

                  3.2获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)

                    前提知识:非要解流。我想知道的并能去看看IO流总结的文章

                    

                    输出内容截图一每段

                    

               4、getResourcePaths(java.lang.String path)  指定路径下的所有内容。

                    

                    

                    

                5还有越来越来太满别的土法律依据,暂时用到的就这有几个了,过后并能在用的,就查看源码,看API。

      request对象

          亲戚亲戚朋友儿儿知道,request越来越来太满将请求文本封装而成的对象,越来越来太满通过request能获得请求文本中的所有内容,请求头、请求体、请求行 。

                

            1、请求行内容的获取。

              

              

                

            2请求头的获取

                随便百度原来东西,假如有一天查看的请求头,包括以下什么内容,稍作了解。

                

                String getHeader(java.lang.String name) 获得指定头内容String【】

                  

                  

                long getDateHeader(java.lang.String name) 获得指定头内容Date

                int getIntHeader(java.lang.String name)  获得指定头内容int

                Enumeration getHeaders(java.lang.String name) 获得指定名称所有内容

            3请求体的获取 -- 请求参数的获取

               分一种 ,一种 get请求,一种 post请求

               get请求参数:http://localhost:10001000/test01/MyServlet?username=jack&password=1234

               post请求参数: <form method="post"><input type="text" name="username">

                String request.getParameter(String) 获得指定名称,原来请求参数值。

                String[] request.getParameterValues(String) 获得指定名称,所有请求参数值。类事:checkbox、select等

                Map<String , String[]> request.getParameterMap() 获得所有的请求参数  

            4请求转发

                request.getRequestDispatcher(String path).forward(request,response);  //path:转发后跳转的页面,这里不管用不必"/"开头,都是以web项目根始于英文英文,假如有一天这是请求转发,请求转发只局限与在同原来web项目下使用,越来越来太满这里老要都是从web项目根下始于英文英文的,

                web项目根:

                    开发:G:\Workspaces\test01\WebRoot\..

                    运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\test01\..

                 web站点根:

                    运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\..

                从这里并能看出,web项目根越来越来太满从该web项目名始于英文英文,越来越来太满亲戚亲戚朋友儿儿请求转发时,只并能接着项目名上边并能访问的路径写就行了,

                特点:浏览器中url不必改变,也越来越来太满浏览器我想知道服务器做了什么,是服务器帮亲戚亲戚朋友儿儿跳转页面的,假如有一天在转发后的页面,并能继续使用原来 的request,假如有一天是原来 的request,越来越来太满request域中的属性并能继续获取到。

      response对象

          

        常用的原来土法律依据:response.setHeader(java.lang.String name, java.lang.String value) 设置指定的头,一般常用。

             类事:设置每隔3秒就自动刷新一次,

              response.setHeader("Refresh",3);

              

              

              原来 并能都看现在时间的秒数,会发现每隔三秒就会自动刷新一次页面。

        你这个 最重要的原来越来越来太满重定向,咋样让 的咋样让 操作都被封装进response对象中了,重点讲解重定向

          重定向(页面跳转)

            土法律依据一:手动方案

                response.setStatus(10002);  //状况码10002就代表重定向

                response.setHeader("location","http://www.baidu.com");

            土法律依据二:使用封装好的,通过response.sendRedirect("http://www.baidu.com");

          特点:服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起原来请求到另外原来页面,越来越来太满request是重新发起的,跟请求转发不一样。

            注意:response.sendRedirect(path);  //

            第一种 :response.sendRedirect("/test01/MyServlet01");  //使用了"/"开头,说明是从web站点根始于英文英文,越来越来太满并能写test01/MyServlet01

            第二种:response.sendRedirect("MyServlet01");  //越来越使用"/"开头,说明是从web项目根始于英文英文,越来越就不必写test01了。

            重定向越来越任何局限,并能重定向web项目内的任何路径,也并能访问别的web项目中的路径,假如有一天这里就用"/"区分开来,假如有一天使用了"/"开头,越来越来太满明我想重新始于英文英文定位了,不访问刚才的web项目,被委托人写项目名,假如有一天越来越使用"/"始于英文英文,越来越就知道是访问刚才那个web项目下的servlet,就并能省略项目名了。越来越来太满原来 来区别。

五、总结

      你这个 章节篇幅较长,不过理清越来越来太满知识点

          1、什么是servlet?假如有一天编写servlet?

          2、分析了servlet的每段源码,知道了其中的咋样让 设计巧妙的东西,比如,原来 编写servlet是能都看其生命周期的,假如有一天在其设计下,亲戚亲戚朋友儿儿只关注doGet和doPost土法律依据,咋样么能原来 呢?就并能通过源码中得知。

          3、servlet的生命周期,web.xml的配置

          4、servlet中的ServletConfig对象,ServletContext对象,request对象,response对象的删剪讲解。包括其中的咋样让 常用的土法律依据。

          5、下一篇讲解一下request、response的中文乱码大间题的防止