Request

    1. request对象和response对象的原理
        1. request和response对象是由服务器创建的。我们来使用它们
        2. request对象是来获取请求消息,response对象是来设置响应消息
    
    2. request对象继承体系结构:    
        ServletRequest        --    接口
            |    继承
        HttpServletRequest    -- 接口
            |    实现
        org.apache.catalina.connector.RequestFacade 类(tomcat)

    3. request功能:
        1. 获取请求消息数据
            1. 获取请求行数据
                * GET /day14/demo1?name=zhangsan HTTP/1.1
                * 方法:
                    1. 获取请求方式 :GET
                        * String getMethod()  
                    2. (*)获取虚拟目录:/day14
                        * String getContextPath()
                    3. 获取Servlet路径: /demo1
                        * String getServletPath()
                    4. 获取get方式请求参数:name=zhangsan
                        * String getQueryString()
                    5. (*)获取请求URI:/day14/demo1
                        * String getRequestURI():        /day14/demo1
                        * StringBuffer getRequestURL()  :http://localhost/day14/demo1

                        * URL:统一资源定位符 : http://localhost/day14/demo1    
                        * URI:统一资源标识符 : /day14/demo1                   
                    
                    6. 获取协议及版本:HTTP/1.1
                        * String getProtocol()

                    7. 获取客户机的IP地址:
                        * String getRemoteAddr()
                

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;/*** 演示Request对象获取请求行数据*/@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*1. 获取请求方式 :GET* String getMethod()2. (*)获取虚拟目录:/day14* String getContextPath()3. 获取Servlet路径: /requestDemo1* String getServletPath()4. 获取get方式请求参数:name=zhangsan* String getQueryString()5. (*)获取请求URI:/day14/demo1* String getRequestURI():      /day14/requestDemo1* StringBuffer getRequestURL()  :http://localhost/day14/requestDemo16. 获取协议及版本:HTTP/1.1* String getProtocol()7. 获取客户机的IP地址:* String getRemoteAddr()*///1. 获取请求方式 :GETString method = request.getMethod();System.out.println(method);//2.(*)获取虚拟目录:/day14String contextPath = request.getContextPath();System.out.println(contextPath);//3. 获取Servlet路径: /demo1String servletPath = request.getServletPath();System.out.println(servletPath);//4. 获取get方式请求参数:name=zhangsanString queryString = request.getQueryString();System.out.println(queryString);//5.(*)获取请求URI:/day14/demo1String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6. 获取协议及版本:HTTP/1.1String protocol = request.getProtocol();System.out.println(protocol);//7. 获取客户机的IP地址:String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}
}

    
            2. 获取请求头数据
                * 方法:
                    * (*)String getHeader(String name):通过请求头的名称获取请求头的值
                    * Enumeration<String> getHeaderNames():获取所有的请求头名称
                
            3. 获取请求体数据:
                * 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
                * 步骤:
                    1. 获取流对象
                        *  BufferedReader getReader():获取字符输入流,只能操作字符数据
                        *  ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
                            * 在文件上传知识点后讲解

                    2. 再从流对象中拿数据
                
                
        2. 其他功能:
            1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
                1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123
                2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game
                3. Enumeration<String> getParameterNames():获取所有请求的参数名称
                4. Map<String,String[]> getParameterMap():获取所有参数的map集合

                * 中文乱码问题:
                    * get方式:tomcat 8 已经将get方式乱码问题解决了
                    * post方式:会乱码
                        * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
            
                    
            2. 请求转发:一种在服务器内部的资源跳转方式
                1. 步骤:
                    1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
                    2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 

                2. 特点:
                    1. 浏览器地址栏路径不发生变化
                    2. 只能转发到当前服务器内部资源中。
                    3. 转发是一次请求

import javax.servlet.RequestDispatcher;
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;@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo8888被访问了。。。");//转发到demo9资源
/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");requestDispatcher.forward(request,response);*///存储数据到request域中request.setAttribute("msg","hello");request.getRequestDispatcher("/requestDemo9").forward(request,response);//request.getRequestDispatcher("http://www.baidu.com").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

            3. 共享数据:
                * 域对象:一个有作用范围的对象,可以在范围内共享数据
                * request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
                * 方法:
                    1. void setAttribute(String name,Object obj):存储数据
                    2. Object getAttitude(String name):通过键获取值
                    3. void removeAttribute(String name):通过键移除键值对

            4. 获取ServletContext:
                * ServletContext getServletContext()
            

Response对象

