这些对象都是容器,创建的。
request
response
application/servletContext
session
可存储数据的为(作用范围由大到小)
servletContext/application * 全局(一处存储,其它网页中都可获取操作)
生命周期与容器同步
记数器(投票器)
•唯一性:一个web应用只对应一个servletContext
•一直存在:由容器创建,容器不关闭,应用没有被删除,
servletContext对象将一直存在。
session * 会话
request * 请求链期间有效
请求链(默认没有请求链)
page 当前网页有效(jsp)
能存储数据的内置对象称之为域对象,这些对象都有同样的操作方法
《===================================》
request 域对象 特点:
一次HTTP请求,服务器响应输出后,就断开连接,不能持续保
存数据。
接受获取客户端的请求信息;通过name获得参数;获取域变量值;获取内置对象;请求转发;
向客户端输出信息;设置中文乱码编码;重定向(页面跳转);写入cookie;设置响应头;输出流;
ServletContext 域对象 特点:
全局域对象,所有页面都可以访问,不区分用户,即所有人的公
有资源!
获取服务器文件路径;设置公共参数;
response.getWriter().append(request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+request.getServletPath());//url
ServletContext servletContext=req.getServletContext();
servletContext.setAttribute("number", 100);
ServletContext servletContext=req.getServletContext();
String string1=servletContext.getAttribute("number").toString();
resp.getWriter().append(string1);
=====>>> getRealPath(); //运行后的项目位置
if(servletContext.getAttribute("count") != null) {
Integer i = Integer.valueOf(servletContext.getAttribute("count").toString());
i++;
servletContext.setAttribute("count", i);
}else {
servletContext.setAttribute("count", 1);
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
response.getWriter().append(String.format("当前访问人数:%s
", servletContext.getAttribute("count")));
网页一
req.setAttribute("name", "dts");
req.getRequestDispatcher("request2").forward(req, resp);
网页二
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("网页二"+req.getAttribute("name").toString());
req.getRequestDispatcher("request3").forward(req, resp);
网页三
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("网页三"+req.getAttribute("name").toString());
servlet处理java代码,jsp展示效果;
@WebServlet("/request1")
public class request1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("name", "dts");
req.getRequestDispatcher("file.jsp").forward(req, resp);
}
}
•地址栏地址会改变,变成重定向到的地址。
•重定向可以跳转到任何页面,甚至外部网站。
•重定向后的页面是全新的request和response
response.sendRedirect("url");
•转发之后,浏览器地址栏地址不变。
•转发目的地是同一应用内部的地址。
•转发中的请求链共享相同的request和response。
req.getRequestDispatcher("file.jsp").forward(req, resp);
服务器在运行时,为每个会话用户创建一个独立的session
对象,各自的数据放在各自的session中。
从而Web服务器就可以分别按用户存储数据了。即服务器
会话技术。
1)获取session域对象
HttpSession session = request.getSession();
2)存储session数据
session.setAttribute("username", "garysu");
3)读取session数据
String name = (String)session.getAttribute("username");
4)清除session数据
session.removeAttribute("username");
session.Invalidate();
session存储在服务器上,但又能作到其它人访问不了,原因就是底层是用cookie去完成的。
1、 需要浏览器支持cookie存储
2、 由于每次请求服务器,需要携带cookie至服务器,所以cookie数据还是少写一点比较。
3、 cookie默认的生命周期,即会话为单位。
4、 an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie is not stored; if zero, deletes the cookie
可以通过setMaxAge(?)方法来修改默认生命周期,当为正整数时,即多久数据自动被销毁,当为0时,删除cookie
5、 Cookie只能保存非中文字符串类型数据。需要URL编码
URLDecoder()
URLEncoder()
Cookie cookie = new Cookie("name",URLEncoder.encode("董天帅", "UTF-8") );
response.addCookie(cookie);
response.getWriter().append("cookie已发布");
接受cookie
Cookie[] cookies=request.getCookies();
for (Cookie cookie : cookies) {
cookie.setMaxAge(5);
response.getWriter().append(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(), "UTF-8")+"
");//遍历输出cookies数组
}
用户打开一个URL,访问某网站信息,直至关闭浏览器,整个过程可称之为一个会话。绘画时间数据隔离。
Cookie是客户端浏览器技术:
网站服务器可以通过cookie技术把用户数据写入到客户端浏览器中,由客户端浏览器完成数据存储。当用户再次使用该浏览器访问网站时,服务器可以通过cookie技术读取到客户端浏览器中存储的相关数据。
这样,网站或Web项目中就可以按用户存储数据了。即客户端会话技术。
1)如何创建Cookie?
Cookie c = new Cookie(String name,String value);
2)发送cookie到浏览器端保存
response.addCookie(Cookie cookie)
3)服务器接收cookie
Cookie[] request.getCookies()
4)设置cookie
Cookie只能保存非中文字符串类型数据。
cookie保存在客户端浏览器中,相对而言不安全。
对于敏感数据,需要加密后存储或不使用该技术。
有效路径:cookie的有效路径保存在哪里,那么浏 览 器 在 有 效 路 径 下 访 问 服 务 器 时 就 会 带 着cookie信息,否则不带cookie信息。
默认情况:有效路径在当前web应用下
Cookie cookie1 = new Cookie(“name”,“eric”);
//默认情况
cookie1.setPath("/appName");
response.addCookie(cookie1);
//
cookie1.setPath("/shopping/username");
在一个比较复杂的网站环境下。有多个产品向外提供服务。每个产品下都有自己的登录界面。现在需要设计一个统一的登录界面。类似业务,可使用跨域Cookie实现。
跨域共享cookie实现:
•应用A 所在的域:gary.com
•写入时,配置域:cookie.setDomain(".gary.cn");
•应用B 所在的域:gary.cn
•可读取。
注:域名以点 (.foo.com) 开头默认情况下,cookie 只返回给写入它们的服务器。
•Cookie是把数据存储在客户端浏览器中。
•Session是把数据存储在服务器中。