java Web --- Servlet详解

本节篇幅较长,总结的知识点有:

1. 什么是Servlet

2. Servlet的生命周期

3. servlet中的request对象,session对象, response对象,ServletConfig对象,ServletContext对象的详细讲解。包括其中的一些常用的方法 

4. request、response的中文乱码问题的解决

5. Servlet与九大内置对象的对应关系

什么是Servlet

Servlet:

       用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。servlet是一个java小程序运行在web服务器。servlet接收并响应来自Web客户端的请求,通常通过HTTP,超文本传输协议。

简而言之,是运行在服务端的一个java程序,是sun公司提供的一套规范(接口),用于接收和响应来自客户端的请求。

Servlet的生命周期

生命周期:指的是一个对象从创建到销毁的过程。

Servlet的生命周期即Servlet对象从创建到销毁的过程

1. init:   servlet 对象创建的时候执行

2. service: 每次请求都会执行

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

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

3. destroy:servlet销毁的时候执行(servlet被改变,或者弃用时销毁)

Servlet的生命周期

  1. Servlet何时创建

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

(为什么默认?当servlet配置时,加上<load-on-startup> 数字</load-on-startup>它的值必须是一个整数,表示servlet被加载的先后顺序。如果值为负数或者没有设置,则容器会在servlet被请求时加载。如果值为正数或0时,表示容器在启动时就加载并初始化这个servlet,值越小,servlet的优先级越高。)

   2. 每次访问必然执行的方法(每访问一次service方法就创建一对request,response)

       service(ServletRequest  req,ServletResponse  res)方法

   3. servlet何时销毁

服务器关闭servlet就销毁了

第一次访问Servlet的时候才会创建该Servlet的对象,调用Servlet中的init方法,在init方法中执行一些初始化操作

注:是创建Servlet时调用init方法,

当每次从客户端发送请求,服务器都会创建一个新的线程执行Servlet中的service方法为这次请求服务。

注:服务器会同时为n个客户端服务,就与n个客户端建立连接,所以在服务端会有n 个线程为客户端服务,服务的内容就是调用Servlet中的service方法为客户端提供服 务。

当Servlet销毁时(通常是服务器关闭),会调用Servlet对象的destroy方法。

注:是销毁Servlet时调用destroy()方法,

Servlet中的request对象,session对象,response对象,ServletConfig对象,ServletContext对象

1.request

request表示一次请求,只要发出一个请求就会创建一个request,作用域:仅在当前请求中有效。

方法:

setAttribute(String name,Object):设置名字为name的request的参数值 

getAttribute(String name):返回由name指定的属性值 

removeAttribute(String name):删除请求中的一个属性 

getParameter(String name):获得客户端传送给服务器端的有name指定的参数值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 

getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 

getCharacterEncoding():返回请求中的字符编码方式 

getContentLength():返回请求的Body的长度 

getHeader(String name):获得HTTP协议定义的文件头信息 

getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 

getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例 

getInputStream():返回请求的输入流,用于获得请求中的数据 

getMethod():获得客户端向服务器端传送数据的方法 
 
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 

getParametervalues(String name):获得有name指定的参数的所有值 

getProtocol():获取客户端向服务器端传送数据所依据的协议名称 

getQueryString():获得查询字符串 

getRequestURI():获取发出请求字符串的客户端地址 

getRemoteAddr():获取客户端的IP地址 

getRemoteHost():获取客户端的名字 

getSession([Boolean create]):返回和请求相关Session 

getServerName():获取服务器的名字 

getServletPath():获取客户端所请求的脚本文件的路径 

getServerPort():获取服务器的端口号 

用处: 常用于服务器间同一请求不同页面之间的参数传递,(如:表单的控件值传递)

2.Session

服务器每次会话创建一个session对象,session中的数据可供当前会话中所有servlet共享。

会话:用户打开浏览器会话开始,直到关闭浏览器会话才结束.一次会话期间只会创建一个session对象。request.getSession();

方法:

setAttribute(String name,Object value);   将value对象以name名称绑定到会话

getAttribute(String name);  取得name的属性值,如果属性不存在则返回null

removeAttribute(String name);  从会话中删除name属性,如果不存在不会执行,也不会抛处错误.

invalidate();  使会话失效,同时删除属性对象

getAttributeNames();  返回和会话有关的枚举值

isNew();  用于检测当前客户是否为新的会话

getCreationTime();  返回会话创建时间

getLastAccessedTime();  返回在会话时间内web容器接收到客户最后发出的请求的时间

getMaxInactiveInterval();  返回在会话期间内客户请求的最长时间为秒

setMaxInactiveInterval(int seconds);  允许客户客户请求的最长时间

getServletContext();  返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信

getId();  返回会话期间的识别号

用处:

常用于web开发中的登录验证界面(当用户登录成功后浏览器会分配一个session键值对)

HttpSession session=request.getSession();

Session被销毁:

   1. session超时(默认30分钟以后)

   2. 客户端关闭后,访问不到和该客户端对应的session了,它会在超时后被销毁

   3. 调用session.invlidate();

