学习目标:
- 学习Request
- 学习Response
- 学习ServletContext对象
- 了解会话技术Cookie\Session
学习内容:
- 掌握Request
- 掌握Response
- 掌握ServletContext对象
- 熟悉会话技术Cookie\Session
学习产出:
1、Request:请求消息:客户端发送数据给服务端
1)获取请求行数据
Get /request-demo/req1?username=zhangsan Http/1.1
-
获取请求方式Get
String getMethod()
-
获取虚拟目录(项目访问路径) --request-demo
String getContextPath()
-
获取Servlet路径-- /req1
String getServletPath()
-
获取请求参数(GET方式) --username = zhangsan
String getQueryString()
-
获取请求参数(POST方式)
BufferedReader getReader()
-
获取请求URL(统一资源定位符)–http://localhost:8080/request-demo/req1
StringBuffer getRequestURL
-
获取请求URI(统一资源标识符)–/request-demo/req1
String getRequestURI() -
获取协议及版本
String getProtocol()
-
获取客户机的IP地址
String getRemoteAddr()
2)获取请求头数据–User-Agent
-
通过请求头的名称,获取请求头的值
String getHeader(String name)
3)获取请求体数据
请求体:只有post请求方式才有请求体,在请求体中封装了post请求的请求参数
-
获取流对象
BufferedReader getReader() 获取字符输入流,只能操作字符数据
ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型的数据(使用文件上传中)
-
其他(get、post都可以用)
String getParameter(String name) 根据参数名获取参数值 username = zs
//3、根据key获取单个参数值
String username=req.getParameter("username");
String password=req.getParameter("password");
System.out.println("username");
System.out.println("password");
}
String[] getParameterValues(String name) 根据参数名称获取参数值数组
//2、根据key获取参数值,数组
String[] hobbies=req.getParameterValues("hobby");
for(String hobby:hobbies){
System.out.println(hobby);
}
Enumeration<string>
getParameterNames() 获取所有请求的参数名称
Map<String, String[]> getParameterMap() 获取所有参数的Map集合
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
Map<String,String[]> map=req.getParameterMap();
for(String key:map.keySet()){
System.out.print(key+":");
// 获取值
String[] values=map.get(key);
for(String value:values){
System.out.print(value+" ");
}
}
}
-
乱码问题
get方式,tomcat已经处理了
post方式,设置request.setCharacterEncoding(“utf8”)
4)请求转发
一种服务器内部资源跳转的方法,servlet之间的跳转
步骤:
-
通过request请求对象获取请求转发器对象
-
通过RequestDispatcher对象进行转发
request.getRequestDispatcher("转发路径/demo8").forward(request, response)
特点:
- 浏览器地址路径不发生变化
- 只能转发到服务器内部资源
- 转发是一次请求
5)共享数据
1、域对象:一个有作用范围的对象,可以在范围内共享数据
2、 request域:代表一次请求范围,一般用于请求转发的多个资源数据
setAttribute(String name, Object object) // 存储数据
getAttribute(String name) // 通过键获取数据
removeAttribute(String name) // 通过键移除数据
// 存储数据,写在demo7
request.setAttribute("msg","hello");
// 根据key,获取值,写在demo8
request.getAttribute("msg");
2、Response
1)响应行
- 组成:协议/版本 响应状态码 状态码描述
- 响应状态码:服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数
- 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送1xx状态码
- 2xx:成功,200
- 3xx:重定向。302重定向,304访问缓存
- 4xx:客户端错误。404找不到后台地址
- 5xx:服务器端错误。500服务器内部错误
2)响应头
常见
- Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- in-line默认值,在当前页打开
- attachment;filename=xxx 以附件的形式打开响应体,文件下载
3)响应体
向客户端返回数据
- 设置响应行
格式:HTTP/1.1 200 OK
设置状态码:setStatus(int sc) - 设置响应头
setHeader(String name, String value) - 设置响应体
//response.getWriter().write(内容)
//response.getOutputStream.write()
//获取字节输出流
// 读取文件
FileInputStream fis=new FileInputStream("");
// 获取response字节输出流
ServletOutputStream os=resp.getOutputStream();
// 完成流的copy
// byte[] buff=new byte[1024];
//int len=0;
// while((len=fis.read(buff))!=-1){
// os.write(buff,0,len);
//}
IOUtils.copy(fis,os);
fis.close();
//pom.xml中要写入
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
- 解决返回乱码
//获取字符输出流
//先设置流的编码
response.setContentType("text/html",charset=utf-8)
PrintWriter writer=response.getWriter();
// content-type 解析html标签 plain普通文本
//resp.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");
}
4)重定向
特点:
- 地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求,不能使用request对象来共享数据
response.sendRedirect("./MyHttpServlet02"); // 相对路径
response.sendRedirect("http://127.0.0.1:8080/Web02/MyHttpServlet02"); // 绝对路径
response.sendRedirect("http://www.baidu.com"); // 绝对路径
3、ServletContext对象
ServletContext官方叫Servlet上下文。服务器会为每一个工程创建一个ServletContext对象。这个对象全局唯一,工程内所有的servlet都共享这个对象。所以叫全局应用程序共享对象
代表整个web应用,可以和程序的容器(服务器)来通信
1)作用
- 是一个域对象
- 可以读取全局配置参数
- 可以搜索当前工程目录下面的资源文件
2)凡是域对象都有以下3个方法
- setAttribute(name, value) 添加数据
- getArrtibute(name) 获取数据
- removeAttribute(name) 删除数据
3)获取方式
- request.getServletContext()
- this.getServletContext()
4)获取MIME类型
在互联网通信过程中定义的一种文件数据类型
String filename = "a.jpg";
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
5)获取文件真实的路径
String path = context.getRealPath("/index.html");
System.out.println(path);
4、会话技术
会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方停止
功能:在一次会话的范围内的多次请求,共享数据
方式:客户端cookie、服务端session
1)Cookie
客户端存储技术、将数据保存在客户端
步骤
- 创建cookie对象
new Cookie(String name, String value) - 发送cookie对象
response.addCookie(Cookie cookie) - 获取cookie对象,拿到数据
Cookie[] request.getCookie()
其他 - 可以一次发送多个cookies
创建多个Cookie对象,通过response.addCookie()添加多次 - 在浏览器保存的时长
默认情况下,当浏览器关闭的时候,cookie被销毁
正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)
负数:默认
0:删除cookie信息
public class web01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("web1");
//创建cookie对象
Cookie cookie=new Cookie("num","100");
//通知浏览器往cookie里面存数据
resp.addCookie(cookie);
resp.addCookie(new Cookie("a","200"));
}
}
2)session
服务器端会话技术,将数据保存到服务器端对象中
public class web02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("web1");
//setAttribute
HttpSession session=req.getSession();
session.setAttribute("name","张三");
}
//getAttribute
HttpSession session = request.getSession();
System.out.println(session.getAttribute("name"));
注意
- Session是依赖于Cookie
- 当客户端关闭后,服务器不关闭,两次获取的session id默认是不一样的
如果需要相同,可以创建cookie,键为JSESSIONID
HttpSession session = request.getSession();
session.setAttribute("userid", "123");
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
-
-
客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样
-
session销毁
服务器关闭,session失效
session对象调用invalidate()方法
session默认试校时间是30分钟,在tomcat的conf目录下的web.xml,配置session-config
-
-
特点
- session用于存储一次会话的多次请求的数据,存在服务端
- session可以存储任意类型,任意大小的数据
- session数据存在服务端,cookie存在客户端
- session没有数据大小限制,cookie有
- session数据安全,cookie相对不安全