httpservlet请求1

101 阅读4分钟

111.png image.png

必须是同一种 若是两种都用要改为false 参数写别的必须写value 不要写成/ 不用idea和iml会重新生成 怎么运行servletdemo 发布目录---重新生成就不会404 下载lombok插件代替getter setter必须先配置


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>

然后再搜Annotation processors enable annotation processig 创建实体类---必须序列化如果不序列化就无法缓存

@Data @NoArgsConstructor @AllArgsConstructor @ToString

public class User implements Serializable { 
 
    private String address;
    private String[] hobby;

}
创建请求参数自动封装beanutils中poulate方法
注意表单name属性必须和实体类名称一致
两个参数第一个封装到哪个对象 req第二个封装的数据是什么resp

<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency>

因为一个一个用set获取太麻烦了
所以在变量大的情况下用自动封装
 

方案一

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {


    /**
     * 请求消息头获取的相关方法:
     *      String getHeader(String name)
     *      作用;
     *          根据消息头名称,获取值。返回的是一个值。
     *
     *      Enumeration<String> getHeaders(String name);
     *      作用:
     *          根据消息头名称,获取值。返回的是一组值。(消息头值的枚举)
     *
     *      getIntHeader(String name);
     *      作用:
     *          根据消息头名称,获取消息头的值,转成int类型
     *
     *      getDateHeader(String name);
     *      作用:
     *          根据消息头名称,获取消息头的值,转成long类型(含义是日期时间的毫秒值)
     *
     *      getHeaderNames()
     *      作用:
     *          返回消息头名称的枚举
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.根据消息头名称,获取消息头的值
        String value = req.getHeader("Connection");
        System.out.println("取到的消息头Connection的值是:"+value);
        //2.获取所有消息头名称的枚举
        Enumeration<String> headerNames = req.getHeaderNames();
        //3.遍历枚举
        while (headerNames.hasMoreElements()){
            //取出消息头
            String headerName = headerNames.nextElement();
            //根据名称获取值
            String headerValue = req.getHeader(headerName);
            System.out.println("取到的消息头名称是:"+headerName+",消息头的值是:"+headerValue);
        }
    }
}

方案二

111.png

//1.获取请求的方式: GET和POST                                                       重要
String method = req.getMethod();
System.out.println("请求的方式是:"+method);
//2.获取当前应用发布的名称                                                           非常重要
String path = req.getContextPath();
System.out.println("当前应用的发布名称是:"+path);
//3.获取请求资源的URL
String url = req.getRequestURL().toString();
System.out.println("请求资源URL是:"+url);
//4.获取请求资源URI
String uri = req.getRequestURI();
System.out.println("请求资源URI是:"+uri);
//5.获取使用的协议
String protocol = req.getProtocol();
System.out.println("使用的协议是:"+protocol);
//6.获取来访者信息
String remoteAddr = req.getRemoteAddr();
int remotePort = req.getRemotePort();
System.out.println("获取来访者信息:来访者主机,由于我是自己访问自己,所以主机地址也是自己的电脑地址。"+remoteAddr+",来访者的端口是,每次都是不一样的:"+remotePort);
//7.获取本地信息
String localAddr = req.getLocalAddr();
int localPort = req.getLocalPort();
System.out.println("获取本地信息,就是获取服务器的信息。也是因为只有一台电脑,自己访问自己,所以来访者ip和本地ip是一样的:"+localAddr+",本地端口,指的就是服务器提供的对外访问端口,他是固定的,就是tomcat的端口:"+localPort);`

方案三 用流读取请求正文(请求体) 细节:

  •        从服务器对象请求或者响应获取出来的流,都可以不用关闭,服务器会帮我们关闭。
    
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //1.获取请求对象的字节输入流
       ServletInputStream in = req.getInputStream();
       //2.方法一流的操作
//        int len = 0;
//        byte[] bytes = new byte[1024];
//        while((len = in.read(bytes))!=-1){
//            System.out.println("用流读取到的请求正文:"+new String(bytes,0,len));
new String(bytes,0,len)从0到len
//        }
方法二用包

<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.4</version> </dependency>

        String str = IoUtil.read(in, "UTF-8");
        System.out.println("用流读到的请求正文是:"+str);
    }
}

方案四共享数据 请求转发

@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
    /**
     *  获取请求转发对象:
     *         getRequestDispatcher(转发的目的地)方法
     *  参数的写法:
     *        写的是请求资源URI。
     *        他既支持转发到Servlet,也支持转发到页面(html,jsp都行)
     *  细节:
     *      转发的目的地只能支持当前应用下的资源,而不能前往应用外部的资源,
     *      但是转发的目的地可以是WEB-INF目录(这个目录通过浏览器时不能直接访问的,但是转发可以)
     *
     *  请求对象的共享区域:
     *      在请求对象中,有专门的一块区域可用用于共享数据。
     *      共享的数据有使用范围(作用范围):
     *              这个范围是,一次请求,或者请求转发中可以使用。
     *      使用的方式:
     *           存入共享区域
     *              setAttribute(存入的名称,存入的值)
     *           从共享区域取出
     *              getAttribute(存入时的名称)
     *           从共享区域删除
     *              removeAttribute(存入时的名称)
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //取出借钱的金额
        String money = req.getParameter("money");

        System.out.println("RequestDemo5接收到了请求,处理不了,转发给了RequestDemo6这个Servlet,"+money);

        //转发的数据共享:
        req.setAttribute("money",money);

        //1.获取转发对象
        RequestDispatcher dispatcher = req.getRequestDispatcher("/requestDemo6");//参数写的就是转发的目的地
        //2.真正完成转发
        dispatcher.forward(req,resp);
    }
}
再新建一个类

/**

  • 请求转发
  •  转发的目的地
    

*/ @WebServlet("/requestDemo6") public class RequestDemo6 extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.从共享区域中取出金额
    String money =(String) req.getAttribute("money");
    System.out.println("RequestDemo6接收到了5的转发,给钱"+money);
}

}