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():立即失效
Day8 Servlet的更多相关文章
- Servlet生命周期 Servlet获取配置信息 ServletContext
一.Servlet生命周期 实例化 ——> 初始化 ——> 服务 ——> 销毁 出生:(实例化 然后 初始化)tomcat第一次访问,Servlet就出生(默认情况下) 活着:( ...
- Servlet 三种创建方式
servlet 是运行在 Web 服务器(tomcat)中的小型 Java 程序(即:服务器端的小应用程序) (其实就是一个java类,只不过不用再new了).servlet 通常通过 HTTP(超文 ...
- servlet文件下载
创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...
- java中servlet的各种路径
1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...
- Servlet监听器笔记总结
监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...
- JavaWeb——Servlet
一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...
- servlet 简介,待完善
什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- servlet使用入门
创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...
随机推荐
- spring 中 InitializingBean 接口使用理解
前言:这两天在看 spring 与 quart 的集成,所以了解到 spring 是如何初始化 org.springframework.scheduling.quartz.SchedulerFacto ...
- K8S基础概念
一.核心概念 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubernetes的Kubelet.kube ...
- HDU1560(KB2-E IDA星)
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- THUSC2017 游记
你若安好,便是晴天. Day 0 中午就要出发了,上午浮躁的不行,根本写不下题去. 到了火车站之后发现教练和lyc和ztc在4车靠近5车的那一边,然而我在5车靠近4车的那边,尴尬…… 本来是想着上了火 ...
- LOJ#6491. zrq 学反演(莫比乌斯反演 杜教筛)
题意 题目链接 Sol 反演套路题? 不过最后一步还是挺妙的. 套路枚举\(d\),化简可以得到 \[\sum_{T = 1}^m (\frac{M}{T})^n \sum_{d \ | T} d \ ...
- js-权威指南学习笔记18
1.除mouseenter和mouseleave外的所有鼠标事件都能冒泡. 2.传递给鼠标事件处理程序的事件对象有clientX和clientY属性,它们制订了鼠标指针相对于包含窗口的坐标. 3.一个 ...
- jQuery箭头切换图片 - 学习笔记
jQuery箭头切换图片 布局 3d位移 变形原点 jQuery transform:translate3d(x,y,z): x 代表横向坐标移向量的长度 y 代表纵向坐标移 ...
- Ubunt 安装mysql
apt-get install mysql-client-core-5.6apt-get install mysql-client-5.6apt-get install mysql-server-5. ...
- logback.xml配置示例
需要的jar如下: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api< ...
- socat 的神奇使用方式
目的是实现科* 学 * 上*网,现在记录一下流程 先在服务器上安装(比如美国,香港,台湾,马来的云主机)squid,easy_rsa, centos 下可以用yum直接安装 $ yum install ...