Day17
例题:访问量的统计
创建一个int类型的变量,然后把它保存到ServletContext的域中,这样可以保存所有的Servlet都可以访问到
思想:
最初ServletCOntext中没有保存访问量的属性
的第一次访问时,创建一个变量,设置值是1,保存的ServletContext中
当以后访问时,从中获取,值加1.
//步骤:先获取,根据获取的值,做出判断,如果是空就是第一次访问,就直接创建,如果不是空,就加1然后再存储。
ServletContext context = this.getServletContext();
Integer count = (Integer)context.getAttribute("count");
if(count==null){
context.setAttribute("count", 1);
}
else {
count+=1;
context.setAttribute("count", count);
}
PrintWriter pw = response.getWriter();
pw.print(count);
}
获取类路径的资源:类路径对一个javaweb项目而言,就是/WEN-INF/CLASS
和/WEB-INF/lib每一个jar包!
//得到ClassLoader
ClassLoader loader = this.getClass().getClassLoader();
//调用方法
InputStream input = loader.getResourceAsStream("index.jap");
//读取输入流内容,转换成字符串
String s = IOUtils.toString(input);
System.out.println(s);
Response
类型是HttpServletResponse
setError(int sc)--à发送错误状态码,例如404 500
setError(int sc,String infor)发送错状态码,并且加上错误信息
setStatus(int sc)-à发送正确的状态码
响应头
响应头就是一个键值对可以会存在一个name多个值
setHeader(String name , String value)用于单值的响应头,
例如:response.setHeader("sss", "SSS");
addHeader(Stringname , String value),多值的响应头(少用)
setIntHeader(Stringname , String value)
适用于单值的int类型的响应头
setDataHerder(Stringname , long value)
适用于单值的毫秒类型的响应头
响应头实现自动刷新
PrintWriter writer = response.getWriter();
writer.print("huangying");
response.setHeader("Refresh","5;URL=/java10_1/Cservlet");
刷新时间,跳转地址 |
关键字 |
禁止浏览器缓存
三句话:
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pargam", "no-cache");
response.setDateHeader("expires", -1);
response有两个流
ServletOutputStream:用来向客户端发送字节数据
ServletOutputSteam out = response.getOutputStream();
Print Writer:用来向客户端发送字符数据!需要设置编码
PrintWriter writer = response.getWriter();
不可以同时使用
把一张图片读取到字节数组中
String path = "图片绝对路径";
FileInputStream in = new FileInputStream(path);
byte[] bytes = IOUtils.toString(path);
response.getOutputStream().write(bytes);
请求uri :项目名+servlet路径 |
重定向
response.sendRedirect("http://www.baidu.com");
request
封装了客户端所有的请求数据
获取常用信息:
获取客户端IP
String request.getRemoteAddr();
获取请求方式:
Request.getMethod();返回值事get 或者 post 通缩这个来调用do方法
获取请求头:
String getHeader(String name);适用于单值头
Int getIntHeader(String name);适用于int类型的请求头
Long getDateHeader(String name);适用于单值毫秒类型的请求头
Enumeration<String>getHeader(String name),适用于多值请求头
//获取客户端IP
String ip = request.getRemoteAddr();
System.out.println(ip);
//获取请求方式
String mothod = request.getMethod();
System.out.println(mothod);
//获取客户段信息
String user = request.getHeader("User-Agent");
System.out.println(user);
获取请求URL:
String getScheme();获取协议名
String getServerName();获取服务器名
String getServlerPort();获取服务器端口号
String getContextPath();获取项目地址
String getServletPath();获取servlet地址
String getQueryString();获取参数
String getRequestURI();获取uri
String getRequestURL();获取请求地址
使用referer请求头防盗链
如果是本机请求的就正常运行到百度,否则到index.jsp
String str = request.getHeader("Referer");
System.out.println(str);
if(!str.contains("localhost")||str==null){
response.sendRedirect("index.jsp");
}
else{
response.sendRedirect("http://www.baidu.com");
}
}
request请求参数
getparameter(参数名);返回参数的值
String[] name =request.getparamentValue(参数名);如果一个参数对应多个值,例如多选框
Enumeration names =request.getParamentNames();返回所有参数名,是一个数组
Map<String,String[]> map =request.getParamentMap();,获取所有请求参数,封装的map中