web核心66-day10笔记(request , Dispatcher , jsp)

web核心66-day10笔记(request , Dispatcher , jsp )


一.request对象:

http://localhost/day101/row?username=xiaoming&password=123&hobby=smoking&hobby=drink

1.请求行(请求内容第一行)

    格式:
        请求方式 资源路径?参数名=参数值&参数名=参数值(get请求) 协议/版本
    例子: 
        GET /test?username=xiaoming&password=123&hobby=smoking&hobby=drink HTTP/1.1

    1.1.获取资源路径 (有用)
        request.getRequestURI();
    1.2.获取get请求的请求参数 并且字符串返回(无用)
        request.getQueryString();
        //例子 返回username=xiaoming&password=123&hobby=smoking&hobby=drink
    1.3.获取协议/版本 (基本无用)
        request.getProtcol()//返回 HTTP/1.1
    1.4.获取请求类型
        request.getMethod();//
    1.5.获取项目路径
        request.getContextPath()//            一级重要
        只要是在代码需要用到了 项目地址 一定使用该方法获取 不要自作主张
    1.6.获取远程请求ip
        request.getRemoteAddr()//

2.请求头(请求内容第二行起到空行前) key/value的形式

    2.1.获取请求头(单个值)
        String 请求头值=getHeader("请求的名字");//获取请求头--------------->重要
        没有用类似方法(视而不见):
            int getIntHeader("请求的名字");//int值
            long getDateHeader("请求的名字");//日期类型值
    2.2.获取请求头(多值的)
        Enumeration(集合) request.getHeaders();//获取多值的
    2.3.获取所有请求头的名字
        Enumeration(集合) request.getHeaderNames();//获取所有请求头的名字
    2.4.重要的请求头名字:       
        User-Agent:告知服务器 客户端是什么牌子的浏览器
        referer:请求来源(从哪个网页跳转过来的)

3.请求体(请求头结束后隔一行就是他)

    3.1.请求方式为post,才放置请求参数

    3.2.不论请求方式,都可以获取请求参数的3个方法:
        http://localhost/day101/param?username=xiaoming&password=123&hobby=smoking&hobby=drink

        String 参数值 = request.getParameter("参数名")//返回请求参数值 返回单值参数
        String[] 多值参数 = request.getParameterValues("参数名")//返回请求参数值 返回多值参数 hobby
        Map 所有参数 = request.getParameterMap();//返回所有请求参数的Map集合

4.请求参数乱码问题(post请求参数乱码)

    4.1.原因:
        因为我们的浏览器在发送数据的时候,它会将中文进行utf-8编码;
        但是我们服务器:
            请求行资源路径 也就是get请求 解码采用utf-8编码
            请求体中采用iso-8859-1解码的 

    4.2.解决:想办法 告知服务器请求你用utf-8编码
        request.setCharacterEncoding("utf-8")//告知服务器请你对post请求体中数据采用utf-8 解码

5.工具介绍:

    beanUtils 是apache提供的
    方法:
        BeanUtils.populate(JavaBean,map集合);

案例一 完成注册(regist)流程

需求:
    访问服务器 访问注册页面 注册表单 让用户可以输入用户信息
    点击提交 把信息提交服务器 将信息变成数据 用户表记录

步骤分析:
    1.数据库 创建表
    2.创建工程
        1)jar包导入(jar包说明)
        2)工具类导入(DataSourceUtils.java)
        3)配置文件导入(c3p0-config.xml,需要修改数据库信息)
        4)三层架构
    3.逻辑部分
        1)前端页面:
            (1).regist.htm页面
            (2)form表单部分补充内容:
                action method 输入框起名字name (性别男女的value分别更改为1/0)
        2)后端部分:
            (1)获取请求信息
                a.设置解析编码
                    request.setCharacterEncoding("utf-8");
                b.获取所有请求体内容,放入map集合
                    request.getParameterMap()
            (2)调用UserService 保存数据方法,传递参数
            (3)参数数量大于四个,请封装对象
                Java工具类BeanUtils封装表单信息到对象user
                    BeanUtils.populate(user,map);
            (4)重定向到登陆页面
                response.sendRedirect(request.getContentPath()+"/login.htm");

