HTTP Request和Response

一、Servlet

1:实现Servlet接口

servlet生命周期:
init方法:tomcat启动时 调用此方法
service方法:访问servlet时默认执行此方法
destroy方法:tomcat正常关闭时 调用此方法

package com.applesnt.servlet;
import javax.servlet.*;
import java.io.IOException;

/*实现Servlet接口 需要在web.xml中配置servlet*/

public class MyServlet01 implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("tomcat启动时 调用此方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        //基本不用
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("默认访问此方法");
    }

    @Override
    public String getServletInfo() {
        //基本不用
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("tomcat正常关闭时 调用此方法");
    }
}

需要在web.xml中添加servlet配置

<servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>com.applesnt.servlet.MyServlet01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <url-pattern>/mydemo1</url-pattern>
</servlet-mapping>

访问测试:
http://localhost/applesnt/mydemo1

2:继承HttpServlet抽象类

@@WebServlet 必须是jak7及以上才可以使用注解 也就是servlet必须是3.0以上

package com.applesnt.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;

/*继承HttpServlet抽象类 */
@WebServlet(value = "/mydemo2",loadOnStartup = 1)
public class MyServlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("通过post请求 访问此方法");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("通过get请求 访问此方法");

    }
}

访问测试:
get请求:http://localhost/applesnt/mydemo2
post请求:form表单提交

<form action="/applesnt/mydemo2" method="post">

    用户名:<input type="text" name="username" ><br>
    密码:<input type="text" name="password" ><br>
    <input type="checkbox" name="type" value="学生">学生
    <input type="checkbox" name="type" value="老师">老师<br>
    <input type="submit" value="注册">

</form>

二、Http

Http分为请求(request)和响应(response)
其中request和response是由tomcat管理的

1:请求

请求数据分为:请求行,请求头,请求空行,请求体

1>:获取请求行数据:

request.setCharacterEncoding("utf-8");//解决中文乱码

package com.applesnt.httprequestservlet;

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.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/myrequest01")
public class HttpRequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);

    }

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

        request.setCharacterEncoding("utf-8");//解决中文乱码

        //获取http请求行数据 http://localhost/applesnt/myrequest01
        System.out.println("****获取请求行数据****");
        String method = request.getMethod();
        System.out.println("请求类型是="+method);

        String contextPath = request.getContextPath();
        System.out.println("请求的上下文【虚拟目录】是="+contextPath);

        String requestURI = request.getRequestURI();
        System.out.println("请求的uri="+requestURI);

        StringBuffer requestURL = request.getRequestURL();
        System.out.println("请求的url="+requestURL);

        String remoteAddr = request.getRemoteAddr();
        System.out.println("请求的ip="+remoteAddr);

        String remoteHost = request.getRemoteHost();
        System.out.println("请求的主机="+remoteHost);

    }
}

打印结果:
http://localhost/applesnt/myrequest01

请求类型是=GET
请求的上下文【虚拟目录】是=/applesnt
请求的uri=/applesnt/myrequest01
请求的url=http://localhost/applesnt/myrequest01
请求的ip=0:0:0:0:0:0:0:1
请求的主机=0:0:0:0:0:0:0:1
2>:获取请求头数据:

user-agent:浏览器信息
referer:本次请求从哪里来

package com.applesnt.httprequestservlet;

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.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/myrequest01")
public class HttpRequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);

    }

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

        request.setCharacterEncoding("utf-8");//解决中文乱码

        //获取http请求头数据 http://localhost/applesnt/myrequest01
        System.out.println("****获取请求头数据****");
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            String value = request.getHeader(name);
            System.out.println(name + "==" + value);
        }
        //两个比较重要的请求头  http://localhost/applesnt/where.html
        String agent = request.getHeader("user-agent");//获取浏览器类型
        System.out.println("浏览器 = "+agent);
        String referer = request.getHeader("referer");//获取从哪来
        System.out.println("跳转地址为 = "+referer);
    }
}

打印结果:
http://localhost/applesnt/myrequest01

host==localhost
connection==keep-alive
upgrade-insecure-requests==1
user-agent==Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
accept==text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding==gzip, deflate, br
accept-language==zh-CN,zh;q=0.9
cookie==JSESSIONID=D3F775AC5EAE33EE4DE4BE0370E78382

