黑马程序员JaveWeb之Request&Response

本文详细介绍了JavaEE中如何处理HTTP请求(包括请求行、头、参数获取)以及响应数据(设置响应、重定向、字符流和字节流),还涵盖了乱码解决方案、请求转发和MyBatis在登录和注册场景的应用。
摘要由CSDN通过智能技术生成

Request

1.简介

request:获取请求数据

response:设置响应数据

2.Request继承体系

tomcat接受request信息并且封装到request对象中,并且传给service方法中

使用request,只用查询javaEE中的httprequest方法即可

3.Request获取请求数据

获取请求行数据

   // String getMethod():获取请求方式: GET
        String method = req.getMethod();
        System.out.println(method);//GET
        // String getContextPath():获取虚拟目录(项目访问路径):/request-demo
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
        StringBuffer url = req.getRequestURL();
        System.out.println(url.toString());
        // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
        String uri = req.getRequestURI();
        System.out.println(uri);
        // String getQueryString():获取请求参数(GET方式): username=zhangsan
        String queryString = req.getQueryString();
        System.out.println(queryString);

获取请求头数据

        //------------
        // 获取请求头:user-agent: 浏览器的版本信息
        String agent = req.getHeader("user-agent");
        System.out.println(agent);

键值对的形式

4.Request通用方式获取请求方式

 

1.获取所有参数Map集合

//1. 获取所有参数的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            // username:zhangsan lisi
            System.out.print(key+":");

            //获取值
            String[] values = map.get(key);
            for (String value : values) {
                System.out.print(value + " ");
            }

            System.out.println();
        }

 2.根据名称获取参数值(不止一个)

 //2. 根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

3.根据名称获取参数值(只有一个)

   //3. 根据key 获取单个参数值
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username);
        System.out.println(password);
    }

5.解决Request的中文乱码问题

post方法的乱码:getReader()

get方法: getQueryString

发生乱码的原因:编码和解码的语言不一样

浏览器会自动帮我们进行URL编码:URL一个汉字3个字节,一个字节八位二进制,每个字节前面再加上%

 

   //1. URL编码
        String username="嘿嘿嘿";
        String encode = URLEncoder.encode(username, "utf-8");
        System.out.println(encode);

  //2. URL解码
        String decode = URLDecoder.decode(encode, "utf-8");
        System.out.println(decode);
        //3. 转换为字节数据,编码

        byte[] bytes = decode.getBytes("ISO-8859-1");
        for(byte b:bytes){
            System.out.print(b+" ");
        }
        //4. 将字节数组转为字符串,解码
        String s = new String(bytes,StandardCharsets.UTF_8);
        System.out.println(s);

以上是模拟的流程,真正在操作过程中,我们获取到的就是用iso-8859-1解码后的乱码。所以这个时候,我们把乱码转换为字节组,再将字节组用utf-8解码就好(因为本质的二进制是一样的,所以先转换为字节数据)

直接用以下代码就能解决了:

  username  = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);

这两章总结:

6.Request请求转发

 请求转发:在服务器内部请求跳转

写以下这句话就行了,绿色的部分是可以变化的,就和@WebServlet("/req6")的统一就好了

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

请求共享数据:

在req5里面把信息放进request中

 request.setAttribute("msg","我是美女");

 在req6中就可以get到了

   Object msg = request.getAttribute("msg");

Response

1.设置响应数据

 response设置响应数据,request是get,response是set

2.完成重定向

重定向状态码是302

 //重定向
       //1.设置响应状态码 302
        response.setStatus(302);
        //2. 设置响应头 Location
        response.setHeader("Location","/request-demo/resp2");

以后直接这么写就好了

    response.sendRedirect("/request-demo/resp2");

重定向和请求跳转的区别

3.资源路径的问题 

要不要加虚拟目录?

要是给浏览器用,就要加虚拟目录

要是给服务端用,就不用加

为了避免耦合性,我们可以动态获取虚拟目录

   String contextPath = request.getContextPath();
        response.sendRedirect(contextPath+"/resp2");

 4.Response响应字符流数据&字节流数据

字符流

1.设置可以读html和中文

2.获取字符输出流

