一.servletContext
1.什么是ServletContext?
ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息
ServletContext对象一个web应用只有一个,一个web应用可以有多个servlet对象,
但却只有一个servletConetext的对象
2.ServletContext生命周期
创建:该web应用被加载服务器启动或发布web应用,前提是服务器启动状态
销毁:web应用被卸载(服务器关闭,移除该web应用)
3.获取ServletContext对象
方式一ServletContext servletContext = getServletContext();
方式二ServletContext servletContext = this.getServletContext();
方式二可以省略this,在httpServlet的doget和dopost下
其实方式二的内部隐藏操作就是方式一
4. ServletContext的作用
1.获得web应用全局的初始化参数(web.xml中配置初始化参数)
2.获得web应用中任何资源的绝对路径
5. ServletContext是一个域对象
它可以存储数据,所以可以说它是域对象
ServletContext域对象的作用范围:整个web应用
所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享,它可以作为所有web资源的桥梁,
通过他互相传递数据
域对象的通用的方法:所有域对象都有这三个方法
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
因为它可以存储数据共享数据所以应用很多地方
6.案例 记录用户登陆次数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//获取servletContext对象
ServletContext ctx=request.getServletContext();
//获取context属性,即counter的值
Integer counter=(Integer)ctx.getAttribute("counter");
if(counter==null){
counter=1;
}else{
counter=counter+1;
}
//设置context属性
ctx.setAttribute("counter",counter);
response.getWriter().println("你是第"+counter+"位访问本网站的用户");
response.getWriter().println("您的ip地址是:"+request.getRemoteAddr());
//获取初始化参数
String hello=ctx.getInitParameter("hello");
response.getWriter().print(hello);
//获取绝对路径,该项目的路径,及web路径+a.txt
ctx.getRealPath("a.txt");
}
}
二.Response响应
1.response响应过程:
在去发送一个请求时,会去找到Tomcat引擎,引擎会找到对应的web应用,
找到应用后,会执行应用的web.xml,再去根据url-pattern的内容创建servlet对象,
并且调用servlet的service方法,并且把创建的request对象和response对象传过来
拿到response对象后,自己可以写一些要给客户端的内容
写的内容是存到response缓冲区中
当方法执行结束后,Tomcat会从response缓冲区中取出数据给客户端
2.设置响应行,响应头,响应体
(1)设置响应行
//设置响应行 :设置状态码
response.setStatus(200);
(2)设置响应头
//设置响应头
response.addHeader("name","lisa");
response.addIntHeader("id",1);
response.addDateHeader("birthday",new Date().getTime());
//修改响应头
response.setHeader("name","sunny");
设置重定向
(3)设置响应体
response.getWriter().print("hello");
三.Request请求
//取出请求头里的所有信息
Enumeration<String> headerNames= request.getHeaderNames();
while(headerNames.hasMoreElements()){
String name=headerNames.nextElement();
String value=request.getHeader(name);
response.getWriter().print(name+"="+value);
}
//获取客户端提交上来的数据
String name=request.getParameter("name");
四.cookie和session
1.cookie
(1)cookie的简单使用
package com.westos.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "cookieServlet")
public class cookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//cookie添加和获取
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//cookie的简单使用
//发送给客户端.并保存在客户端的一份小数据
Cookie cookie=new Cookie("a","bb");
//1.设置cookie有效期
//cookie的有效期 默认情况,关闭浏览器后就没有了
cookie.setMaxAge(10);//正值表示在这个秒数后cookie失效,负值表示关闭浏览器后消失
//2.发送cookie给客户端
//给响应添加一个cookie
response.addCookie(cookie);
response.getWriter().print("请求成功了..");//可以添加多个cookie
//3.获取客户端的cookie
Cookie[]cookies= request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String cookieName=c.getName();
String cookieValue=c.getValue();
response.getWriter().println(cookieName+"="+cookieValue);
}
}
}
}
(2)cookie应用案例 显示上次访问时间
package com.westos.servlet;
import com.westos.utils.cookiesUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
public class cookie2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//显示上次访问时间
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
if("admin".equals(username)&&"123".equals(password)){
//获取cookie
Cookie[]cookies=request.getCookies();
//调用工具类中的方法
Cookie cookie=cookiesUtil.findCookie(cookies,"last");
//第一次登陆,没有cookie
if(cookie==null){
Cookie c=new Cookie("last",System.currentTimeMillis()+"");
response.addCookie(c);
response.getWriter().print("登陆成功");
}else {
//不是第一次登陆,有cookie
long lastVistTime = Long.parseLong(cookie.getValue());
//输出到界面
response.getWriter().print("欢迎登陆,上次登陆时间是" + new Date(lastVistTime));
//重置登陆时间
cookie.setValue(System.currentTimeMillis()+"");
response.addCookie(cookie);
}
}else {
response.getWriter().print("用户名或密码错误");
}
}
}
2.session
一、Session简单介绍
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个
session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的
session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户
服务。
二、Session和Cookie的主要区别
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象
三.服务器如何实现一个session为一个用户浏览器服务的?
服务器创建session后会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关
再去访问服务器时,都会带着session的id号去,服务器发现客户机带着浏览器session的id来了,就会使用
浏览器中对应的session为之服务
四.session的生命周期
1、session对象的创建时机
在程序中第一次调用request.getSession()方法时就会创建一个新的Session,
可以用isNew()方法来判断Session是不是新创建的
2.session对象的销毁时机
session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配
session的失效时间
Session 对象最常见的一个用法就是存储用户的首选项
//获取session
HttpSession session=request.getSession();
//将数据存储到session中
session.setAttribute("apple",5);
//获取session的id
String id=session.getId();
//判断session是否已经存在
if(session.isNew()){
response.getWriter().print("session创建成功,id号是"+id);
}else{
response.getWriter().print("session已经存在,id号是:"+id);
}
HttpSession session=request.getSession();
//获取会话id
session.getId();
//存值
session.setAttribute("name","value");
//取值
session.getAttribute("name");
//移除
session.removeAttribute("name");
(5)应用案例 验证码
package com.westos.servlet2;
import org.apache.commons.lang3.RandomUtils;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class yanzhengmaServlet extends HttpServlet {
private static final int WIDTH = 100;
private static final int HEIGHT = 40;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
//产生一张图片
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//设置背景色
g.setColor(Color.WHITE);
//填充背景色
g.fillRect(0,0,WIDTH,HEIGHT);
//设置前景色
g.setColor(Color.RED);
Font font=new Font("微软雅黑",Font.BOLD,20);
g.setFont(font);
//获取随机字符串
String str=genRandomString(4);
session.setAttribute("str",str);
g.drawString(str,20,30);
for(int i=0;i<20;i++){
int x1=RandomUtils.nextInt(0,WIDTH);
int x2=RandomUtils.nextInt(0,WIDTH);
int y1=RandomUtils.nextInt(0,HEIGHT);
int y2=RandomUtils.nextInt(0,HEIGHT);
Color color=new Color(RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255));
g.setColor(color);
g.drawLine(x1,y1,x2,y2);
}
//输出图片
ImageIO.write(image,"jpg",response.getOutputStream());
}
private String genRandomString(int len){
String result="";
//获取len个随机字母
for(int i=0;i<len;i++){
char c = (char)RandomUtils.nextInt(65, 91);
result=result+c;
}
return result;
}
}