测试referer请求头信息:
\web\where.html

<a href="/applesnt/myrequest01">测试referer</a>

打印结果:

跳转地址为 = http://localhost/applesnt/where.html
3>:获取请求体数据:
package com.applesnt.httprequestservlet;

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.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/myrequest01")
public class HttpRequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);

    }

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

        request.setCharacterEncoding("utf-8");//解决中文乱码

        //获取请求体数据
        System.out.println("****获取请求体数据****");
        //第一种 只能获取一个值(input select等)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String type = request.getParameter("type");
        System.out.println("用户名="+username+"  密码="+password);
        System.out.println("类型="+type);
        
		System.out.println("------------------");
		
        //第二种 获取多个值(check)
        String[] typelist = request.getParameterValues("type");
        for (int i = 0; i <typelist.length ; i++) {
            System.out.println("类型="+typelist[i]);
        }
        
		System.out.println("------------------");
		
        //第三种 map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> keyset = parameterMap.keySet();
        for (String name : keyset){
            String[] values = parameterMap.get(name);
            for(String value : values){
                System.out.println(name + "==" + value);
            }
        }
    }
}

打印结果:
\web\login.html

<form action="/applesnt/myrequest01" method="post">

    用户名:<input type="text" name="username" ><br>
    密码:<input type="text" name="password" ><br>
    <input type="checkbox" name="type" value="学生">学生
    <input type="checkbox" name="type" value="老师">老师<br>
    <input type="submit" value="注册">
</form>
用户名=zhangsn  密码=123456
类型=学生
------------------
类型=学生
类型=老师
------------------
username==zhangsn
password==123456
type==学生
type==老师
4>:Request跳转:

dispatcher跳转的特点:

1:Dispatcher只能在当前服务器内部跳转,如果写外部地址是失败的

2:地址栏路径没有发生变化 跳转后还是原来的路径

3:只发一次请求

4:参数可以传递

com\applesnt\httprequestservlet\RequestServlet01.java

String username = request.getParameter("username");
        
System.out.println("请求了request01 = "+username);

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

com\applesnt\httprequestservlet\RequestServlet02.java

 String username = request.getParameter("username");
 
 System.out.println("请求了request02 = "+username);

访问测试:http://localhost/applesnt/request01?username=zhangsan

请求了request01 = zhangsan

请求了request02 = zhangsan
4>:Request数据共享:

Request域共享 一次请求
com\applesnt\httprequestservlet\RequestServlet01.java

request.setAttribute("age","12");

com\applesnt\httprequestservlet\RequestServlet02.java

 Object age = request.getAttribute("age");
 System.out.println("数据共享 = " +age.toString());

2:响应

响应数据分为:响应行,响应头,响应空行,响应体

1>:响应行状态码:
状态码:是服务器告诉浏览器本次请求的的一个状态
1xx: 不常用 了解
2xx:成功状态码
3xx:重定向状态码 302(重定向) 304(访问缓存)
4xx:客户端错误 404(请求路径没有相应的资源) 405(没有相应的doget或者dopost方法)
5xx:服务端错误 500(服务异常)
2>:响应行状态码:
   1: 获取输出流:
        字符输出流
        字节输出流
   2: 输出

1:字符输出:只能输出字符数据
com\applesnt\httpresponesservlet\HttpResponseServlet03.java

//字符输出流
response.setStatus(200);
//告诉浏览器以何种方式编码显示数据
response.setContentType("text/html;charset=utf-8");
//获取字符输出流
PrintWriter pw = response.getWriter();
//输出到浏览器
//pw.write("你好 write response"); //第一种
pw.print("<h1>你好 print response<h1>");//第二种

访问测试:

2:字节输出:可以输出任何数据

//字节输出流[可以输出任何数据]
response.setStatus(200);
response.setContentType("text/html;charset=utf-8");//告诉浏览器以何种方式何种编码显示数据
ServletOutputStream os = response.getOutputStream();
os.write("您好 hello".getBytes());//需要getbytes

访问测试:

2:Response重定向

重定向的特点:

	1:地址栏发生了变化(显示重定向后的路径)
	2:两次请求
	3:可以访问其他服务器的资源
response.sendRedirect("/applesnt/myresponse02");
posted @ 2020-04-01 15:49  努力的校长  阅读(272)  评论(0编辑  收藏  举报