Request
1.获取请求的基本信息
1>获取请求的url和uri
2>获取url后面的请求参数部分的字符串
3>获取请求方式
4>获取主机名,IP地址
5>获取 Contexpath

String

url
=
request.getRequestURL().toString();

System.out.println(url);
String

uri
=
request.getRequestURI().toString();

System.out.println(uri);
String

params
=
request.getQueryString();

System.out.println(params);
String

method
=
request.getMethod();

System.out.println(method);
String

addr
=
request.getRemoteHost() +

request.getRemotePort() +

request.getRemoteAddr() +

    "==user="

+
request.getRemoteUser();

System.out.println("addr:
"
+
addr);
String

contextPath
=
request.getContextPath();

response.sendRedirect(contextPath

+
"/index.jsp");


2.通过 Referer 请求头实现防盗链
Referer请求头的值表示从哪个网页上的链接访问到当前链接
盗链: 其他站点通过超链接链接到自己的站点,从而实现资源的盗窃称为盗链.
@WebServlet("/NewsServlet")
public

class
NewsServlet
extends
HttpServlet {

    private

static
final
long
serialVersionUID
= 1L;

    protected

void
doGet(HttpServletRequest
request, HttpServletResponse

response)

throws
ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
       
       String

referer
=
request.getHeader("Referer");

       if(referer

==
null
||
"".equals(referer)
|| !referer.contains("localhost/"))
{

           response.sendRedirect(request.getContextPath()
+
"/index.jsp");
       }
       
       response.getWriter().write("习大大吃包子....");
    }
    protected

void
doPost(HttpServletRequest
request, HttpServletResponse

response)

throws
ServletException, IOException {

       doGet(request,

response);

    }
}

如果Referer为空或者不是从自己的站点访问过来就重定向到自己站点的主页.


2.获取请求参数
Map<String, String[]>

params
=
request.getParameterMap();

for

(String
name
:
params.keySet()) {

   String

value
=
request.getParameter(name);

   System.out.println("name="

+
name
+
", value="
+
value);

}

解决请求乱码问题:
request.setCharacterEncoding("Utf-8");
如果上面的代码只能解决POST的乱码问题, 则可以自行进行解码操作
String

userName
=
request.getParameter("username");

userName


new
String(userName.getBytes("ISO8859-1"),

"UTF-8");


前段使用 UTF-8 进行编码, 传输到服务器, 服务器可以使用 ISO8859-1 解码得到UTF-8编码后的码值, 然后通过new String(bytes, charset)的方式进行解码.

3.设置和获取域属性
Object

attr
=
request.getAttribute("attr");

request.setAttribute("key",

"value");

request.removeAttribute("attr");
Enumeration<String>

attributeNames
=
request.getAttributeNames();


一般我们的应用是servlet处理数据, 将处理好的数据放到request域中,然后带到jsp页面上进行展示操作.

  1. 请求转发与请求包含
请求转发:
request.getRequestDispatcher("/DispatcherTest2").forward(request,

response);

this.getServletContext().getRequestDispatcher("/DispatcherTest2").forward(request,

response);


Note:
    1)一次请求只能转发一次, 否则会发生下面的异常: -- 可以得到第一次转发获取的数据
java.lang.IllegalStateException:
Cannot forward after response has been committed
    2)当有数据已经写到客户端时再请求转发也会抛出异常.

    3)若转发前有数据写入到response缓冲区,则请求转发会清空response缓冲区的实体内容, 但不会清空请求头信息.


请求包含:
当需要将多个servlet的输出合并到一块打给浏览器时可以使用请求包含
request.getRequestDispatcher("/DispatcherTest2").include(request,

response);

this.getServletContext().getRequestDispatcher("/DispatcherTest2").include(request,
response);

Notice:
    1)被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.
    2)常被用来进行页面布局

请求重定向:
response.sendRedirect(request.getContextPath()
+
"/DispatcherTest2");

Notice:
1) 不能在数据已经发送到浏览器之后再进行请求重定向:
java.lang.IllegalStateException:
Cannot call sendRedirect() after the response has been committed

2) 在请求重定向之前写入到response缓冲区的数据会被清空
3) 一次请求只能重定向一次



Summary:
请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
请求重定向两次请求两次响应.请求转发一次请求一次响应.

如果需要在资源跳转时利用request域传递域属性则必须使用请求转发
如果希望资源跳转后修改用户的地址栏则使用请求重定向

如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.



Response
1.response
    ServletResponse -- 通用的response提供了一个响应应该具有最基本的属性和方法
        |
        |-HttpServletResponse -- 在ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法

2.输出数据
 1)getOutputStream字节输出流
response.getOutputStream().write("中国".getBytes("utf-8"));

string.getBytes()如果没有指定编码方式,会使用平台默认的编码方式


