Day8 Servlet
HttpServletRequest
说明
公共接口类HttpServletRequest继承自ServletRequest.客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。
一个 HTTP 请求包含以下三部分:
a.请求地址(URL)
b.请求头(Request headers)
c.实体数据(Entity body)
举例如下
POST /examples/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Language: en-gb Connection: Keep-Alive Host: localhost User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) Content-Length: 33 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate lastName=Franks&firstName=Michael
每个 HTTP 请求都会有一个请求方法,HTTP1.1 中支持的方法包括,GET、POST、HEAD、OPTIONS、
PUT、DELETE 和 TRACE。互联网应用中最常用的是 GET 和 POST。
URI 指明了请求资源的地址,通常是从网站更目录开始计算的一个相对路径,因此它总是以斜线 “/”开头的。URL 实际上是 URI 的一种类型,请求头(header)中包含了一些关于客户端环境和请求实体(entity)的有用的信息。例如,客户端浏览器所使用的语言,请求实体信息的长度等。每个请求头使用CRLF(回车换行符,“\r\n”)分隔。注意请求头的格式:
请求头名+英文空格+请求头值
用户请求的包装对象。(客户端的IP,主机名称,数据长度,协议,真实的数据。。。。。。)
常用方法
1.获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
getServerPath()获取请求的文件的路径
2.获得客户机请求头
getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法
3. 获得客户机请求参数(客户端提交的数据)
getParameter(name)方法 获取请求中的参数,该参数是由name指定的getParameterValues(String name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
getParameterNames方法 返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。
getCharacterEncoding() 返回请求的字符编码方式
getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute()
getAttribute(String name) 返回name指定的属性值
getsession()返回和客户端相关的session,如果没有给客户端分配session,则返回null
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组
RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
//客户端的地址 System.out.println(request.getRemoteAddr()); //请求路径 System.out.println(request.getRequestURI()); //请求方式 System.out.println(request.getMethod()); //根据name值获取value值(value值唯一时) String user = request.getParameter("user"); String pwd = request.getParameter("pwd"); //将name和value值封装为map集合,name值为map的key值;value值为map的value。 request.getParameterMap(); //beanUtils //获取所有的name值 request.getParameterNames(); //根据name值获取value值(value值不唯一时) request.getParameterValues(name);
HttpServletResponse
说明
HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法
HttpServletResponse对象可以向客户端发送三种类型的数据:
a.响应头(Response headers)
b.状态码(Protocol—Status code—Description)
c.实体数据(Entity body )
举例如下:
HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Mon, 5 Jan 2004 13:13:33 GMT Content-Type: text/html Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT Content-Length: 112 <html><head><title>HTTP Response Example</title></head>....</html>
常用方法
addHeader(String name,String value) 将指定的名字和值加入到响应的头信息中
encodeURL(String url) 编码指定的URL
sendError(int sc) 使用指定状态码发送一个错误到客户端
setDateHeader(String name,long date 将给出的名字和日期设置响应的头部
setHeader(String name,String value) 将给出的名字和值设置响应的头部
setStatus(int sc) 给当前响应设置状态码
HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
消息实体内容 通过输出流对象进行设置,用以下两个方法:
Response.getOutputStream() 字节输出流对象
Response.getWriter() 字符的输出流对象
getOutputStream和getWriter方法的比较
(1)getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
(2)getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
(3)getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。要不会出现错误java.lang.IllegalStateException
(4)getOutputStream方法返回的是字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
(5)getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容。
(6)Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
(7)Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
注:out.close();系统会自己释放,但一般写上
选择getOutputStream和getWrite方法的要点
(1)PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。
(2)使用ServletOutputStream对象也能输出内容全为文本字符的网页文档,但是,如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。
(3)如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。
编码问题
get: tomcat 8.0+(默认编码 utf-8) 7.0(默认编码 ISO-8859-1)
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding=”utf-8”/>
post:
//修改post请求编码 request.setCharacterEncoding("utf-8"); //修改响应的编码 response.setCharacterEncoding("utf-8"); //响应给客户端一个html文档 response.setContentType("text/html;charset=utf-8");
ServletConfig
1) ServletConfig将初始化配置参数封装到该对象中
和init-param一起使用
将init-param中的数据可以封装到对象。
config.getInitParameter("charset");
2) 获取ServletContext对象
ServletContext
application域对象。
存取数据。整个应用程序只有一个application域对象。
作用域应用于整个应用程序。
当应用程序被加载到服务器时创建;当应用程序被移除时(服务器关闭)销毁。
在多个请求(servlet)之间实现数据共享。一般不会存放过多的数据。
setAttibute()
getAttribute()
转发和重定向
转发
request.getRequestDispatcher("welcome.jsp").forward(request, response);
注意:转发使用的是同一个request对象,转发之后地址栏不会发生改变
重定向
response.sendRedirect("welcome.jsp");
注意:重定向不是同一个request,重定向之后的地址栏发生变化。
转发和重定向的区别
转发:服务器端的行为。当用户发出请求时,在服务器端将该请求进行再次延伸,以达到共享该请求的目的,此时对客户端来说不知道内部的变化。而且地址栏不会发生改变。客户端只发送一次请求。
重定向:客户端的行为。当用户第一个发出请求时,服务器端返回302的状态码和新的请求路径;客户端接收到302状态码和新路径后,再次发送请求给新的路径。
因此最终在地址栏显示的为最后发出请求的路径。客户端发出两次请求。
会话跟踪技术
http请求是无状态的请求。
什么是会话
a) 客户端与服务器的一次连接就是一次会话。
b) 在会话之内可以有多次的请求和响应。
会话跟踪技术
cookie
cookie客户端。
由服务器端产生,响应回浏览器端进行保存一段文本。
//服务器端: //3.创建cookie,将用户名保存到cookie中 Cookie cookie = new Cookie("name", user); //4.响应时将cookie的信息携带会浏览器端 response.addCookie(cookie); //客户端显示: <% //1.获取浏览器端的cookie信息 Cookie[] cookies = request.getCookies(); String value = ""; //2.从cookie中读取name if(cookies != null){ for(int i=0;i<cookies.length;i++){ //获取cookie中name的值为"name" if("name".equals(cookies[i].getName())){ value = cookies[i].getValue(); break; } } } //3.将获取的值显示在user的value中 %> <form action="user3" method="post"> 用户名:<input type="text" name="user" value="<%=value %>"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="登录"> </form> cookie的有效时长: setMaxAge() 正数:以秒为单位 负数:代表临时cookie 0:删除cookie
session
当客户端发送请求,此时在服务器端创建该用户的独有的session对象,保存响应的session信息。当用户再次发送请求时会根据sessionid寻找自己的独有的session实现数据存取。
session域对象。在一次会话之内有效。
自动登录: HttpSession session = request.getSession(); session.setAttribute("user", user); //判断session中是否有值 if(session.getAttribute("user") != null){//已经登录成功过 request.getRequestDispatcher("welcome.jsp").forward(request, response); }
session失效的情况
a) 默认30分钟时长
b) session.setMaxInactiveInterval()
c) session.invalidate():立即失效