response
1.response发送状态码
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(404, "你请求的资源存在,但不给你看!");
}
}
得到的结果
2.一些响应头
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* //适用于多值的响应头
response.addHeader("aaa", "A");
response.addHeader("aaa", "AA");
//适用于单值int类型
response.setIntHeader("Content-Lenth", 888);
//第二个参数为毫秒
response.setDateHeader("expires", 1000*60);*/
//****发送错误状态码
response.sendError(404, "你请求的资源存在,但不给你看!");
//*****适用于单值的响应头
response.setHeader("aaa", "AAA");
}
}
3. 演示重定向
用戶請求BServlet 然后BServlet响应302 给出Location 头
快捷重定向方法:
sendRedirect("day10_1/CServlet");
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示重定向
//用戶請求BServlet 然后BServlet响应302 给出Location 头
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("BServlet");
/**
* 重定向
* 1.设置Location
* 2.发送302状态码
*/
//
// response.setHeader("Location", "/day10_1/CServlet");
// response.setStatus(302);
//快捷重定向
// response.sendRedirect("day10_1/CServlet");
response.sendRedirect("http://www.baidu.com");
}
}
4.演示定时刷新
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示定时刷新
public class DServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置一个Refresh 表示定时刷新
PrintWriter writer = response.getWriter();
writer.print("欢迎xxx登录!5s后自动跳转到主页");
response.setHeader("Refresh", "5;URL=/day10_1/CServlet");
}
}
5.禁用浏览器缓存
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//禁用浏览器缓存
//从index。jsp 可以看到这三个参数名字
/**
* <meta>标签可以代替响应头
*<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
*
*/
public class FServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("hello world");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma","no-cache");
response.setDateHeader("expires", 0);
}
}
6.response的两个流:
⑴.ServletOutputStream 用来向客户端发送字节数据
ServletOutputStream sot = response.getOutputStream();
⑵.PrintWriter 用来向客户端发送字符数据 需要设置编码
PrintWriter writer = response.getWriter();
响应字节数据
IO工具包
commons-io-1.4.jar 下载 丢进lib包里
package cn.itcast.servlet;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
public class GServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* String string = "Hello outputStream";
byte[] bytes =string.getBytes();
response.getOutputStream().write(bytes);
*/
//演示响应字节数据
//把一张图片读取到字节数组中
String path ="F:/a.jpg";
FileInputStream in = new FileInputStream(path);
byte[] bytes = IOUtils.toByteArray(in); //读取输入流内容的字节到字节数组中
response.getOutputStream().write(bytes);
//最终会把图片显示出来
}
}
request
封裝了客戶端所有的请求数据
1.获取常用信息:⒈获取客户端IP:request.getRemoteAddr()
⒉请求方式:request.getMethod(),可能是post也可能是get
2.获取Http请求头:String getHeader(String name ) 适用于单值头
3.通过User-Agent 识别用户浏览器类型
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* 获取客户端Ip地址
* 获取请求方式
* 获取User-Agent,得到客户端的信息(操作系统浏览器)
*
*
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String addr = request.getRemoteAddr(); //获取客户端的IP地址
System.out.println("IP为:" + addr);
System.out.println("请求方式:" + request.getMethod()); //获取请求方式(几乎都是get 只有表单发post)
String userAgent = request.getHeader("User-Agent"); //获取名为User-Agent的请求头
System.out.println("" + userAgent);
/**
* IP为:0:0:0:0:0:0:0:1
请求方式:GET
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
*/
//判断是否包含Chrome 是否在谷歌浏览器运行
if (userAgent.toLowerCase().contains("chrome")) {
System.out.println("谷歌浏览器");
}else if (userAgent.toLowerCase().contains("firefox")) {
System.out.println("火狐浏览器");
}else if (userAgent.toLowerCase().contains("msie")) {
System.out.println("IE浏览器");
}
}
}
4.通过request来获取url的相关方法
如请求URL为 http://localhost:8080/day10_2/AServlet?username=123&password=abc
String getScheme() 获取协议 http
String getServerName() 获取服务器名 localhost
String getServerPort() 获取服务器端口 8080
String getContextPath() 获取项目名 /day10_2
String getServletPath() 获取Servlet路径 /AServlet
String getQueryString() 获取参数部分,即问号后面的部分 username=123&password=abc
String getRequestURI() 获取请求URI 等于项目名加Servlet路径 /day10_2/AServlet
String getRequestURL() 获取请求URL 等于不包含参数的整个请求路径即 问号前面的 http://localhost:8080/day10_2/AServlet
所以一般获取getRequestURL() 和getQueryString () 即全部的地址
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
//通过request来获取url的相关方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print(request.getScheme()+ "<br/>"); //获取请求协议
response.getWriter().print(request.getServerName()+"<br/>"); //获取服务器名称
response.getWriter().print(request.getServerPort()+"<br/>"); //获取服务器端口号
response.getWriter().print(request.getContextPath() + "<br/>"); //获取项目名称
response.getWriter().print(request.getServletPath() + "<br/>"); //获取Servlet路径
response.getWriter().print(request.getQueryString() + "<br/>"); //获取参数部分
response.getWriter().print(request.getRequestURI() + "<br/>"); // 获取请求URI
response.getWriter().print(request.getRequestURL() + "<br/>"); //获取请求URL
}
}
这个在谷歌浏览器输出<br/>标签并没有换行 在ie可以换行
暂时还不知道原因
5.防盗链:如果请求不是通过本站的超链接发出,则报404.
在a.html添加這一句
<body>
<a href="/day10_2/BServlet">xxx</a>
</body>
然后Servlet这样写
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
//使用referer请求头 来防盗链
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String referer = request.getHeader("Referer");
System.out.println(referer);
if(referer ==null || !referer.contains("localhost")){
System.out.println("hello");
}else{
response.sendRedirect("http://www.baidu.com");//快捷定向
}
}
}
6。演示request获取请求参数
首先建一个html
<!DOCTYPE html>
<html>
<head>
<title>a.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<h1>测试请求参数</h1>
<a href="/day10_3/AServlet?xxx=XXX&yyy=YYY">点击这里</a>
<hr/>
<form action="/day10_3/AServlet" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
爱好: <input type="checkbox" name="hobby" value="cf"/>吃饭
<input type="checkbox" name ="hobby" value="sj"/>睡觉
<input type="checkbox" name="hobby" value="ddm"/>打代码
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
package cn.itcast.servlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
//演示request获取请求参数
//get获取xxx yyy
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("GET:" + request.getParameter("xxx"));
System.out.println("GET:" + request.getParameter("yyy"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//单值
String username = request.getParameter("username");
String password = request.getParameter("password");
// 多值
String[] hobby = request.getParameterValues("hobby");
System.out.println(username +"..." + password +"..." + Arrays.toString(hobby));
//测试获取所有请求参数的名称
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
System.out.println(names.nextElement());
}
//获取所有请求参数 封装到Map中
Map<String , String[]> map = request.getParameterMap();
for(String name:map.keySet()){
String[] value = map.get(name);
System.out.println(name +"="+Arrays.toString(value));
}
System.out.println(map);
}
}
7.请求转发 forward one留头不留体
package cn.itcast.servlet.forward;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示请求转发
//one 留头不留体
@WebServlet("/OneServlet")
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在使用getWriter()方法之前 调用以下编码方法
response.setContentType("text/html;charset=utf-8");
System.out.println("OneServlet....");
response.setHeader("aaa", "AAA"); //设置响应头
// for(int i=0;i<1024*24+1;i++){
// response.getWriter().print("Hello OneServlet"); //设置响应体 这个会被忽略 但要是响应体太多 会直接抛异常 所以这段话应该废弃 (测试效果)
//java.lang.IllegalStateException: Cannot forward after response has been committed
// }
//向request域中添加一个属性
request.setAttribute("username", "zhangsan");
//等同于调用TwoServlet的service方法
request.getRequestDispatcher("/TwoServlet").forward(request,response); //请求转发
}
}
package cn.itcast.servlet.forward;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TwoServlet")
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getAttribute("username"));
System.out.println("TwoServlet...");
response.getWriter().print("hello TwoServlet"); //设置响应体
}
}
8。请求包含 include 留头又留体
package cn.itcast.servlet.include;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示请求包含 留头又留体
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CServlet....");
response.setHeader("aaa", "AAA"); //设置响应头
response.getWriter().print("Hello CServlet");
//等同于调用TwoServlet的service方法
request.getRequestDispatcher("/DServlet").include(request,response); //请求转发
}
}
package cn.itcast.servlet.include;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DServlet")
public class DServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DServlet...");
response.getWriter().print("hello DServlet"); //设置响应体
}
}
9 编码(这个看看就行 好像Tomcat 8 不适合 先写着吧)
<!DOCTYPE html>
<html>
<head>
<title>form.html</title>
//这句话不加会乱码
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
This is my HTML page. <br>
<form action="/day10_4/AServlet" method="post">
用户名:<input type="text" name="username" value="李四"/><br/>
<input type="submit" value="提交"/>
</form>
<hr/>
<a href="/day10_4/AServlet?username=张三">GET</a>
</body>
</html>
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1。先获取来使用iso的错误字符串
* 2.回退,使用utf8重编
* 这是tomcat8之前的版本用 的 8以后自动utf8编码
*/
String name =request.getParameter("username");
// byte[] b = name.getBytes("iso-8859-1");
// name = new String(b,"utf-8");
System.out.println(name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1.在获取参数之前 需先调用request.setCharacterEncoding("utf-8");
* 2.使用getParameter()获取参数 username=%E5%BC%A0%E4%B8%89 =李四
*/
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
}
}
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//打印到页面的时候让其编码为utf-8
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("请查看是否有session这个cookie");
}
}