2)getWriter字符输出流
response.getWriter().write("北京");
    Notice: getWriter和getOutputStream在一次请求中只能使用一个
    使用字符输出流输出中文时, 由于网线上只能输出高低电平,如果没有指定编码方式,那么服务器在发送数据时会使用默认的ISO-8859-1对数据编码(该码表中没有汉字, 因此汉字会被编码为?, 传送到浏览器上的数据实际就是?).

3)解决乱码
    1> 通知服务器发送数据时使用utf-8编码
response.setCharacterEncoding("utf-8");

    2> 通知浏览器接受数据时使用utf-8解码
response.setHeader("Content-Type", "text/html;charset=utf-8");

    3> Notice:
        a. response对象中对Content-Type响应头进行了封装,可以使用一下代码代替 2>
response.setContentType("text/html;charset=utf-8");
        b. 如果设置了Content-Type,服务器会自动的设置 characterEncoding,因此解决乱码只需要设置Content-Type响应头一行代码就可以了,但是为了代码的可读性更高,一般还是建议同时设置 characterEncoding 和 Content-Type.


3)实现下载
protected

void
doGet(HttpServletRequest
request, HttpServletResponse

response)

throws
ServletException, IOException {

    response.setHeader("Content-Disposition",

"attachment;filename="
+ URLEncoder.encode("美女.jpg"));

    InputStream

in
=
new
FileInputStream(this.getServletContext().getRealPath("美女.jpg"));

    OutputStream

out
=
response.getOutputStream();

    byte[]

bytes
=
new
byte[1024];

    int

len
= -1;

    while(-1
!= (len

=
in.read(bytes)))
{

       out.write(bytes,
0,
len);
    }
    in.close();
}

4) 实现定时刷新
    1.Servlet实现
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功,
3秒后回到主页");
response.setHeader("Refresh",

"3;url=OutServlet");


    2.html实现
<meta

charset="UTF-8">

<meta

http-equiv="Refresh"

content="3; url=index.jsp"

>

<title>Insert
title here</title>
</head>
<body>
    恭喜您注册成功, 3秒后回到主页....
</body>


5)控制浏览器是否缓存
response.setIntHeader("Expires",
-1);
response.setHeader("Cache-Control",

"no-cache");

response.setHeader("Pragma",

"no-cache");

response.getWriter().write(new

Date().toLocaleString());


6)实现请求重定向

response.sendRedirect(this.getServletContext().getContextPath());

7)输出验证码图片
package
com.inetsoft.response;
import
java.awt.Color;
import
java.awt.Font;
import
java.awt.Graphics2D;
import
java.awt.image.BufferedImage;
import
java.io.IOException;
import
java.util.Random;
import
javax.imageio.ImageIO;
import
javax.servlet.ServletException;
import
javax.servlet.annotation.WebServlet;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
 *

@Description: 用于输出验证码图片的Servlet

 *

@Warning:

 *

@Author
DreamLi

 *

@Package
Day04-Response-Request

--  com.inetsoft.response.ValidServlet

 *

@Date: 2017年12月17日 下午4:51:22

 *

@Version: 1.0.0

 */
@WebServlet("/ValidServlet")
public

class
ValidServlet
extends
HttpServlet {

    
    private

static
final
long
serialVersionUID
= -70985881600765636L;

    private
Random

rand =

new
Random();

    public

void
doGet(HttpServletRequest
request, HttpServletResponse

response)

           throws
ServletException, IOException {
       //设置响应头让浏览器不再缓存验证码图片
       response.setDateHeader("Expires",
-1);
       response.setHeader("Cache-Control",

"no-cache");

       response.setHeader("Pragma",

"no-cache");

       
       //创建验证码图片
       //1.创建一张图片到内存中
       int

width
= 120;

       int

height
= 30;

       BufferedImage

img =

new
BufferedImage(width,

height, BufferedImage.TYPE_INT_RGB);

       //2.获取该图片上的画笔
       Graphics2D

g = (Graphics2D)

img.getGraphics();

       //3.设置背景色以及图片边框
       g.setColor(new
Color(199,237,204));
       g.fillRect(0,
0,
width,

height);

       g.setColor(Color.black);
       g.drawRect(0,
0,
width-1,

height-1);

       //4.设置干扰线
       int

lineNum
= randNumber(3,7);//干扰线的条数

       for(int

i = 0;i
<
lineNum;i++){

           g.setColor(new
Color(randNumber(0,255),randNumber(0,255),randNumber(0,255)));
           g.drawLine(randNumber(0,width),
randNumber(0,height),randNumber(0,width),
randNumber(0,height) );
       }
       //5.设置验证码内容
       int

row = 10;

       int

col = 22;

       g.setFont(new
Font("黑体", Font.BOLD,
20));
       StringBuffer

buffer
=
new
StringBuffer();

       for(int

i = 0;i
< 4;i++){

           g.setColor(new
Color(randNumber(0,255),randNumber(0,255),randNumber(0,255)));
           double

theta
= Math.toRadians(randNumber(-50, 50));

           g.rotate(theta,

row,

col);

           int

num = randNumber(0, 9);

           buffer.append(num);
           g.drawString(num+"",

row,

col);

           g.rotate(0-theta,

row,

col);

           row
+= 30;
       }
       //将验证码加入到session
        request.getSession().setAttribute("valid",

buffer.toString());

       System.out.println(buffer);
       //6.写入到输出流中
       ImageIO.write(img,

"jpg",

response.getOutputStream());

    }
    /**
     * 产生一个区间里面的随机数
     *

@param
left 区间左值

     *

@param
right 区间右值

     *

@return
区间里面的一个随机数

     */
    private

int
randNumber(int

left,int

right){

       return

rand.nextInt(right
-
left) +

left;

    }
    public

void
doPost(HttpServletRequest
request, HttpServletResponse

response)

           throws
ServletException, IOException {
       doGet(request,

response);

    }
}




