技术笔记:Resonse9_Response对象2

简介: 技术笔记:Resonse9_Response对象2

1. 功能:设置响应消息


 a. 设置响应行


   格式:HTTP/1.1 200 ok


   设置状态码:void setStatus(int sc)


 b. 设置响应头


   void setHeader(String name, String value)


 c. 设置响应体:


  使用步骤:


   1、获取输出流


     字符输出流:PrintWriter getWriter()


     字节输出流:ServletOutputStream getOutputStream()


   2、使用输出流,将数据输出到客户端浏览器


2. 重定向


 a、重定向:资源跳转的方式


 b、实现方法:


  方法一:


    //1. 设置状态码为302


    response.setStatus(302);


    //2.设置响应头location


    response.setHeader("location","/day09/responseDemo2");


  方法二:


    //简单的重定向方法


    response.sendRedirect("/day09/responseDemo2");


  代码实现:


   一:header重定向


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


/**


重定向


/


@WebServlet("/responseDemo1")


public class ResponseDemo1 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


System.out.println("demo1.....");


//访问/responseDemo1,会自动跳转到/responseDemo2资源


//1. 设置状态码为302


response.setStatus(302);


//2. 设置响应头location


response.setHeader("location","/day09/responseDemo2");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


/**


重定向


/


@WebServlet("/responseDemo2")


public class ResponseDemo2 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


System.out.println("demo2.....");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


    浏览器访问检查输出:


   二:简单的重定向


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


/**


重定向


/


@WebServlet("/responseDemo1")


public class ResponseDemo1 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


System.out.println("demo1.....");


//简单的重定向方法


response.sendRedirect("/day09/responseDemo2");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


     浏览器访问检查输出同实现一


 c、重定向的特点:redirect


  1、地址栏发生变化


  2、重定向可以访问其他站点(服务器)的资源


  3、重定向是两次请求。不能使用request对象来共享数据


 d、转发的特点:forward


  1. 转发地址栏路径不变


  2. 转发只能访问当前服务器下的资源


  3. 转发是一次请求,可以使用request对象来共享数据


 e、forward和redirect 区别:见c和d


 f、路径写法:路径分类


   1、相对路径:通过相对路径不可以确定唯一资源。不推荐。


      如:./index.html


      不以/开头,以.开头路径


      规则:找到当前资源和目标资源之间的相对位置关系


         ./:当前目录


         ../:后退一级目录


   2、绝对路径:通过绝对路径可以确定唯一资源。推荐


      如: /day09/responseDemo2


      以/开头的路径


      规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出


         给客户端浏览器使用:需要加虚拟目录(项目的访问路径application context)


           建议虚拟目录动态获取:request.getContextPath()


           ,,重定向都是给客户端浏览器使用,所以需要加虚拟目录


         给服务器使用:不需要加虚拟目录


           (request.getRequestDispatcher("/requestDemo9").forward(request,response);)转发路径是给服务器用的,不需要加虚拟目录


   3、代码实现


    三、相对路径1


     web包中新建location.html


Title


找到当前资源和目标资源之间的相对位置关系


当前资源:location.html


目标资源:responseDemo2


responseDemo2


     浏览器访问点击responseDemo2链接,检查输出:


    四、相对路径2


     web包中新建Directory:htmls,把location.html粘过来改名location2.html


Title


找到当前资源和目标资源之间的相对位置关系


当前资源:location2.html


目标资源:responseDemo2


responseDemo2


     浏览器访问点击responseDemo2链接,检查输出同四中结果


    五、绝对路径:给客户端用的


     更改location.html


Title


相对路径


找到当前资源和目标资源之间的相对位置关系


当前资源:location.html


目标资源:responseDemo2


responseDemo2


responseDemo2


绝对路径


responseDemo2


     浏览器访问点击绝对路径下的“responseDemo2”,检查输出:


    六、绝对路径:对服务器端用的


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


@WebServlet("/responseDemo3")


public class ResponseDemo3 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


System.out.println("demo3.....");


//转发


request.getRequestDispatcher("/responseDemo2").forward(request,response);


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


     浏览器访问浏览器访问会自动访问reponseDemo2,检查输出:  


    七、绝对路径:动态获取虚拟路径


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


/*


重定向


/


@WebServlet("/responseDemo1")


public class ResponseDemo1 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


System.out.println("demo11.....");


request.setAttribute("msg","response");


//动态获取虚拟目录


String contextPath = request.getContextPath();


//简单的重定向方法


response.sendRedirect(contextPath+"/responseDemo2");


}


//代码效果参考:http://hnjlyzjd.com/hw/wz_24697.html

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);


}


}


     重启tomcat服务器,浏览器访问检查输出:


     使用这种方式,更换项目路径时,不需要更改重定向中的路径。


3. 服务器输出字符数据到浏览器


  a. 步骤:


    1、获取字符输出流:PrintWriter pw = response.getWriter();


    2、输出数据:pw.write("hello response");


  b. 注意:中文会出现乱码问题。


    乱码原因:编解码使用的字符集不一致。浏览器字符集默认为GBK(gb2312),而PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1,是tomcat返回的编码。


    解决办法:获取流对象之前设置该流的默认编码并告诉浏览器响应体使用的编码


       response.setCharacterEncoding("GBK");


       设置流的默认编码为GBK,如果设为utf-8浏览器解析中文就会出问题


       //代码效果参考:http://hnjlyzjd.com/xl/wz_24687.html

response.setHeader("content-type","text/html;charset=utf-8");

       告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码


       response.setContentType("text/html;charset=utf-8");


       简单的形式,在获取流之前设置编码并告诉浏览器使用该编码进行解码。推荐!


   c. 代码实现:


    一:输出数据到浏览器


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


import java.io.PrintWriter;


@WebServlet("/responseDemo4")


public class ResponseDemo4 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


//1、获取字符输出流


PrintWriter pw = response.getWriter();


//2、输出数据


pw.write("hello response");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


   浏览器访问检查浏览器展示,可以看到会把标签解析了。


  二:解决GBK中文乱码


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


import java.io.PrintWriter;


@WebServlet("/responseDemo4")


public class ResponseDemo4 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK


response.setCharacterEncoding("GBK");


//1、获取字符输出流


PrintWriter pw = response.getWriter();


//2、输出数据


pw.write("你好 response");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


    浏览器访问检查浏览器输出:你好 response


  二、彻底解决乱码问题


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


import java.io.PrintWriter;


@WebServlet("/responseDemo4")


public class ResponseDemo4 extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:utf-8


response.setCharacterEncoding("utf-8");


//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码


response.setHeader("content-type","text/html;charset=utf-8");


//1、获取字符输出流


PrintWriter pw = response.getWriter();


//2、输出数据


pw.write("你好 response");


}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


this.doPost(request,response);


}


}


    浏览器访问浏览器会按照从服务器端接收到的utf-8进行解码,输出:你好 response;


    可以不写setCharacterEncoding直接用response.setHeader()的方式进行解决中文乱码问题


   三、简单的形式


    response.setHeader("content-type","text/html;charset=utf-8");的简化写法:


    response.setContentType("text/html;charset=utf-8");


package cn.itcast.web.servlet;


import javax.servlet.ServletException;


import javax.servlet.annotation.WebServlet;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.IOException;


import java.io.PrintWriter;


@WebServlet("/responseDemo4")


public class ResponseDemo

相关文章
|
3月前
|
Java 缓存
response.setHeader用法总结
response.setHeader用法总结
|
3月前
|
XML JSON 前端开发
response.setcontenttype用法详解
response.setcontenttype用法详解
|
9月前
|
JSON 缓存 Java
修改Request与Response中的内容
修改Request与Response中的内容
77 0
|
11月前
|
Web App开发 Java 应用服务中间件
学习Request和Response这一篇就够啦~1
学习Request和Response这一篇就够啦~
|
11月前
|
IDE 开发工具
学习Request和Response这一篇就够啦~2
学习Request和Response这一篇就够啦~
|
前端开发 Java 应用服务中间件
细谈JavaWeb中的Request和Response
request:获取请求数据 浏览器会发送HTTP请求到后台服务器[Tomcat] HTTP的请求中会包含很多请求数据[请求行+请求头+请求体] 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
261 0
|
Java 应用服务中间件
Servlet第三篇【request和response简介、response的常见应用】(三)
Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象
198 0
Servlet第三篇【request和response简介、response的常见应用】(三)
|
编解码 应用服务中间件 API
Servlet第三篇【request和response简介、response的常见应用】(一)
Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象
210 0
Servlet第三篇【request和response简介、response的常见应用】(一)