JavaWeb学习__第4天__response与request

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
    request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

1.response

    Response代表响应,于是响应消息中的 状态码、响应头、实体内容都可以由它进行操作
    Resonse的继承结构:ServletResponse--HttpServletResponse.

使用response案例:

//1.向浏览器输出数据
//设置response用指定编码集编码
response.setCharacterEncoding("utf-8");
//设置Header向浏览器注明以指定编码读取
response.setHeader("Content-type", "text/html;charset=utf-8");
response.getWriter().write("我是中国人");
//2.利用response实现文件下载
//设置下载相关header
response.setHeader("content-Disposition", "attachment;filename="+URLEncoder.encode("小美女.png", "utf-8"));
OutputStream ot = response.getOutputStream();
InputStream is = new FileInputStream(this.getServletContext().getRealPath("/HTTP响应.png"));

byte[] by = new byte[1024];
int length = 0;
while((length=is.read(by))!=-1){
	ot.write(by, 0, length);
}
is.close();
3.利用refresh控制定时刷新
response.setHeader("Refresh","3;url='/Myday04/servlet/response3'");
response.getWriter().write(new Date().toLocaleString());
4.控制是否缓存资源
response.setDateHeader("expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.getWriter().write(new Date().toLocaleString());
5.response实现请求重定向
/*response.setStatus(302);
response.setHeader("Location", "/Myday04/index.jsp");*/
//一步搞定
response.sendRedirect("/Myday04/index.jsp");

利用Response输出数据到客户端乱码问题解决:
    response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服务器端使用了非平台码去输出字符的字节数据就需要明确的指定浏览器编码时所用的码表,以防止乱码问题。response.addHeader("Content-type","text/html;charset=utf-8")

    response.getWriter().write("中文");输出数据,这是一个字符流,response会将此字符进行转码操作后输出到浏览器,这个过程默认使用ISO8859-1码表,而ISO8859-1中没有中文,于是转码过程中用?代替了中文,导致乱码问题。可以指定response在转码过程中使用的目标码表,防止乱码。response.setCharcterEncoding("utf-8");
    其实response还提供了setContentType("text/html;charset=uft-8")方法,此方法会设置content-type响应头,通知浏览器打开的码表,同时设置response的转码用码表,从而一行代码解决乱码。

利用Response 设置 content-disposition头实现文件下载(具体实现看以上代码)
    1.设置响应头content-disposition为“attachment;filename=xxx.xxx
    2.利用流将文件读取进来,再利用Response获取响应流输出
    3.如果文件名为中,一定要进行URL编码,编码所用的码表一定要是utf-8(URLEncoder.encode(文件名,"utf-8");

refresh头控制定时刷新
    1.设置响应头Refresh为一个数值,指定多少秒后刷新当前页面
    2.设置响应头Refresh为 3;url=/Day05/index.jsp,指定多少秒后刷新到哪个页面
    3.可以用来实现注册后“注册成功,3秒后跳转到主页”的功能
    4.在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能。

response实现请求重定向
        古老方法:response.setStatus(302);response.addHeader("Location","/Myday04/index.jsp
");
        快捷方式:response.sendRedirect("/Myday04/index.jsp");

response生成响应注意事项

    getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  
    Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。

2.request

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。通过Request对象进行的常用操作:

//1.返回客户端发出完整请求的URL
String url = request.getRequestURL().toString();
System.out.println(url);
//2.返回客户端发出完整请求的资源名称
String uri = request.getRequestURI();
System.out.println(uri);
//3.返回请求行中参数部分
String query = request.getQueryString();
System.out.println(query);
//4.返回请求客户端的IP地址
String ip = request.getRemoteAddr();
System.out.println(ip);
//5.得到客户机的请求方式
String method = request.getMethod();
System.out.println(method);
//6.得到当前WEB应用的虚拟路径名
String name = request.getContextPath();
System.out.println(name);
request获取请求头信息:
    getHeader(name)方法 --- String 
    getHeaders(String name)方法 --- Enumeration<String>
    getHeaderNames方法 --- Enumeration<String>
    获得具体类型客户机请求头    getIntHeader(name)方法  --- int
    getDateHeader(name)方法 --- long(日期对应毫秒)

request获取请求参数
    getParameter(name) --- String 通过name获得值
    getParameterValues(name)  --- String[ ] 通过name获得多值 checkbox
    getParameterNames  --- Enumeration<String> 获得所有请求参数名称组成的枚举
    getParameterMap  --- Map<String,String[ ]> 获取所有请求参数的组成的Map集合,注意,其中的键为String,值为String[]

获取请求参数时乱码问题:
    浏览器发送的请求参数使用什么编码呢?当初浏览器打开网页时使用什么编码,发送就用什么编码。服务器端获取到发过来的请求参数默认使用ISO8859-1进行解码操作,中文一定有乱码问题
    对于Post方式提交的数据,可以设置request.setCharacterEncoding("gb2312");来明确指定获取请求参数时使用编码。但是此种方式只对Post方式提交有效。
    对于Get方式提交的数据,就只能手动解决乱码:String newName = new String(name.getBytes("ISO8859-1"),"gb2312");此种方法对Post方式同样有效。
    注:在tomcat的server.xml中可以配置http连接器的URIEncoding可以指定服务器在获取请求参数时默认使用的编码,从而一劳永逸的决绝获取请求参数时的乱码问题。也可以指定useBodyEncodingForURI参数,令request.setCharacterEncoding也对GET方式的请求起作用,但是这俩属性都不推荐使用,因为发布环境往往不允许修改此属性。

利用request请求域传递对象
    生命周期:在service方法调用之前由服务器创建,传入service方法。整个请求结束,request生命结束。
    作用范围:整个请求链。
    作用:在整个请求链中共享数据,最常用的:在Servlet中处理好的数据要交给Jsp显示,此时参数就可以放置在Request域中带过去。

request实现请求转发

    request.getRequestDispatcher("").forward(request,response);
    在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常
    在forward之前输入到response缓冲区中的数据,但是还没有发送到客户端,forward可以执行,但是缓冲区将被清空,之前的数据丢失。注意丢失的只是请求体中的内容,头内容仍然有效。
    在一个Servlet中进行多次forward也是不行的,因为第一次forward结束,response已经被提交了,没有机会再forward了


request实现请求包含

request.getRequestDispatcher("").include(request,response);
    forward没有办法将多个servlet的输出组成一个输出,因此RequestDispatcher提供了include方法,可以将多个Servlet的输出组成一个输出返回个浏览器。将包含之前的内容和包含之后的内容合并后进行输出

    被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。

request.getRequestDispatcher("/servlet/Demo17Servlet").include(request, response);
response.getWriter().write("from Demo16");
request.getRequestDispatcher("/servlet/Demo18Servlet").include(request, response);
    常用在页面的固定部分单独写入一个文件,在多个页面中include进来简化代码量。

请求重定向、请求转发
    1.请求重定向的原理是302+Location通知浏览器访问其他资源,而请求转发是服务器内部流转
    2.请求重定向两次请求两次响应。请求转发只有一次请求一次响应
    3.请求重定向地址栏会发生变化,请求转发地址栏不会发生变化
请求转发和请求重定向都可以实现资源的跳转:
    1.如果在跳转之前和跳转之后有属性需要使用request域进行传递,则必须用请求转发
    2.如果希望改变地址栏必须使用请求重定向
    3.一般情况下都使用请求转发,减少请求的次数减少服务器压力

3.路径专题

    1.虚拟路径,如果路径是给浏览器用的则必须写上web应用的名称,如果路径是给服务器用的,则web应用名称不要写,
    虚拟路径请全都使用绝对路径,保证路径永远是正确。
    request.getRequestDispatcher("/index.jsp").foward();
    response.setHeader("Location","/Day04/index.jsp");
    response.sendRedirect("/Day04/index.jsp");
    response.setHeader("refresh","3;url=/Day04/index.jsp")
    <a href="/Day04/index.jsp"></a>
    <form actio="/Day04/index.jsp">
    <img src="/Day04/1.jpg">

    2.真实路径:根据具体原理具体分析,在写真实路径时,全都使用相对路径
    File file = new File("1.txt");
    InputStream in= new FileInputStream("1.txt");
    ClassLoader.getResource("../../1.jpg").getPath();//--给一个相对于类加载目录的路径
    ServletContext.getRealPath("1.jpg");//--相对于当前web应用目录的路径
=============================
    相对路径:不以/开头的路径就叫做相对路径,基于当前的路径计算一个新的路径
    绝对路径:以/开头的路径就叫做绝对路径,直接将绝对路径拼接在相对于的那个目录上得到新的路径


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值