注:session是服务端对象,保存在服务器端,服务器可以将创建session后产生的sessionid通过一个cookie返回给客户端,以便下次验证。(session 底层依赖cookie)

“退出”和”关闭浏览器”的区别:

退出:删除session存储标志,在session默认的时间范围内还可以获得session

关闭浏览器:并没有删除session,删除的是一个JsessionId.session存在,只是找不到jsessionId.所以无法获得session的值。

cookie与session的详解参考博客:https://blog.csdn.net/duan196_118/article/details/104614861

3.response

response对象的大致应用是用在设置响应码,设置响应头,及设置响应正文。

处理响应头

    addHeader(“key”, “value”)    增加响应头参数

    setHeader(“key”, “value”)    设置响应头参数

   设置自动刷新或重定向(不设url可自刷新)

       setHeader("refresh", "3;http://www.baidu.com") 3秒后刷新至百度

       sendError(500, “错误描述”)    设置页面报错(响应头)

输出响应数据

    setContentType(“参数;参数”)      设置响应数据类型和编码格式

参数在Tomcat 的 web.xml 文件中<mime-mapping>查找获取

text/html类型为html类型

image/jpeg响应jpg图片

    getOutputStream()     获取输出的字节流

    getWriter()           获取输出的字符流

    注: 两个流不能同时使用 否者报错(java.lang.IllegalStateException)

       流需要关闭.close()

       常用文本输出getWriter().write("输出文本")

sendRedirect(“url”)   重定向

       服务器指导客户端的行为,客户端根据重定向立即重新请求对应的数据

乱码处理

    服务器响应的数据编码与客户端解析编码方式存在差异时

    setContentType("text/html;charset=UTF-8") ; 设置响应头中数据类型和编码类型

4. ServletConfig

通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

方法:

 getServletName();   获取servlet的名称,也就是我们在web.xml中配置的servlet-name

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

 getInitParameter(String);   获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数

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

5. ServletContext(Application)

作用范围:

      所有用户都可以取得信息,在整个服务器上被保留.Application属性范围,只要设置一次,则所有的网页窗口都可以取得数据。ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象,所有的客户端在访问服务器时都共享同一个ServletContext对象,ServletContext对象一般用于在多个客户端间共享数据时使用;

功能:

      tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。

方法:

ServletContext context=this.getServletContext();

Context.setAttribute(“name”,”value”);//设置一个键值对

Context.getAttribute(“name”);//获取相对应的值

1.、常用方法

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

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

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

2、整个web项目初始化参数 //这个就是全局初始化参数,每个Servlet中都能获取到该初始化值

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

getInitParameterNames()  //获得枚举类型

3、获取web项目资源

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

 request、response的中文乱码问题的解决

请求乱码

get方式处理乱码:保证编码格式与解码格式一致即可。

(地址栏中的url不支持中文,会将中文进行编码)

浏览器(utf-8)--->get Url编码--->Tomcat编码--->程序在使用时(utf-8)

例:

   String userName=request.getParamter(“username”);

   Byte [] bytes=username.getBytes[“ISO-8859-1”];

   String string=new String(bytes,”utf-8”);

  或

   userName=new String(userName.getBates(“iso8859-1”),”utf-8”);

post方式处理乱码:

   post参数在请求体中,在Tomcat(“ISO-8859-1”)中进行解析

   request.setCharacterEncoding(“utf-8”);修改Tomcat缓冲区的编码

响应乱码处理

   response.setCharacterEncoding(“utf-8”);

  设置响应头的格式,让浏览器用这种编码解码

  response.setHeader(“Content-type”,”text/html;charset=utf-8”);告知客户端使用utf-8解码

  response.setContentType(“text/html;charset=utf-8”);(只写这个就解决乱码)

Servlet与九大内置对象的对应关系:

1.   JSP的——out对象 Servlet——response.getWriter
(严格意义上讲这两个类型是不匹配的response.getWriter()获得的是PrintWriter类型的对象,out是JspWriter类型的对象,都可以对浏览器进行输出,但类型是不一样的。

2.  JSP——request对象 Servlet——通过service方法中的request参数获取,也可以通过doGet、doPost方法中的参数来获取。

3.  JSP——response对象 Servlet——通过service方法中的response参数获取,也可以通过doGet、doPost方法中的参数来获取。

4.  JSP——session对象 Servlet——通过传进来的request的getSession()方法来获取。

5.  JSP——application对象 Servlet——通过Servlet中的geServletContext()函数来获取。

6.  JSP——exception对象 Servlet——通过抛出异常Throwable方式来获取。

7.  JSP——page对象 Servlet——对应this对象。

8.  JSP——pageContext对象 Servlet——对应PageContext对象。

9.  JSP——Config对象 Servlet——通过Servlet中的getServletConfig函数来获取。

如有不足,欢迎留言指正。望不吝赐教。。。

发布了132 篇原创文章 · 获赞 1 · 访问量 7264

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/104613360