美文网首页
JavaWeb(3)

JavaWeb(3)

作者: 迷人的酋长 | 来源:发表于2018-09-10 10:15 被阅读0次
    1.重定向

    response是专门给客户端相应数据的响应对象.
    Http协议规定:响应数据也要分成三部分:
    响应行,响应头,响应体

    功能:
    public void setStatus(int sc);
        //200:请求成功
        //302:请求重定向
        //404:访问的资源不存在
        //500:服务器内部错误
    public void setHeader(String name,String value);
        //设置响应头信息,name表示属性名,value表示属性值.
        //响应重定向的路径
        //response.setHeader("location","http://www.itcast.cn");
    
    重定向的原理步骤:

    1.1浏览器访问Servlet1,但是该请求Servlet实现不了,想交给别的Servlet对象来实现.
    1.2在Servlet1中完成设置
    A:设置状态码302,通知浏览器找其他资源.
    response.setStatus(302);
    B:设置响应头,高数浏览器访问新资源的路径.
    response.setHeader("location","/项目名/servlet名");
    1.3浏览器识别服务器返回的状态码.
    马上准备访问新资源
    1.4浏览器向新资源(新的Servlet对象)发出请求.
    1.5新的Servlet对象响应浏览器的请求.

    重定向的实现
        方式一:  分解式
            //1) 响应状态码.
            response.setStatus(302);
            //2) 响应重定向的路径
            response.setHeader("location","http://www.itcast.cn");
    
        方式二: 合并式
            response.sendRedirect("http://www.itcast.cn");
    
    重定向和请求转发的区别:

    2.1相对于浏览器而言,是几次请求几次响应?
    重定向:n次请求,n次响应
    请求转发:一次请求,一次响应

    2.2浏览器地址和窗体内容是否一致?
    重定向:一致
    请求转发:不一致

    2.3页面跳转是在服务器内部,还是在服务器外部?
    重定向:可以在服务器内部,也可以在服务器外部
    请求转发:只能在服务器内部

    2.4关于是否可以跳转项目外部的路径
    重定向:可以. response.sendRedirect("/项目名/servlet名");项目名没有规定死,所以可以访问外部路径
    请求转发:不可以,request.getRequestDispatcher("/servlet名").forward(request,response);
    浏览器已经自动定位到项目名了,所以只能访问内部路径了

    2.5如果要将request当做容器,谁更合适?
    重定向: 不合适
    请求转发: 更合适

    页面定时刷新到新网页

    应用场景:
    您访问的资源不存在,5s后跳转到首页.
    支付成功,3s后跳转到首页

    实现方式:
    通过设置refresh响应头信息来完成这个功能.

    格式:
            response.setHeader("refresh","秒数;url=网址");
            
        例如:
            response.setHeader("refresh","5;url=http://www.itcast.cn");
    
    向浏览器输出中文

    应用场景:
    浏览器现实的内容,下载文件等.

    response: //以流的形式, 将内容输出给浏览器.
            response.getWriter();       //获取响应体的字符输出流.
            response.getOutputStream(); //获取响应体的字节输出流.
    
        注意:
            1) 字符流和字节流不能同时使用.
            2) 复制文件建议用: 字节流.  
               手动生成响应内容建议用: 字符流.
            3) 不需要关流, tomcat会自动调用close(),flush()方法.
    
    //方式一: 字符流, 合并式     //推荐使用
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("你们真的很棒!");
    
    //方式二: 
            response.getOutputStream().write("你们真的很棒!".getBytes("gbk"));
    
    EL表达式:

    EL:Expression Language(表达语言的意思),是为了使JSP写起来更加简单.

    作用:
    快速获取域容器中的数据(request容器,context容器).

    格式:
    ${域对象.类名.属性名}

    eg: ${requestScope.product.name}

    登录案例
    准备:
            创建index.jsp,login.jsp
            分层建包,web层,service层,dao层,domain包,utils包
            导jar包,引入jdbcUtils工具类
            创建User实体类
    实现:
            在web层创建LoginServlet
            1.设置编码
                request.setCharacterEncoding("utf-8");
           
            2.接收参数
                request.getParameter("");
                也可以使用request.getParameterMap();接收
    
            3.new一个User对象
    
            4.使用BeanUtils将接收到的map值封装为User对象
                  BeanUtils.populater(user,map);
    
            5.将User对象传递到service层
                  UserService us = new UserService();
                  boolean flag = us.isLogin(user);
                (这里返回值为布尔类型,如果返回true,就证明登录成功)
    
            (service层)
            6.将User对象传递到dao层
                UserDao ud = new UserDao();
                User us = ud.islog(user);
                (这里返回值为User对象,所以要返回web层就需判断User对象是否为空)
                return us != null;
                (应为返回值类型为布尔类型,所以如果us为空,null != null 是false,
                如果us不为空,us != null 是true)
    
            (dao层)
            7.使用jdbcUtils工具类获取连接池
            QueryRunner qr = new QueryRunner (jdbcUtils.getDateSource());
            创建SQL语句
            String sql = "select * from users where username =? and password = ?;";
            使用BeanHandler将查询到的数据封装为User对象 并返回
            return qr.query(sql, new BeanHandler<>(User.class),user.getUsername,user.getPassword);
    
            8.dao层的返回值将一层一层返回到web层
                现在判断web层的flag
                if(flag){
                    如果flag为true,页面重定向到index.jsp页面
                }else{
                    如果flag为false,页面请求转发到login.jsp页面
                }
    
    登录案例分析.png

    相关文章

      网友评论

          本文标题:JavaWeb(3)

          本文链接:https://www.haomeiwen.com/subject/zcmjgftx.html