Respose对象,用于生成http响应信息,对于开发人员来说就是向response对象中添加信息即可
响应首行
Http 200 ok
void setStaus(int sc)
void setStatus(int sc,String sm)
void sendError(int sc)
void sendError(int sc, String msg)
响应头
键:值
void setHeader(String name, String value) 设置键值对.
void setDateHeader(String name, long date) 设置键值对.
void setIntHeader(String name, int value) 设置键值对.
void addHeader(String name, String value) 添加键值对.
void addDateHeader(String name, long date)添加键值对.
void addIntHeader(String name, int value) 添加键值对.
响应空行
响应正文
给浏览器的资源
getWrite(); 字符流
getOutputStream() 字节流
//---------------------------------------------------------------------------
例1: 手动向浏览器 发送404错误状态码.
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(500,"找到也不告诉你 ");
}
}
例2: 访问BServlet,3秒后浏览器自动跳转到传智首页.
<meta http-equiv="Refresh" content="3;url=地址" > 用于模拟响应头的
public class CServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//response.setStatus(302);//告诉浏览器要重定向
//添加Location相应头 高速浏览器重定向到哪里
//response.setHeader("Location", "http://localhost:8080/");
response.sendRedirect("http://localhost:8080/");
}
}
例4: 向浏览器输出文字(字节流,中文)
public class EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置解码码表
//response.setCharacterEncoding("UTF-8");
//解码码表
//response.setHeader("Content-Type", "text/html;charset=UTF-8");//控制解码码表
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("黑马");
}
}
例5: 向浏览器输出文字(字符流,中文)
public class DServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Content-Type", "text/html;charset=GBK");//控制解码码表
response.getOutputStream().write("前".getBytes("GBK"));//将字符串变成字节流 默认码表就是UTF-8
}
}
//结论:
//1 输出中文建议使用字符流
//2 解决字符流乱码 使用setContentType放可以同时设置编码解码两端的码表.
//3 注意: 码表的设置一定放到输出之前
//4 注意: 字符流与字节流不能同时使用
例6: 向浏览器输出图片.(由servlet输出).
public class FServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获得图片的输入流
//获得输出浏览器的输入流
//两个对象对接
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/XXX1.jpg");
//获得输出到浏览器的输出流
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
}
}
例7: 文件下载(向浏览器输出内容)
public class GServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
String type = sc.getMimeType("abc.exe");
response.setContentType(type);
//0 设置响应头=> 提示用户保存名称 => Http协议不支持中文码表=> %E5%C3 => URLEncoder.encode("apache-汤姆-6.0.35.exe","UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("1.zip","UTF-8"));
// 1 获得文件的输入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/1.zip");
// 2 获得输出到浏览器的输出流
OutputStream os = response.getOutputStream();
// 3 两个流对接
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
}
}
Request
HTTP 请求协议
请求方式 请求首行 请求路劲 协议 /版本号
String getMethod() 获得请求方式
request.getContextPath 获得项目的路径
String getServletPath() 拿到Servlet的路径
request.getQueryString() name=tom?age=19 获得请求路径中的参数
request.getRequestURI(): /day08-request/AServlet 获得当前访问的相对路径,相对主机路径
request.getRequestURL(): http://localhost:8080/day08-request/AServlet 获得当前访问的绝对路径
request.getServletPath(): /AServlet 获得servlet路径
String getScheme() 获得协议协议
request.getContentLength(): -1 返回正文内容长度
request.getContentType(): null 返回正文内容类型
request.getLocale(): zh_HANS_CN 获得accept-language:zh_CN
request.getServerName(): localhost 获得主机名称
request.getServerPort(): 8080 获得访问端口号
String getHeader(String name) 根据键获得值(值只有一个)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaderNames() 获得所有请求头的名字
Enumeration getHeaders(String name) 根据键获得值(值有多个)
请求空行
请求正文 post才有请求正文 请求参数 => name=tom&age=18
String getParameter(String name ) 根据参数键获得参数值
Map<String,String[]> getParameterMap() 根据参数键获得参数值
Enumeration getParameterNames()获得所有参数的键
String[] getParameterValues(String name) 根据参数键获得参数值
如何获得表单上的键值对
String getParameter(String key); 根据键值获得值的方式
String[] getParamterValues(String key) 当一个键对应多个值时 该方法就会返回多个值
Enumeration getParameterNames () 获得参数的所有键
Map<String,String[]> getParameterMap() 获得封装所有键值对的map
1> 提交方式为get时.
2> 提交方式为post时.
//因为post提交,是在获得参数的同时才进行解码. 那么我们就可以在获得参数之前设置解码码表.
//注意: 设置编码的代码一定要放到,获得参数代码之前
req.setCharacterEncoding("UTF-8");
request的其他功能
1. 请求转发/请求包含
请求转发:
一个servlet里面处理逻辑, 将处理结果交给下一个Servlet(JSP)负责显示.
操作(代码):
request.getRequestDispatcher("/EServlet").forward(request,response);
转发与重定向的异同
1 浏览器一共发了多少次请求
重定向:两次请求
转发:一次请求
2浏览器地址发生变化与否
重定向 地址发生改变
转发: 不会发生改变
3 会改变请求方式吗
重定向:未必 重定向的第二次不一定是
转发: 不会
4.request 可不可以共享数据
重定向 不可以
转发:可以 因为在一个请求范围之中
注意:
Servlet 向jsp转发 servlet专注于逻辑处理 Jsp注重现实和结果的处理 不要在应该处理逻辑的地方做显示操作。也就是说在servlet中不要使用字符流或字节流做任何输出的动作(不能添加响应正文)。 可以添加响应头。
转发的Servlet不可以向response的正文中添加任何内容.但是可以向响应头添加内容.
//------------------------------------------------------------------------------------------------------------------------------------------
请求包含
一般请求包含不会在两个servlet中进行.都是在两个jsp中进行.
当在多个页面总有需要重复显示的内容. 我们可以把这段内容封装到一个jsp中. 以后凡是要显示这段重复的内容时,只需要把封装的jsp包含进来即可.
操作(代码):
request.getRequestDispatcher("/XXX").include(request,response);
//----------------------------------------------------------------------------------------------------
Request 域
request 域就是一个放在request对象的声明map
request域范围
与request对象的声明周期是一样的 请求达到服务器是,request对象创建当服务器响应浏览器之后, request对象销毁.
request 域通常在请求装发时候使用 servlet处理结果,将结果放在request域中带给jsp显示.
setAttribute(key,value)
getAttribute(key)
removeAttribute(key)
getAttributeNames()
//------------------------------------------------------------------------------------------------------
什么时候使用转发
servlet负责处理逻辑,JSP用于显示,需要共享数据,一定使用转发 ,使用重定向会让数据丢失
当需要跳转到站外是,一定只能使用重定向