* 功能:设置响应消息
1. 设置响应行
    1. 格式:HTTP/1.1 200 ok
    2. 设置状态码:setStatus(int sc) 
2. 设置响应头:setHeader(String name, String value) 
    
3. 设置响应体:
    * 使用步骤:
        1. 获取输出流
            * 字符输出流:PrintWriter getWriter()

            * 字节输出流:ServletOutputStream getOutputStream()

        2. 使用输出流,将数据输出到客户端浏览器

* 案例:
1. 完成重定向
    * 重定向:资源跳转的方式
    * 代码实现:
        //1. 设置状态码为302
        response.setStatus(302);
        //2.设置响应头location
        response.setHeader("location","/day15/responseDemo2");
        //简单的重定向方法
        response.sendRedirect("/day15/responseDemo2");

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;/*** 重定向*/@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo1........");//访问/responseDemo1,会自动跳转到/responseDemo2资源/* //1. 设置状态码为302response.setStatus(302);//2.设置响应头locationresponse.setHeader("location","/day15/responseDemo2");*/request.setAttribute("msg","response");//动态获取虚拟目录String contextPath = request.getContextPath();//简单的重定向方法response.sendRedirect(contextPath+"/responseDemo2");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

* forward 和  redirect 区别 

* 重定向的特点:redirect
        1. 地址栏发生变化
        2. 重定向可以访问其他站点(服务器)的资源(关键)
        3. 重定向是两次请求。不能使用request对象来共享数据(关键)
    * 转发的特点:forward
        1. 转发地址栏路径不变
        2. 转发只能访问当前服务器下的资源(关键)
        3. 转发是一次请求,可以使用request对象来共享数据(关键)
     
    * 路径写法:
        1. 路径分类
            1. 相对路径:通过相对路径不可以确定唯一资源
                * 如:./index.html
                * 不以/开头,以.开头路径

                * 规则:找到当前资源和目标资源之间的相对位置关系
                    * ./:当前目录
                    * ../:后退一级目录
            2. 绝对路径:通过绝对路径可以确定唯一资源
                * 如:http://localhost/day15/responseDemo2        /day15/responseDemo2
                * 以/开头的路径

                * 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
                    * 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
                        * 建议虚拟目录动态获取:request.getContextPath()
                        * <a> , <form> 重定向...
                    * 给服务器使用:不需要加虚拟目录
                        * 转发路径 

              

2. 服务器输出字符数据到浏览器
    * 步骤:
        1. 获取字符输出流
        2. 输出数据

    * 注意:
        * 乱码问题:
            1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
            2. 设置该流的默认编码
            3. 告诉浏览器响应体使用的编码

            //简单的形式,设置编码,是在获取流之前设置
            response.setContentType("text/html;charset=utf-8");

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.io.PrintWriter;@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK// response.setCharacterEncoding("utf-8");//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码//response.setHeader("content-type","text/html;charset=utf-8");//简单的形式,设置编码response.setContentType("text/html;charset=utf-8");//1.获取字符输出流PrintWriter pw = response.getWriter();//2.输出数据//pw.write("<h1>hello response</h1>");pw.write("你好啊啊啊 response");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

3. 服务器输出字节数据到浏览器
    * 步骤:
        1. 获取字节输出流
        2. 输出数据

4. 验证码
    1. 本质:图片
    2. 目的:防止恶意表单注册

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int width = 100;int height = 50;//1.创建一对象,在内存中图片(验证码图片对象)BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//2.美化图片//2.1 填充背景色Graphics g = image.getGraphics();//画笔对象g.setColor(Color.PINK);//设置画笔颜色g.fillRect(0,0,width,height);//2.2画边框g.setColor(Color.BLUE);g.drawRect(0,0,width - 1,height - 1);String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";//生成随机角标Random ran = new Random();for (int i = 1; i <= 4; i++) {int index = ran.nextInt(str.length());//获取字符char ch = str.charAt(index);//随机字符//2.3写验证码g.drawString(ch+"",width/5*i,height/2);}//2.4画干扰线g.setColor(Color.GREEN);//随机生成坐标点for (int i = 0; i < 10; i++) {int x1 = ran.nextInt(width);int x2 = ran.nextInt(width);int y1 = ran.nextInt(height);int y2 = ran.nextInt(height);g.drawLine(x1,y1,x2,y2);}//3.将图片输出到页面展示ImageIO.write(image,"jpg",response.getOutputStream());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

ServletContext对象:

1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
2. 获取:
    1. 通过request对象获取
        request.getServletContext();
    2. 通过HttpServlet获取
        this.getServletContext();