3.往里面写东西

4.小细节,不用关闭,字符流会随着response的销毁而关闭 

  //1.设置可以读html和中文
        response.setContentType("text/html;charset=utf-8");
        //2.获取字符输出流
        PrintWriter writer = response.getWriter();
        //3.往字符流里面写东西
        writer.write("你好");
        writer.write("<h1>嘻嘻嘻</h1>");
        
        //细节,可以不用关闭

字节流

  //1.获取字节文件
        FileInputStream fis = new FileInputStream("C:/Users/93992/Pictures/Saved Pictures/Camera_XHS_16920221123641000g0082jgabh20im06g5n86.jpg");
       //2.获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3.完成流的copy
        byte[] buff = new byte[1024];
        int len=0;
        while((len=fis.read(buff))!=-1){
            os.write(buff,0,len);
        }

 

 还可以导入依赖

 <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

直接用就好了IOUtils.copy(输入流,输出流)

       //1.获取字节文件
        FileInputStream fis = new FileInputStream("C:/Users/93992/Pictures/Saved Pictures/Camera_XHS_16920221123641000g0082jgabh20im06g5n86.jpg");
       //2.获取response字节输出流
        ServletOutputStream os = response.getOutputStream();

        IOUtils.copy(fis,os);
        fis.close();

案例

登录

 

环境准备:静态页面放在webapp下,mybatis

mybatis:

创建一个pojo,放实体类

导入mybatis和mysql的依赖

配置mybatis的配置文件xml

在java main里面创建一个mapper包,创建一个usermapper接口

resourse里面创建一个mapper目录结构(记得要用/分割)

 form表单:

action里面写servlet的地址(静态html页面,不能动态获取,jsp才能动态获取)

然后创建loginservlet

1.获取数据,getParmeter

        //1. 接收用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

2.调用mybatis完成查询

        2.1创建sqlSessionFactory

        2.2获取sqlsession对象

        2.3获取Mapper

        2.4调用方法usermapper.select()

        2.5释放资源sqlSession

 //2. 调用MyBatis完成查询
        //2.1 获取SqlSessionFactory对象
       /* String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //2.2 获取SqlSession对象
//        SqlSession sqlSession = sqlSessionFactory.openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        //2.3 获取Mapper

        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);

        //2.4 调用方法
//        User user = userMapper.select(username, password);
        User user= usermapper.select(username, password);
        //2.5 释放资源
        sqlSession.close();

3.判断并且打印

如果select返回是null,就打印失败

        //3. 判断user释放为null
        if(user != null){
            // 登陆成功
            writer.write("登陆成功");
        }else {
            // 登陆失败
            writer.write("登陆失败");
        }

用户注册

 

1.现在UserMapper写好查找和添加语句

    @Select("select * from tb_user where username=#{username}")
    User selectByUsername(String username);

    /**
     * 添加用户
     * @param user
     */
//    @Insert("insert into tb_user values(null,#{username},#{password})")
//    void add(User user);
    @Insert("insert into tb_user values(null,#{username},#{password})")
    void add(User user);

 2.完善register.html的代码

3.创建register的servlet

        3.1封装用户对象

       //封装用户对象
        User user = new User();
        user.setUsername(username);
       user.setPassword(password);

        3.2调用mybatis代码(一模一样的,背过就好)

        //2. 调用mapper 根据用户名查询用户对象
        //2.1 获取SqlSessionFactory对象
       /* String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    

        3.3调用usermapper的对应的方法

  //2.4 调用方法
        User u = userMapper.selectByUsername(username);

        //3. 判断用户对象释放为null
        if( u == null){
            // 用户名不存在,添加用户
            userMapper.add(user);

            // 提交事务
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
        }else {
            // 用户名存在,给出提示信息
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("用户名已存在");
        }

注意!!!!!!!!

  User u = userMapper.selectByUsername(useraname);
//

这个里面的username千万不能打   “   ”  号。我真的会谢

是null的看看selecrByname里面的username是不是打“”了,还有就是add里面传的是user,不要传成u了

5.sqlsessionfactory的完善

静态代码块,当类加载的时候自动创建

 static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值