今天来回顾下之前学过Servle的Resquest以及Response的知识.
1,Request和Response技术:

    rr的作用:
        request是请求,封装用户的请求信息.若想获取请求信息,找request就行了
        response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了
    rr的体系结构:
        request
        在servlet中有一个service(ServletRequest,ServletResponse)  抽象方法
        在HttpServlet中实现了service(ServletRequest,ServletResponse)
        并且重载了service(HttpServletRequest,HttpServletResponse)
       
        request的实现类 org.apache.catalina.connector.RequestFacade
        response的实现类 org.apache.catalina.connector.ResponseFacade
       
        request的体系
            ServletRequest(接口)
                |
                |
            HttpServletRequest(接口)
                |
                |
            RequestFacade(类 tomcat)
           
       response的体系
           ServletResponse(接口)
                |
                |
            HttpServletResponse(接口)
                |
                |
            ResponseFacade(类 tomcat)
2,Response
   (1)作用:响应
        http响应的格式:
            响应行 响应头 响应体
    (2)简单介绍api
        操作响应行:
            响应行的格式:
                协议/版本 状态码 状态码说明
                HTTP/1.1 200 OK
            常用的方法:
                setStatus(int)
                sendError(int)
                sendError(int,msg)
        操作响应头:
            响应头的格式:
                key:name
                key:name1,name2  --多个值的时候用逗号隔开
            常用的方法:
                setHeader(string,string)
                setIntHeader(string,int)
                addHeader(string,string)
                setDateHeader(string,long)
        操作响应体:
            响应题就是展示的内容
                getOutputStream()
                getWriter()
    (3)详解api
       a, 状态码:
            1xx:正在请求中
            2xx:完成请求响应
                200:成功完成
            3xx:还需浏览器进一步操作
                302:还需跳转
                304:浏览器去读缓存
            4xx:用户请求错误
                404:路径不存在
            5xx:服务器错误:
                500:服务器错误

        常用方法:
            对于非错误的状态码
                setStatus(int):例如 setStatus(304)
            对于的错误的状态码
                sendError(int)
                sendError(int,msg):返回错误的信息
        b,操作响应头:
            响应头的格式:
                key:name
                key:name1,name2  --多个值的时候用逗号隔开
            常用方法:
                setHeader(String key,String name):给响应设置指定的头信息
                addHeader(String key,String name1):若存在则追加,反之则设置
               
                setIntHeader(String key,int value):给响应设置指定的头信息(int类型的)
                addIntHeader(String key,int value):若存在则追加,反之则设置
               
                setDateHeader(String key,Long long):给相应头设置毫秒值的
        案例:
            重定向:
                302:还需要跳转
                需要用到location
                代码实现:
                    setStatus(302);
                    setHeader("location","跳转的路径");
                开发中时使用
                    sendRedirect(跳转的路径);
            刷新:
                response.setHeader("refresh","3;url=跳转的路径");
               
            重定向和刷新最后的效果是一样的,同样是发送了两次请求
代码案例:
使用location跳转:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(302);
//设置跳转路径
response.setHeader("location","/dayaugmentum10/loca2");
}

使用refresh跳转:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "3;url=/augmentum/1.html");
}

c,操作响应体:
        常用的方法:
        ServletOutputStream getOutputStream():字节流
        PrintWriter getWriter():字符流
       
        通过流对象.println(任意内容);
    字符乱码的处理
        设置响应信息的编码格式
            response.setCharacterEncoding("utf-8"):
       
        设置响应信息的编码格式并且通知浏览器用什么编码打开
            response.setHeader("content-type","text/html;charset=utf-8");
            开发中使用
            response.setContentType("text/html;charset=utf-8"); ☆
           
        在页面添加
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    注意事项(针对流)
        字节流和字符流是互斥的.
        tomcat会帮我们关闭流
    验证码:
        作用:防止恶意暴力破解密码

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 使用java图形界面技术绘制一张图片 int charNum = 4;
int width = 30 * 4;
int height = 30; // 1. 创建一张内存图片
BufferedImage bufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); // 2.获得绘图对象
Graphics graphics = bufferedImage.getGraphics(); // 3、绘制背景颜色
graphics.setColor(Color.YELLOW);
graphics.fillRect(0, 0, width, height); // 4、绘制图片边框
graphics.setColor(Color.BLUE);
graphics.drawRect(0, 0, width - 1, height - 1); // 5、输出验证码内容
graphics.setColor(Color.RED);
graphics.setFont(new Font("宋体", Font.BOLD, 20)); // 随机输出4个字符
Graphics2D graphics2d = (Graphics2D) graphics;
String s = "ABCDEFGHIGKLMNOPQRSTUVWXYZ01234567890";
Random random = new Random(); String msg="";
int x = 5;
for (int i = 0; i < 4; i++) {
int index = random.nextInt(26);
String content = String.valueOf(s.charAt(index));
msg+=content;
double theta = random.nextInt(45) * Math.PI / 180;
graphics2d.rotate(theta, x, 18);
graphics2d.drawString(content, x, 18);
graphics2d.rotate(-theta, x, 18);
x += 30;
} // 6、绘制干扰线
graphics.setColor(Color.GRAY);
for (int i = 0; i < 5; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width); int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
} // 释放资源
graphics.dispose(); // 图片输出 ImageIO
ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); }

