本节篇幅较长,总结的知识点有:
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的生命周期
- 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函数来获取。
如有不足,欢迎留言指正。望不吝赐教。。。