Servlet总结终结版

一、Servlet简介


1.什么是Servlet

       1、Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),

       2、用来处理客户端请求、响应给浏览器的动态资源。

       3、servlet的实质就是java代码,通过java的API  动态的向客户端输出内容


2.Servlet快速入门

实现步骤:

1)创建类实现Servlet接口

2)覆盖尚未实现的方法---service方法

3)在web.xml进行servlet的配置

但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,  我们一般创建类继承HttpServlet

实现步骤:

1)创建类继承HttpServlet类

2)覆盖doGet和doPost

3)在web.xml中进行servlet的配置

引伸

get请求和post的区别与优缺点

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。

鬼老设计各种请求的出发点

GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。


POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。

PUT:PUT的英文含义是放置,也就是向服务器新添加数据,就是所谓的增。

DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。


用简单的图描述整个访问过程:



二、Servlet的API(生命周期)

(1)Servlet接口中的方法

1)init(ServletConfig config)

何时执行:servlet对象创建的时候执行

ServletConfig : 代表的是该servlet对象的配置信息

 

2)service(ServletRequestrequest,ServletResponse response)

何时执行:每次请求都会执行

ServletRequest :代表请求 认为ServletRequest 内部封装的是                                                     http请求的信息

ServletResponse :代表响应 认为要封装的是响应的信息

 

3)destroy()

何时执行:servlet销毁的时候执行


(2)HttpServlet类的方法

1)init()

2)doGet(HttpServletRequest request,HttpServletResponse response)

3)doPost(HttpServletRequest request,HttpServletResponse response)

4)destroy()

(3)Servlet的生命周期(面试题)

1)Servlet何时创建

默认第一次访问servlet时创建该对象

 

2)Servlet何时销毁

服务器关闭servlet就销毁了

 

3)每次访问必然执行的方法

service(ServletRequest req, ServletResponse res)方法



三、Servlet的配置

其中url-pattern的配置方式:

1)完全匹配 访问的资源与配置的资源完全相同才能访问到


2)目录匹配 格式:/虚拟的目录../*   *代表任意


3)扩展名匹配 格式:*.扩展名



注意:第二种与第三种不要混用/aaa/bbb/*.abcd(错误的)



2.服务器启动实例化Servlet配置

Servlet的何时创建:默认第一次访问时创建

为什么是默认?

当在servlet的配置时 加上一个配置 <load-on-startup>servlet对象在服务器启动   时就创建


3.缺省Servlet

可以将url-pattern配置一个/,代表该servlet是缺省的servlet

什么是缺省的servlet?

当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理

 

其实,web应用中所有的资源的响应都是servlet负责,包括静态资源

4.欢迎页面



四、ServletContext对象

1.什么是ServletContext对象

ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象     内部封装是该web应用的信息,ServletContext对象一个web应用只有一个

 

问题:一个web应用有几个servlet对象?----多个

 

 

ServletContext对象的生命周期?

创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状           态))

销毁:web应用被卸载(服务器关闭,移除该web应用)


2.怎样获得ServletContext对象

1)ServletContext servletContext = config.getServletContext();

2)ServletContext servletContext =this.getServletContext();

1.ServletContext的作用

(1)获得web应用全局的初始化参数

web.xml中配置初始化参数


通过context对象获得参数


 

 

 

 

 

(2)获得web应用中任何资源的绝对路径(重要 重要 重要)

方法:String path = context.getRealPath(相对于该web应用的相对地址);

 

(3)ServletContext是一个域对象
(重要 重要 重要)

什么是域对象?什么是域?

存储数据的区域就是域对象

 

ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向      servletcontext域中存取数据,数据可以共享)

 

 

域对象的通用的方法:

setAtrribute(String name,Object obj);

getAttribute(String name);

removeAttribute(String name);




五、HttpServletRequest对象

1.HttpServletRequest概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。(有web容器创建)

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。


2.request的运行流程

3.通过抓包工具抓取Http请求

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请      求头和请求体



4.通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI()

StringBuffer getRequestURL()

String getContextPath() ---web应用的名称

String getQueryString() ---- get提交url地址后的参数字符串

username=zhangsan&password=123

 

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址


5.通过request获得请求头


long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

referer头的作用:执行该此访问的的来源

做防盗链

6.通过request获得请求体

请求体中的内容是通过post提交的请求参数,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball

key ---------------------- value

username                    [zhangsan]

password                    [123]

hobby                         [football,basketball]

                       

以上面参数为例,通过一下方法获得请求参数:

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

 

 

      注意:get请求方式的请求参数 上述的方法一样可以获得

 

      解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

      解决get提交的方式的乱码:

           parameter = newString(parameter.getbytes("iso8859-1"),"utf-8");


7.request的其他功能


(1)request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用范围:一次请求中

(2)request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

requestDispathcer.forward(ServletRequest request, ServletResponse response)

 

              

       注意:ServletContext域与Request域的生命周期比较?

          ServletContext

              创建:服务器启动

              销毁:服务器关闭

              域的作用范围:整个web应用

          request

              创建:访问时创建request

              销毁:响应结束request销毁

              域的作用范围:一次请求中

 

       注意:转发与重定向的区别?

          1)重定向两次请求,转发一次请求

          2)重定向地址栏的地址变化,转发地址不变

          3)重新定向可以访问外部网站 转发只能访问内部资源

          4)转发的性能要优于重定向

       注意:客户端地址与服务器端地址的写法?

          客户端地址:

              是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名         

             

              直接输入地址:

              重定向

          服务器端地址:

              服务器内部资源的跳转的地址,特点:不需要写web应用的名称

              转发

总结:

request获得行的内容

      request.getMethod()

      request.getRequestURI()

      request.getRequestURL()

      request.getContextPath()

      request.getRemoteAddr()

request获得头的内容

      request.getHeader(name)

request获得体(请求参数)

      String request.getParameter(name)

      Map<String,String[]>request.getParameterMap();

      String[] request.getParameterValues(name);

      注意:客户端发送的参数 到服务器端都是字符串

 

      获得中文乱码的解决:

        post:request.setCharacterEncoding(“UTF-8”);

        get:

parameter= new String(parameter.getBytes(“iso8859-1”),”UTF-8”);

 

request转发和域

      request.getRequestDispatcher(转发的地址).forward(req,resp);

      request.setAttribute(name,value)

      request.getAttribute(name)


六、HttpServletResponse

1.HttpServletResponse概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

2.response的运行流程




3、通过抓包工具抓取Http响应




因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响    应头和响应体


4.通过response设置响应行

设置响应行的状态码

setStatus(int sc)


5.通过response设置响应头

addHeader(String name, String value)

addIntHeader(String name, int value)

addDateHeader(String name, long date)

setHeader(String name, String value)

setDateHeader(String name, long date)

setIntHeader(String name, int value)

其中,add表示添加,而set表示设置


1.通过response设置响应体

(1)响应体设置文本

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response   缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览   器端。

关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过     response的setCharacterEncoding(String charset) 设置response的编码

但我们发现客户端还是不能正常显示文字

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系     统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以   手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,

通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8

response.setContentType("text/html;charset=UTF-8");

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含            setCharacterEncoding的功能,所以在实际开发中只要编写      response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。

(2)响应头设置字节

ServletOutputStream  getOutputStream()

获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。


















猜你喜欢

转载自blog.csdn.net/qq_30904985/article/details/79908683