代码实现:

//设置请求体解析编码
        request.setCharacterEncoding("utf-8");
        //获取请求的参数信息
        Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        //参数数量大于四个,将请求信息封装到对象
        try {
            BeanUtils.populate(user,map);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //遍历user信息,用于测试是否准确获取到请求信息
        //System.out.println(user);

        //调用UserService保存数据
        UserService userService = new UserService();
        userService.regist(user);

        //重定向到登陆页面
        //response.sendRedirect("http://localhost/login");
        //绝对路径 可以省略域名的
        response.sendRedirect(request.getContextPath()+"/login.htm");

二.请求转发技术

1.获取Dispatcher对象:
    dispatcher对象 = request.getRequestDispatcher("/要找的servlet资源_内部路径");

2.dispatcher对象方法:
    forward(request,response);

//request的属性操作
    xxxAttribute();

3.注意事项:
    不可用在重定向中

4.request生命周期:
    1).每当请求来的时候创建
    2).请求结束,响应内容来了,也就结束

三.jsp技术

java server pages 服务器页面

特点:
    允许你再jsp页面上,既可以写html代码,也可以写java代码
    html格式不变;java代码格式 <%  java代码  %> ;

怎么创建jsp:
    使用idea new 一个

工作原理:
    1)当你访问一个jsp文件的时候, 服务器交给了 jspservlet 来处理;
    2)它首先去你项目中找对应 jsp 文件,执行翻译过程, 拼接字符串----->拼接成了一段java代码;
    3)执行编译,把java代码编译成class文件, 调用它的方法, 输出给浏览器内容.

jsp的本质就是一个servlet;

编程思路:
    分工明确;
        以后servlet只负责接受请求,调用service完成数据准备工作,展示的工作与自己无关;
        展示工作 请求转发给jsp负责.
    总结:数据准备 与 数据展示 相分离.

案例二 查询所有用户

需求:
    访问某个servlet  查询数据库中所有用户
    并且要求以table表格形式展示给用户

问题:
    返回数据 如果是个页面  拼接字符串太难受

解决:利用 请求转发 和 jsp技术

实现步骤:
    1)在注册和登陆实现完毕的基础上进行;
    2)创建UserServlet类,完成接收请求和调用service完成数据准备的工作,并且请求转发给users.jsp页面展示:
        (1)接收请求的信息,将请求信息封装到User对象
        (2)调用service层方法查询到所有user信息,返回一个User类型的List集合;
        (3)调用request方法setAttribute("xxx","xx"),将List集合存入属性值中;
        (4)请求转发给users.jsp页面.
    3)创建users.jsp页面,编辑内容负责展示用户信息表:
        (1)页面创建表格,第一行为表头,用html代码写;
        (2)表格第二行开始,要写入Servlet中查询到的User对象的集合,用java代码写(<% 代码体 %>);
        (3)因为请求转发带有参数(request,response),利用request获得Servlet中存储的List集合,request.getAttribute("xxx");
        (4)遍历List集合,利用字符串拼接,将User对象信息写入表格中(一个User对象,写入一行表记录).


本节内容总结:

1.思维:
    1)request是什么东西
    2)请求转发技术和jsp结合

2.代码上:
    1) 注册案例敲一遍
    2) getContextPath()//动态获取项目路径
    3) 请求转发:
        request.getrequestDispather("/内部路径").forward(request,response)
        request提供了一组xxxAttribute()方法

3.请求转发和重定向的区别:
    1)请求次数:
        请求转发:1次
        重定向:2次 一次手动 一次自动
    2)地址栏问题:
        请求转发:不会变
        重定向:会变  变到最后一个位置
    3)谁的方法:
        请求转发:request.getrequestDispatcher("/").forward(request,response)
        重定向:response.sendRedirect("路径")
    4)路径:
        请求转发:request.getrequestDispather("/内部路径").forward(request,response)
        重定向:response.sendRedirect("路径")  可以走向任何地址
    5)属性操作:
        请求转发:可以使用(因为参数传递了request和response)
        重定向:不要用

你可能感兴趣的:(notes)