验证码模版

3,Request
    请求.若想获取请求信息,找我就可以了
    请求的格式:
        请求行 请求头 请求体
    (1)api简介
        a,请求行
            格式:请求方式 资源路径 协议/版本
            例如:GET /augmentum/1.html HTTP/1.1
            常用方法:
                getMethod()
                getRequestURI()
                getProtocol()
                getQueryString()
       b, 请求头
            格式:
                key:name1[,name2]
            常用方法:
                String getHeader(key)
                Enumeration getHeaders(key)
                Enumeration getHeaderNames();
               
                getIntHeaders(key)
       c, 请求体
            只有post才有请求体,存放就是post请求的参数
            例如 username=tom&password=123&hobby=eat&hobby=sleep
            常用方法:
                String getParameter(key)
                Enumeration getParameterNames()
                Map<String,String[]> getParameterMap();
                String[] getParameterValues(key);
           
    (2)api详解
        a,请求行:
            常用方法:
                getMethod():获取请求的方式
                getRequestURI():获取的从项目名开始到请求参数参数之前(?)
                getProtocol():获取协议和版本
                getQueryString():以字符串的形式获取请求参数
                结果:   
                    GET
                    /augmentum/row
                    HTTP/1.1
                    login=tom&password=123

GET /augmentum/form.html HTTP/1.
            常见的请求方式:post和get
                区别:
                  1.get请求的参数会出现在地址栏上,post不会,post相对安全
                  2.get请求参数的大小有限制,post理论上没有.
                  3.只有post有请求体.
            获取用户信息:
                getRemoteAddr():获取用户ip
                getRequestURL():获取请求路径(带协议的路径 URL)
                getContextPath():获取项目名
                结果:
                    192.168.40.1xx
                    http://192.168.40.97/augmentum/row
                    /augmentum

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*//获取请求方式
String method = request.getMethod();
System.out.println(method);
//获取请求资源路径
String uri = request.getRequestURI();
System.out.println(uri);
//获取协议版本
String pro = request.getProtocol();
System.out.println(pro);
//获取get请求的请求参数
String s = request.getQueryString();
System.out.println(s);*/ //获取用户ip
String addr = request.getRemoteAddr();
System.out.println(addr);
//获取请求路径
String url = request.getRequestURL().toString();
System.out.println(url);
//获取项目名
String contextPath = request.getContextPath();
System.out.println(contextPath);
}

b,请求头:
            格式:
                key:name1[,name2]
            常用方法:
                String getHeader(key):获取指定的头信息
                int getIntHeader(key):
                long getDateHeader(key):
                Enumeration getHeaders(key):以Enumeration形式获取指定头的信息
                Enumeration getHeaderNames();返回所有的请求头的名称
            防盗链
                使用的 referer请求头

    String referer = request.getHeader("referer");
if (referer==null) {
System.out.println("地址栏来的 可以访问");
}else if(referer.startsWith("http://localhost/augmentum")){
System.out.println("站内访问");
}else{
System.out.println("站外访问");
}
}

c,请求体:
            只有post请求才有,用来存放请求参数.
            get请求和post通用的方法:
            获取用户参数:
                String getParameter(key):获取指定的参数信息
                String[] getParameterValues(key):以string[]的格式返回指定的参数信息
               
                Map<String,String[]> getParameterMap();以map的形式返回所有的参数
                Enumeration getParameterNames();以Enumeration形式返回所有的参数名称
               
                例如:
                    姓名:tom
                    爱好:[drink, sleep]
                    ----------------------
                    username:[tom]
                    password:[1234]
                    hobby:[drink, sleep]
                    ----------------------
                    username:[tom]
                    password:[1234]
                    hobby:[drink, sleep]

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取姓名
String username = request.getParameter("username");
System.out.println("姓名:"+username);
//获取爱好
String[] hobby=request.getParameterValues("hobby");
System.out.println("爱好:"+Arrays.toString(hobby));
//获取所有
System.out.println("----------------------");
Map<String,String[]> map=request.getParameterMap();
for (String name : map.keySet()) {
System.out.println(name+":"+Arrays.toString(map.get(name)));
}
System.out.println("----------------------");
//获取所有的参数名称
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){ String name = params.nextElement();
System.out.println(name+":"+Arrays.toString(request.getParameterValues(name)));
}
}

