JavaWeb(响应数据 请求参数 重定向与内部转发 请求域 响应请求中文乱码)

响应对象和请求对象

void service(ServletRequest var1,ServletResponse var2)
在Servlet的service()方法上,有两个形参,请求对象和响应对象

ServletRequest请求对象,定义将客户端请求信息提供给某个servlet的对象,servlet容器创建ServletRequest对象,并将该对象作为参数传递给该servlet的service方法

ServletResponse响应对象,定义辅助servlet将响应发送到客户端的对象,servlet容器创建ServletResponse对象,并将它作为参数传递给servlet的service方法

request和response都是由服务器创建 管理和销毁,作为形参传递给 service()方法

请求对象,用来封装请求的数据,我们可以从请求对象,获取请求数据
响应对象,我们要返回给浏览器的数据,可以封装在响应对象

一次请求和响应结束后 服务器就会销毁请求对象和响应对象,下一次在请求,服务器又会创建一对新的请求对象和响应对象

继承体系结构:
    ServletRequest(接口)<--继承<--HttpServletRequest(接口)<--实现 org.apache.catalina.connector.RequestFacade@6049a827
    ServletResponse(接口)<--继承--HttpServletResponse(接口)<--实现org.apache.catalina.connector.ResponseFacade@3bec9d4

响应对象–响应行(重定向)

设置响应行:
	HTTP/1.1   200   ok
	setStatus(int code);设置响应状态码
	
	重定向可以进行资源(图片 servlet 页面 文件)的跳转
	跳转页面
	重定向 设置响应状态码
    response.setStatus(302);
    在设置响应头 
    response.setHeader("location","https://www.163.com");
    response.setHeader("location","/项目路径/页面");
	---------------------
    以上两步可以简化成一个方法
    response.sendRedirect("https://www.163.com");
	重定向的特点:
        1.两次请求 两次响应
        2.地址栏会发生变化
        3.重定向 就可以跳转外部资源 也可以跳转自己服务器资源
          但是不能访问WEB-INF下的资源

响应对象–响应头(响应中文乱码问题)

设置响应头: 例如:content-type:text/html;charset=utf-8
	设置响应头的名称和值
    setHeader(String headName,String headValue); 
    设置日期头
    setDateHeader(String name,long date);
    设置数字头
    setIntHeader(String name,int count); 

response 响应对象
响应一些数据给浏览器

响应中文时,为什么会乱码???
    解码表不一致
    web项目来说就是服务器和浏览器使用的码表不一致
    Tomcat服务器默认使用的编码是ISO-8859-1
    浏览器在解码时,浏览器没有ISO-8859-1码表
    
解决响应中文时乱码问题???
	在服务端来设置编码
	response.setCharacterEncoding("UTF-8");
	还得告诉浏览器,服务端用的是utf-8编码,浏览器切换成utf-8来解码,通过响应头来告诉浏览器用utf-8解码
	response.setHeader("content-type","text/html;charset=utf-8");
	-----------------------
	以上两行代码 综合成一行代码
	response.setContentType("text/html;charset=utf-8");

响应对象–响应体(响应数据)

设置响应体:
	响应体响应的是数据,得通过流的方式,获取输出流写出数据
	发送字符数据的对象
	PrintWriter getWriter();
	发送字节数据的对象
	ServletOutputStream getOutputStream(); 	

响应文本数据
	其实就是响应HTML代码
	也就是响应了一个HTML页面
	PrintWriter writer = response.getWriter();
    writer.write("<h1 style='color:red'>");
    writer.write("Welcome 欢迎光临我的首页");
    writer.write("</h1>");

响应字节数据
	//使用响应对象,响应字节数据
    ServletContext servletContext = this.getServletContext();
    //获取服务器真实路径
    String realPath = servletContext.getRealPath("/WEB-INF/0.jpg");
    FileInputStream in = new FileInputStream(realPath);
    ServletOutputStream out = response.getOutputStream();
    byte[] bytes = new byte[1024 * 8];
    int readLen = 0;
    while ((readLen=in.read(bytes))!=-1){
        out.write(bytes,0,readLen);
        out.flush();
    }
    in.close();
    out.close();

请求对象–请求参数

请求行
    request请求对象
    //获取请求方式
    request.getMethod();
    //获取项目名称
    request.getContextPath();
    获取目标项目地址
    request.getServletPath()
    //获取URI
    request.getRequestURI();
    //获取URL
    request.getRequestURL();
    //获取客户端IP地址
    request.getRemoteAddr();
    //获取协议版本
    request.getProtocol();
    //get请求时获取请求参数
    request.getQueryString();
    //POST请求时获取请求参数
    BufferedReader reader = request.getReader();
    reader.readLine();
    
    
请求头
    //获取请求头的值
    request.getHeader("请求头名");
    //获取日期头
    request.getDateHeader(name);
    //获取数字头
    request.getIntHeader(name);

请求体
    专门用于封装post请求的请求参数
    获取字符数据: getReader()
    获取字节数据: getInputStream()
        
获取请求参数   
    //通过请求参数的名称来获取值
    request.getParameter(参数名); 
    //针对复选框 返回一个数组
    request.getParameterValues("hobby");
    //获取所有参数 返回map集合
    request.getParameterMap(); 
    //获取所有参数的名称 枚举
    request.getParameterNames();

请求对象–请求中文乱码问题

Tomcat8.0以上
	get请求 中文不会乱码
	post请求 中文会乱码

post请求特有的方式 处理中文乱码
request.setCharacterEncoding("utf-8");

请求对象–内部转发

请求转发 内部转发
内部转发的特点:
     1.一次请求一次响应
     2.地址栏不发生变化
     3.只能访问内部站点资源

不需要写项目路径 相对路径
request.getRequestDisPatcher("/demo").forward(request,response);

重定向与内部转发的区别

重定向
response.sendRedirect("https://www.163.com");
内部转发
request.getRequestDisPatcher("/demo").forward(request,response)

共同点
	都能进行资源的跳转问题 
不同点
	重定向是两次请求,两次响应
	内部转发是一次请求,一次响应
	重定向既能跳转自己站点内的资源,也可以跳转外部资源
	内部转发只能跳转自己站点内的资源,不能跳转外部资源,只能跳转WEB-INF下的资源/WEB-INF/home.jsp
	重定向的地址栏会发生变化
	内部转发的地址栏不发生变化
	重定向的内部资源需要写项目路径,外部资源需要写一个完整的URL
	内部转发不需要写项目路径
    
    
什么时候使用重定向?什么时候使用转发?
    1.如果需要在请求的多个资源中共享数据,则使用转发
    2.如一次性的数据存入请求域中,不要使用重定向来跳转资源,使用请求转发
    3.如果说你使用了重定向来跳转资源,还想要在多个资源间共享数据,那么这个数据存在请求域中,就共享不到   

请求对象–域对象

request请求对象,也是一个域对象
代表的范围是一次请求和响应间数据的共享

request.setAttribute("键",值); 存
request.getAttribute("键"); 取
request.removeAttritbute("键"); 删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值