3. 功能:
    1. 获取MIME类型:
        * MIME类型:在互联网通信过程中定义的一种文件数据类型
            * 格式: 大类型/小类型   text/html        image/jpeg

        * 获取:String getMimeType(String file)  
    2. 域对象:共享数据
        1. setAttribute(String name,Object value)
        2. getAttribute(String name)
        3. removeAttribute(String name)

        * ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径
        1. 方法:String getRealPath(String path)  
          

   String b = context.getRealPath("/b.txt");//web目录下资源访问System.out.println(b);String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问System.out.println(c);String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问System.out.println(a);

java结丹期(13)----javaweb(responserequestservletcontext)相关推荐

  1. java结丹期(16)----javaweb(maven(2))

    idea开发maven项目(电脑上一定要安装maven,并配置好环境变量才可开始下面的操作) 1.idea的maven配置 打开File→Settings配置maven 依据图片指示,选择本地mave ...

  2. java结丹期(15)----javaweb(maven(1))

    1.maven的基本概念 Maven的正确发音是[ˈmevən](妹瘟),而不是"马瘟"以及其他什么瘟.Maven在美国是一个口语化的词语,代表专家.内行的意思. 一个对Maven ...

  3. java结丹期(14)----javaweb(cookiesession)

     Cookie: 1. 概念:客户端会话技术,将数据保存到客户端 2. 快速入门: * 使用步骤:     1. 创建Cookie对象,绑定数据         * new Cookie(String ...

  4. java结丹期(12)----javaweb(servletHTTPweb相关基本概念)

    web相关概念回顾 1. 软件架构     1. C/S:客户端/服务器端     2. B/S:浏览器/服务器端 2. 资源分类     1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静 ...

  5. java结丹期(11)----javaweb(jstljsp)

    JSP(JavaServer Pages): 1. 概念:     * Java Server Pages: java服务器端页面         * 可以理解为:一个特殊的页面,其中既可以指定定义h ...

  6. 接口测试(筑基期>>>结丹期)

    • 初识HTTP • HTTP的工作原理 • 请求行.状态行和消息报头 • 缓存和认证 • Fiddler的基本介绍 HTTP 的原理 HTTP 1.0 1.连接过程是短暂的 2.每次连接只处理一个请 ...

  7. java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署

    java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B ...

  8. uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9.0.13]

    报错信息如下: uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9. ...

  9. 直面Java第45期

    转载自 直面Java第45期

最新文章

  1. redis如何实现分布式锁?
  2. php tongjiapi 使用_Kayako REST API使用详解一
  3. 游戏数仓分析(一)数据准备阶段
  4. 继承的CSS类在Chrome开发者工具里的显示
  5. 区块链的安全和智能合约
  6. 贴片铝电容识别及型号_电容器选型及其应用规范
  7. 拼多多关联公司申请“碰多多”、“碰碰多”商标
  8. Redis Cluster部署、管理和测试
  9. 快速的APK厂商快速和免费的Andr​​oid应用程序生成器无需编码技巧
  10. 常用的jar包下载网站(自用)
  11. Chrome插件使用IE tab
  12. android制作镜像,android镜像制作方法
  13. html 竖排导航条,html 导航栏
  14. 网络原理考点之ADSL组网技术
  15. 对短信验证码发送次数的限制
  16. 事业单位计算机类岗位考试试题,国家机关(事业单位)计算机岗位考试试题
  17. 林燕妮: 一见杨过误终生
  18. 使用node加密excel文件
  19. 超硬核Python避坑学习方案奉上!入门到就业一篇就搞定!
  20. 大厂地震,疯狂裁员大换血,面试冲击大厂Android移动开发工程师就在此时

热门文章

  1. 什么是脱离文档流?什么是文档流?
  2. win7映射网络驱动器消失了_网络资源共享;共享权限控制
  3. 服务器log文件清理,服务器日志切割清理工具(LogCutter)
  4. 数据中心UPS电源节能降耗的四大原则
  5. 骄阳似火 细数史上数据中心火灾 如何才能重蹈覆辙?
  6. sae mysql django_Django中MySQL读写分离技术
  7. python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...
  8. DayDayUp:哈哈,你上榜了嘛?界面新闻发布2020年中国最富1000人榜,总财富增加28%
  9. 成功解决pypmml.base.PmmlError: (‘MalformedInputException‘, ‘Input length = 1‘)
  10. ML之Hash_EditDistance:基于输入图片哈希化(均值哈希+差值哈希)即8*8个元素的单向vector利用编辑距离算法进行判别