d,域对象:
            request:
                一次请求中,响应之前.
                请求串,请求链
                request.getRequestDispatcher("转发路径").forward(request,response)
                服务器内部跳转
                客户端的路径:   /工程名/编写的路径
                服务器的内部路径:   /编写的路径
            常用方法:
                xxxAttribute()
                setAttribute(String,Object);
                Object getAttribute(String)
                removeAttribute()

请求转发与重定向的区别
       1.请求转发是服务器内部跳转,地址栏不会发生改变
        重定向地址栏会发生改变。

        2.请求转发,只有一次请求,一次响应.
        重定向,有两次请求,两次响应。

        3.请求转发存在request域,可以共享数据.
        重定向不存在request域。

        4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。
        重定向可以访问站外资源,也可以访问站内资源.

        5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()
        重定向是由response 发起的  response.sendRedirect();

        6.请求转发与重定向时路径写法不一样.
        重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源
        请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源
可用如下图来表示:

请求的中文乱码:
    浏览器地址栏使用utf-8编码
    tomcat7使用的iso8859-1编码
   
    参数使用utf-8编码,tomcat使用iso-8859-1进行解码出现了乱码.
    解决的思路:
        把接受的参数先iso-8859-1编码,然后使用utf-8进行解码
        对于post请求和get请求可以通过
            new String(name.getBytes("iso8859-1"),"utf-8");
        对于post请求还可以使用
            request.setCharacterEncoding("utf-8");
       
        乱码解决过程       
        String s="赵四";
        String s1=URLEncoder.encode(s,"utf-8");
        String s2=URLDecoder.decode(s1, "iso8859-1");
        System.out.println(s2);
       
        //先使用iso8859-1编码
        String s3 = URLEncoder.encode(s2, "iso8859-1");
        //使用utf-8解码
        String s4 = URLDecoder.decode(s3, "utf-8");
        System.out.println(s4);

[Java拾遗四]JavaWeb基础之Servlet_Request&&Response的更多相关文章

  1. [Java拾遗三]JavaWeb基础之Servlet

    Servlet    1,servlet介绍        servlet是一项动态web资源开发技术.        运行在服务器端.        作用:处理业务逻辑,生成动态的内容,返回给浏览器 ...

  2. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  3. JavaWeb基础:Servlet Response

    ServletResponse简介 ServletResponse代表浏览器输出,它提供所有HttpResponse的设置接口,可以设置HttpResponse的响应状态,响应头和响应内容. 生命周期 ...

  4. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  5. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  6. 关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总

    作者 : Stanley 罗昊 本人自行总结,纯手打,有疑问请在评论区留言 [转载请注明出处和署名,谢谢!] 一.java基础 1.多态有哪些体现形式? 重写.重载 2. Overriding的是什么 ...

  7. 《Thinking In Java第四版》拾遗

    <Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...

  8. Java基础:Java的四种引用

    在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...

  9. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

随机推荐

  1. afterTextChanged() callback being called without the text being actually changed

    afterTextChanged() callback being called without the text being actually changed up vote8down votefa ...

  2. xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  3. iOS 发送Email

    第一步:在程序中添加MessageUi.framework框架 第二步:引入#import <MessageUI/MessageUI.h>头文件 第三步:代码实现 3.1判断是否可以发送邮 ...

  4. IOS 周几转化数字

    NSString *weekStr = @"周二"; NSInteger  weekday = [self passday:weekStr]; -(NSInteger)passda ...

  5. 附10 kibana创建新的index patterns

    elk整体架构图: 一.logstash indexer 配置文件: input { stdin{} } filter { } output { elasticsearch { hosts => ...

  6. RAID配置

    一.madam -a      检测设备名称 -n      指定硬盘数量 -l       指定raid级别 -C     创建 -f       模拟硬盘故障 -r      移除硬盘 -a    ...

  7. Base64编码通过URL传值的问题

    base64 编码中使用了 +号,+号通过URL传递时会变成空格,因为编码的方式的问题前台使用:Ext.encode(title_text.getValue().replace(/\+/g, '%2B ...

  8. php pdo预处理语句与存储过程

    很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 1.查询仅需解析(或预处理) ...

  9. iOS圆形图片裁剪,以及原型图片外面加一个圆环

    废话不多说,直接上代码 #import "ViewController.h" @interface ViewController () @property (nonatomic,s ...

  10. Ubuntu上部署一个简单的Java项目

    一.安装tomcat7,mysql,Java JDK,直接apt安装 $ sudo aptitude install tomcat7 $ -jdk openjdk--jre $ sudo aptitu ...