HTTP协议(下)

HTTP协议(下)

request请求和response响应
request请求
request是服务器就九大内置对象之一,是与请求相关的请求对象。
request的体系结构
ServletRequest        --    接口
  |    继承
HttpServletRequest    -- 接口
  |    实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
request请求行常用到的方法
返回值方法名称方法介绍
StringgetMethod()获取请求方式,例如: GET/POST
StringgetContextPath()获取虚拟目录,例如: /day17
StringgetProtocol()获取协议及版本,例如:HTTP/1.1
StringgetRemoteAddr()获取客户机的IP地址,例如:192.168.26.10
StringgetServletPath()获取客户机的地址,例如: /demo1
StringgetQueryString()获取get方式请求参数列表,例如:name=zhangsan&password=123
StringgetRequestURI()获取请求URI(统一资源标识符),例如:/day17/demo1
StringgetRequestURL()获取请求URL(统一资源定位符),例如:http://localhost:8080/day17/demo1
request请求头常用到的请求头

1.获取referer头(防盗链示例)

@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //演示获取请求头数据:referer
        String referer = request.getHeader("referer");
        System.out.println(referer);//http://localhost/day14/login.html
        //防盗链
        if(referer != null ){
            if(referer.contains("/day14")){
                //正常访问
               // System.out.println("播放电影....");
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("播放电影....");
            }else{
                //盗链
                //System.out.println("想看电影吗?来优酷吧...");
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write("想看电影吗?来优酷吧...");
            }
        }
    }
}

2.获取user-agent头(甄别在一次请求中的浏览器信息)

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.演示获取请求头数据:user-agent
    String agent = request.getHeader("user-agent");
    //判断agent的浏览器版本
    if(agent.contains("Chrome")){
        //谷歌
        System.out.println("谷歌来了...");
    }else if(agent.contains("Firefox")){
        //火狐
        System.out.println("火狐来了...");
    }
  }
}
request获取请求参数
返回值方法名称方法介绍
StringgetParameter(String param)根据参数名称获取参数值 username=zs
String[]getParameterValues(String param)根据参数名称获取参数值们,一般用于获取多选框和下拉列表框的参数值 hobby=‘game’&hobby=‘study’
Map<String,String[]>getParameterMap()获取所有参数的map集合
Enumeration< String>getParameterNames()获取所有请求的参数名称
request解决参数中文乱码问题

GET方式
tomcat 8 已经将get方式乱码问题解决了

POST方式:会乱码
解决:在获取参数前,设置request的编码 request.setCharacterEncoding(“utf-8”);

示例:

	@WebServlet("/login")
	public class LoginServlet extends HttpServlet {
	    @Override
	    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	        //解决post请求乱码问题
	        req.setCharacterEncoding("utf-8");
	        //接收参数
	        String username = req.getParameter("username");
	        String password = req.getParameter("password");
	        System.out.println(username+" "+password);
	    }
	}
request请求转发

步骤
1.创建转发器对象

RequestDispatcher dispacher = request.getRequestDispacher("要转发的到的目标资源");

2.实现转发

dispacher.forward(request,response);

特点

转发以后,浏览器地址栏不会发生变化
转发目标资源路径不需要携带虚拟目录
转发只能转发当前服务器的内部资源
转发是一次请求
request存储域数据
返回值方法名称方法介绍
voidsetAttribute(String name,Object name)将数据通过键值对的形式存入request域中
ObjectgetAttribute(String name)通过键获取request域中存储的数据
voidremoveAttribute(String name)通过键删除request域中存储的数据
获取ServletContext
//获取ServletContext域对象
ServletContext servletContext = request.getServletContext();
response响应
响应状态码(状态码都是3位数)
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功。代表:200
3xx:重定向。代表:302(重定向),304(访问缓存)
4xx:客户端错误。
  * 代表:
    * 404(请求路径没有对应的资源)
    * 405:请求方式没有对应的doXxx方法
5xx:服务器端错误。代表:500(服务器内部出现异常)	
常见的响应头
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
    * in-line:默认值,在当前页面内打开
    * attachment;filename=xxx:以附件形式打开响应体。文件下载
response响应对象常用到的方法
返回值方法名称方法介绍
voidsetStatus(int sc)设置响应的状态码
voidsetHeader(String name, String value)设置响应头
PrintWritergetWriter()获取字符输出流
OutoutStreamgetOutoutStream()获取字节输出流
案例:使用输出流,将数据输出到客户端浏览器
@WebServlet("/demo1")
public class ResponseServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //字节流输出
        //response.getOutputStream().println("hello response");
        // 字符流输出
        response.getWriter().println("hello response");
    }
}
response对象的重定向

重定向原理

重定向的特点
完成重定向后,浏览器的地址栏会发生变化;
重定向是两次请求;
重定向不仅可以访问当前服务器内部资源,也可以访问其他服务器的资源;
重定向时需要在重定向的资源路径上携带虚拟目录
response乱码问题的处理

步骤:
1.设置该流的默认编码
2.告诉浏览器响应体使用的编码

示例:
@WebServlet("/demo1")
public class ResponseServletDemo1 extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   //1. 设置流的编码
  //response.setCharacterEncoding("utf-8");
  //2. 设置响应数据的格式
  //response.setHeader("content-type","text/html;charset=utf-8");

  //以下一行代码顶上面二行代码
  response.setContentType("text/html;charset=utf-8");

  // 1. 获取字符流输出
  PrintWriter writer = response.getWriter();
  //2. 输出塑聚到客户端
  writer.println("我爱你JAVA.....");
}

JAVAEE中提供了简化的方法。

//设置响应编码方式
response.setContentType("html/text;charset=utf-8");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值