Request对象和Response对象详解的更多相关文章

  1. jsp九大内置对象和其作用详解

    jsp九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.p ...

  2. 007-Scala类的属性和对象私有字段实战详解

    007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 gett ...

  3. django HTTP请求(Request)和回应(Response)对象

    Django使用request和response对象在系统间传递状态.—(阿伦)当一个页面被请示时,Django创建一个包含请求元数据的 HttpRequest 对象. 然后Django调入合适的视图 ...

  4. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  5. Dream------scala--类的属性和对象私有字段实战详解

    Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...

  6. JS DOM对象控制HTML元素详解

    JS DOM对象控制HTML元素详解 方法: getElementsByName()  获取name getElementsByTagName()  获取元素 getAttribute()  获取元素 ...

  7. request对象和response对象,什么时候用,具体用哪一个,没有感觉

    request对象和response对象,什么时候用,具体用哪一个,没有感觉

  8. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

  9. JavaScript对象的property属性详解

    JavaScript对象的property属性详解:https://www.jb51.net/article/48594.htm JS原型与原型链终极详解_proto_.prototype及const ...

  10. JAVA-JSP内置对象之response对象

    相关资料:<21天学通Java Web开发> response对象1.response对象用来给客户端传送输出信息. 方法                                 ...

随机推荐

  1. Spider_scrapy

    多线程爬虫 进程线程回顾 进程 系统中正在运行的一个应用程序 1个CPU核心1次只能执行1个进程,其他进程处于非运行状态 N个CPU核心可同时执行N个任务 线程 进程中包含的执行单元,1个进程可包含多 ...

  2. 七、Docker+nginx

    原文:七.Docker+nginx docker run -p 80:80 --name nginx-v1.0.0 -v /usr/nginx/www:/www -v /home/docker/ngi ...

  3. 【习题 7-6 UVA - 12113】Overlapping Squares

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出来一个正方形. 然后每次枚举新加的正方形左上角的坐标就可以. 注意覆盖的规则,控制一下就可以. 然后暴力判断是否相同. 暴 ...

  4. [TS] Implement a doubly linked list in TypeScript

    In a doubly linked list each node in the list stores the contents of the node and a pointer or refer ...

  5. 106.TCP传文件

    客户端 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include < ...

  6. Mybatis like查询的写法--转载

    原文地址:http://lavasoft.blog.51cto.com/62575/1386870 Mybatis like查询官方文档没有明确的例子可循,网上搜索了很多,都不正确. Mybatis ...

  7. 在Windows下搭建Apacheserver

    Apacheserver是一款基于HTTP协议的webserver.Apacheserver使用CGI开发 首先下载Apacheserver,下载地址http://download.csdn.net/ ...

  8. 【几何/数学】概念的理解 —— (非)刚体变换((non-)rigid transformation)

    1. 刚体变换与非刚体变换 What is a non-rigid transformation? 刚体变换(rigid transformation)一般分为如下几种: 平移对象,而不改变形状和大小 ...

  9. POJ 3617 Best Cow Line ||POJ 3069 Saruman's Army贪心

    带来两题贪心算法的题. 1.给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下面两个操作:1.从S的头部删除一个字符,加到T的尾部.2.从S的尾部删除一个字符,加 ...

  10. 回家过年,CSDN博客暂时歇业

    CSDN博客之星2013评选活动,结束了,感谢大家的投票. 我个人只是主动拉了300票左右,2400+的票都是大家主动投的,非常感谢啊! (*^__^*) 年关将至,最近也在忙自己的事情,不再更新了. ...