response对象和request对象
response对象(响应对象)
想要获取客户端的内容,使用request对象。对客户端做出响应使用response对象
响应
响应行
状态码:
void setStatus(int sc) 设置状态码
响应头(key:value的形式,1个key1个value/多个value)
设置头信息
void setHeader(String name, String value) 1对1(经常使用)
setHeader("aa","bb");
setHeader("aa","cc");
结果aa:cc
void setIntHeader(String name, int value)
void setDateHeader(String name, long date) 值是毫秒值(一般int 秒 long 毫秒)
void addHeader(String name, String value) 1对多
addHeader("aa","bb");
addHeader("aa","cc");
结果aa:bb,cc
void addIntHeader(String name, int value)
void addDateHeader(String name, long date)
响应体
ServletOutputStream getOutputStream() 字节输出流
PrintWriter getWriter() 字符输出流
案例:
重定向(登陆界面)
登陆界面重定向
状态码302 响应头location
需求:登陆界面,用户名和密码的登陆界面,用户名和密码都是admin。用户名和密码都是admin
如果有一个不是,重定向到登陆界面,重新登陆
//设置302的状态码
response.setStatus(302);
//设置地址
response.setHeader("location", "/day10/response/login.html");
//response提供了一个方法,可以完成重定向
response.sendRedirect("/day10/response/login.html");
页面定时刷新(页面读秒操作)
响应头 refresh
禁用浏览器缓存(三个头信息)
应用:网银。页面的数据是发送变化的
Cache-Control:no-cache
Expires:-1 值是日期类型(setDateHeader)
Pragma:no-cache
向页面输出中文(乱码问题)
ServletOutputStream getOutputStream() 字节输出流
字节输出流
/*
* 字节输出中文的乱码
* 输出 你好啊 是否乱码呢?
* 不一定乱码
* 解决办法
* 设置浏览器打开文件时所采用的编码
* response.setHeader("Content-Type", "text/html;charset=UTF-8");
* 获取字符串byte数组时的编码和打开文件时编码一致
* */
PrintWriter getWriter() 字符输出流
字符输出流
/*
* 字符输出中文是否乱码
* 肯定乱码
* response缓冲区,编码的默认值是ISO-8859-1不支持中文
* 设置response缓冲区编码
* response.setCharacterEncoding("UTF-8");
* 设置浏览器打开文件时的编码
*
* */
实现验证码
总结:response对象输出中文产生乱码
字节
解决方案:
设置浏览器打开文件时的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
获取字符串byte数组采用的编码
os.write("你好啊".getBytes("UTF-8"));
字符
解决方案
设置浏览器打开文件时的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
设置response缓冲区编码
response.setCharacterEncoding("UTF-8");
简写方式 response.setContentType("text/html;charset=UTF-8");
实现文件下载(初级的下载)
超链接,浏览器可以解析就直接打开
弹出下载窗口
前提条件:先准备一个文件。
读取文件,读入到输入流中
通过response读出到浏览器端
设置头信息
Content-Disposition attachment;filename=文件名称
以附件形式下载
验证码
现在内存中生成一张图片(画步,纸)
BufferedImage对象
BufferedImage(int width, int height, int imageType)构造方法
获取画笔对象
Graphics getGraphics()
随机生成,但是数据是准备的
随机生成4个字符 Random类
通过画笔对象把数字画到图片上
drawString(String str, int x, int y)
画干扰线
drawLine(int x1, int y1, int x2, int y2)
需要把内存中的图片输出到客户端上
ImageIO.write(RenderedImage im, String formatName, OutputStream output)
BufferedImage
"jpg"
response.getOutputStream()
request对象(请求对象)
ServletRequest
|
HttpServletRequest
获取客户机的信息
getRemoteAddr(****) 获取ip地址
getMethod() 获取请求方式
getContextPath() 获取虚拟路径(默认和项目名称相同)
getQueryString()(了解)
/day10/demo?username=zhangsan?password=123
获取请求头信息
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
请求头
referer 记住网页的来源
User-Agent 判断浏览器哦
if-modified-since 控制缓存
获取请求参数(****)
String getParameter(String name) (****)
String[] getParameterValues(String name) (****)
Map getParameterMap() (****)
Enumeration getParameterNames() (用的比较少)
解决request乱码问题
post请求
* void setCharacterEncoding(String env) //设置request缓冲区的编码
get请求
* 解决方案三(****):简写的方式
* username = new String(username.getBytes("ISO8859-1"),"utf-8");
*
* 解决方案一:修改tomcat/conf/server.xml
* <Connector port="80"....>....URLEncoding="utf-8"/>
*
* 解决方案二:逆向编解码
* username = URLEncoder.encode(username,"ISO8859-1:);
* username = URLDecoder.decode(username,"utf-8");
*
利用请求域传递对象(request域对象)
域对象
ServletContext :服务器一启动,为每个web应用创建一个ServletContext对象,所有的
servlet实例共享对象
request:一次请求的范围
setAttribute("","")
getAttribute("")
removeAttribute("")
RequestDispatcher getRequestDispatcher(String path)
RequestDispatcher:
void forward(ServletRequest request, ServletResponse response) 转发的方法
void include(ServletRequest request, ServletResponse response) (了解)包含
重定向和转发的区别(转发)
重定向两次请求,两次响应
转发是一次请求,一次响应
重定向地址发生了变化
转发地址栏没有变化
重定向不能使用request域传递数据
转发传递数据
重定向可以定向其他系统
转发只能在系统内部