一、简介

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象.
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了.

二、HttpServletResponse

HttpServletResponse对象,服务器的响应.这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法.如下方法

三、HttpServletResponse常见应用

1、向客户端输出中文数据,注意字符流和字节流的区别,编码问题

例1:采用字节流

public class ServletTest extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception {
test2(response);
}
private void test2(HttpServletResponse response) throws Exception {
String data="中国2";
//html: <meta>标签模拟一个http响应头,写回去后浏览器可以解析
OutputStream out=response.getOutputStream();
//out.write(data.getBytes()); //这种方式采用平台默认的字符集编码也就是gb2332
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
out.write(data.getBytes("UTF-8"));
}
//字节流可以读取任何数据,字符流只能读取字符
private void test1(HttpServletResponse response) throws Exception {
String data="中国";
//程序以什么码表输出,就要控制浏览器以什么码表打开(否则浏览器默认按平台的默认字符集进行解码输出)
response.setHeader("Content-type", "text/html;charset=UTF-8");
OutputStream out=response.getOutputStream();
//out.write(data.getBytes());使用平台的默认字符集将此 String 编码为 byte 序列
//下面这句程序会将data按UTF-8编码将数据转换为二进制数据传递给客户端
out.write(data.getBytes("UTF-8"));
}
}

例2:采用字符流

public class ResponseDemo2 extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception{
test1(response);
}
private void test2(HttpServletResponse response) throws IOException {
String data="中国q";
//该句代码等价于其后面两句
response.setContentType("text/html;charset=UTF-8");
//response.setCharacterEncoding("UTF-8");
//response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.write(data);//
}
private void test1(HttpServletResponse response) throws IOException {
String data="中国q";
//设置response使用的码表,控制以什么码表向response写入数据,默认为GBK字符集编码
response.setCharacterEncoding("UTF-8");
//指定浏览器以什么码表打开服务器发送的数据,默认为平台默认字符集编码
response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.write(data);//setCharacterEncoding就是控制这句写入response时的编码
}
}

ps:建议都指明使用UTF-8字符集编码,这样比较清晰.

例3:如果要向客户端输出数据,要将数字变成字符串

public class ServletTest extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse response)
throws ServletException, IOException {
test2(response);
}
private void test2(HttpServletResponse response) throws Exception {
String data="";
OutputStream out=response.getOutputStream();
out.write(data.getBytes());
}
}

2、文件下载

//通过response实现文件下载
public class ResponseDemo3 extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception {
test1(response);
}
   private void test1(HttpServletResponse response) throws Exception {
String path=this.getServletContext().getRealPath("/download/new.jpg");
//C:\apache-tomcat-7.0.22\webapps\day06\download\new.jsp
String filename=path.substring(path.lastIndexOf("\\")+);
     //如果下载文件是中文文件,则文件名需要经过url编码
response.setHeader("content-disposition", "attachment;
            filename="+URLEncoder.encode(filename,"UTF-8"));
     //如下代码是一个模板
InputStream in=null;
OutputStream out=null;
try {
in=new FileInputStream(path);
int len=;
byte buffer[]=new byte[];
out=response.getOutputStream();
while((len=in.read(buffer))>){
out.write(buffer,,len);
}
}finally{
if(in!=null){
try{
in.close();//注意并没有关闭response流,交给servlet去管理
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}

3、输出随机图片,防止恶意注册

package cn.itcast.response;  

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random; import javax.servlet.http.HttpServlet; public class RandomImage { private final static int WIDTH=;
private final static int HEIGHT=; public static BufferedImage createImage(){
//创建图片
BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
//得到图形绘制的对象
Graphics g=image.getGraphics();
//设置背景颜色
setBackGroud(g);
//设置边框
setBorder(g);
//绘制内容
drawContent(g);
//绘制干扰线
drawDisturbLine(g); return image;
} /**
* 绘制干扰线
* @param g
*/
private static void drawDisturbLine(Graphics g) { g.setColor(Color.yellow); Random r=new Random(); for(int i=;i<;i++){
int x1=r.nextInt(WIDTH);
int y1=r.nextInt(HEIGHT);
int x2=r.nextInt(WIDTH);
int y2=r.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2);
} } /**
* 绘制内容
* @param g
*/
private static void drawContent(Graphics g) { //字符资源
String resource="\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; //获取字符长度
int length=resource.length();
//随机操作对象
Random r=new Random();
//存储字符对象
StringBuffer sb=new StringBuffer(); for(int i=;i<;i++){
//随机产生数字
int index=r.nextInt(length);
//获取字符
char c=resource.charAt(index);
//拼接字符
sb.append(c);
}
g.setColor(Color.black);
g.drawString(sb.toString(), , );
} /**
* 设置边框
* @param g
*/
private static void setBorder(Graphics g) { g.setColor(Color.black);
g.drawRect(, , WIDTH-, HEIGHT-);
} /**
* 设置背景颜色
* @param g
*/
private static void setBackGroud(Graphics g) { //绘制矩形
g.setColor(Color.lightGray);
g.fillRect(,, WIDTH, HEIGHT);
}
}
public class ImgServlet extends HttpServlet { final int WIDTH=;
final int HEIGH=; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //禁止浏览器缓存数据
response.setHeader("expires", "");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//通知浏览器以图片的方式打开数据
response.setContentType("image/jpeg");
//把图片显示给浏览器
ImageIO.write(RandomImage.createImage(), "jpeg", response.getOutputStream()); }
}

页面中这么写注意src的书写,ResponseDemo4改成对于的Servlet名称,页面中通过js点击图片时实现刷新,加入一个随机数是为类让浏览器不从缓存中读取图片:

ps:如何在服务器端判断输入的验证码是否正确呢,要用动session,后面讲.

4、发送http头,控制浏览器定时刷新网页(REFRESH)

public class ResponseDemo5 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws Exception {
try {
test3(request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
//真正开发中,servlet不会像页面直接打印数据(也就是一般不会使用test2的用法),一般是转发给jsp,然后由jsp解析数据
private void test3(HttpServletRequest request,HttpServletResponse response) throws Exception {
/*response.setHeader("refresh", "3;url='/day06/index.jsp'");这种方式是不行的,
     个人感觉也是转发以后这个之前的setHeader就失效了,那么像之前的下载,显示图片等,又是怎么操作的呢*/
     其实这些response.setHeader都是最底层的实现原理,明白即可,实际开发都是转发到jsp页面,因为jsp中不能出现一行java脚本,所以上面的那些功能,肯定是通过meta等头元素,还有jsp的标签实现的。
String message="<meta http-equiv='refresh' content='3;url=/day06/index.jsp'>
          登录成功,将在3秒后跳转,如果没有,请点<a href=''>超链接</a>";
request.setAttribute("message",message);
this.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
}
//登陆的时候,用户登录成功,3秒后跳转到首页
private void test2(HttpServletResponse response) throws IOException {
response.setHeader("refresh", "3;url='/day06/index.jsp'");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("登录成功,将在3秒后跳转,如果没有,请点<a href=''>超链接</a>");
}
//3秒后刷新当前请求
private void test1(HttpServletResponse response) throws IOException {
response.setHeader("refresh", "");
String data = new Random().nextInt()+"";
response.getWriter().write(data);
} }

5、发送http头,控制浏览器禁止缓存当前文档内容,之前输出随机图片中已经有相关代码,一般经常变的数据禁止浏览器缓存.

6、那么怎么控制浏览器缓存当前内容呢,实际开发中一般不常变的数据可以设置浏览器缓存?

public class ServletTest extends HttpServlet {
//expires可以设置缓存文件缓存多长时间
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="aaaaa";
response.setDateHeader("expires", System.currentTimeMillis()+*);
response.getWriter().write(data);
}
}

ps:那么实际中转发到jsp又该如何控制呢,猜应该是在meta元素里,但是meta缓冲的是整个页面,而实际一般是只缓冲一个图片什么的又该怎么处理呢?

7、实现请求重定向,不能实现转发,ServletContext可以实现转发

一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.重定向会发送两次请求,意味着有两个response和request,且地址栏会变;转发客户端只有一次请求,有一个response和request,地址栏不会变.

应用场景:一般用户登录和购物车会用重定向,登录后希望用户能重地址栏看到跳转到了首页;购物车如果用转发的话,用户刷新页面会又购买一次,再购物车中又加一个商品.

四、HttpServletResponse细节

1、getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象.
2、getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法,这里但如果是多个servlet之间通过转发的形式也互相排斥.  
3、Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端.
4、Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象,一般我们不需要去手动close.

五、HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息.

1、常用方法

获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL.
getRequestURI方法返回请求行中的资源名部分.
getQueryString 方法返回请求行中的参数部分.
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址.
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式 获得客户机请求头
getHead(name)
getHeaders(String name)
getHeaderNames() 获得客户机请求参数(客户端提交的数据)
getParameter(name)
getParameterValues(String name)
getParameterNames()
getParameterMap()
getInputStream()//客户端上传文件时可以使用

例:

public class RequestDemo1 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { System.out.println(request.getRequestURI());// /day06/servlet/requestDemo1
System.out.println(request.getRequestURL());//http://localhost:8080/day06/servlet/requestDemo1
System.out.println(request.getQueryString());//参数
System.out.println(request.getRemoteAddr());//127.0.0.1
System.out.println(request.getRemoteHost());//返回127.0.0.1,因为没有在DNS中注册
System.out.println(request.getRemotePort());//远程端口号49300
System.out.println(request.getMethod());//GET ,在表单里可为POST
}
}
public class RequestDemo2 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String value=request.getParameter("username");
System.out.println(value);
//拿到所有的参数名,再拿到值
Enumeration e=request.getParameterNames();
while(e.hasMoreElements()){
String name=(String) e.nextElement();
value=request.getParameter(name);
System.out.println(name+"="+value);
}
//一个username可能传递了多个值
String value2[]=request.getParameterValues("username");
for(String v:value2){
System.out.println("u="+v);
}
//web层的框架底层是这么实现的
Map<String,String[]> map=request.getParameterMap();
User user=new User();
User formbean=new User();
try {
BeanUtils.populate(user, map);//用map集合填充bean
BeanUtils.copyProperties(user, formbean);//bean的拷贝
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println(user);
} private void test1(HttpServletRequest request) {
//获取头相关数据
String headValue=request.getHeader("Accept-Encoding"); Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
String name=(String) e.nextElement();
String value=request.getHeader(name);
System.out.println("name="+name+",value="+value);
}
} }

2、request常见应用

1>各种表单输入项数据的获取(后台获取数据的三种方式,超链接,表单,ajax)

text、password、radio、checkbox、file、select、textarea、 hidden,后台通过getParameter()获取.file的获取后面有专题.

public class RequestDemo3 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.getParameter("username");
request.getParameter("password");
request.getParameter("gender");
request.getParameter("city");
request.getParameter("city");
String[] likes=request.getParameterValues("likes");
//编程的一个原则,先检验再使用
for(int i=;likes!=null && i<likes.length;i++){
System.out.println(likes[i]);
}
request.getParameter("description");
request.getParameter("id");
}
}

2>request乱码问题

request编码数据传递到后台时,会默认按照当前打开页面的编码去编码要传的数据.

public class RequestDemo4 extends HttpServlet {

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
} //测试,下面这种情况没有乱码问题
private void test3(HttpServletRequest request, HttpServletResponse response)
throws UnsupportedEncodingException, IOException { request.setCharacterEncoding("UTF-8");
String username=request.getParameter("username"); response.setCharacterEncoding("gb2312");
response.setContentType("text/htm;charset=gb2312");
response.getWriter().write(username);
} private void test2(HttpServletRequest request)
throws UnsupportedEncodingException {
//解决POST乱码
request.setCharacterEncoding("UTF-8");
String username=request.getParameter("username");
System.out.println(username);
} private void test1(HttpServletRequest request)
throws UnsupportedEncodingException {
//解决Get方式提交的乱码,只能手动处理
String username2=request.getParameter("username2");
//先用iso-8859-1解成二进制文件,再重新编程utf-8
username2=new String(username2.getBytes("iso-8859-1"),"UTF-8");
System.out.println(username2);
}
}

2>request对象实现请求转发

请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理.request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发.request对象同时也是一个域对象(request域),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理.应用实例:MVC设计模式,软件领域最重要的设计思想,request执行完以后转发给jsp去显示数据.

public class RequestDemo9 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
//servlet里面一般使用request域,使用ServletContext域有线程问题
request.setAttribute("data", "中国");
//MCV 转发给一个jsp页面去显示数据
request.getRequestDispatcher("/day06/index.jsp").forward(request, response);
}
}

ps:jsp页面读取这个data数据,可以通过<% request.getAttribute("data") %>,现在不这么写,通过标签来写.注意getAttribute和getParameter()的区别.

3>请求转发的细节
1.如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被传送到了客户端,forward方法将抛出IllegalStateException异常.
2.如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效,那为什么转发给jsp页面的response不能实现刷新
例:

//程序将抛出异常
public class RequestDemo9 extends HttpServlet { @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { PrintWriter pw = response.getWriter();
pw.write("aa");
pw.close();//不写这句没有写给客户端,只是写过response响应体,不会抛出异常
request.getRequestDispatcher("/day06/index.jsp").forward(request, response);
}
}
public class RequestDemo10 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//程序只会看到index.jsp的内容,不会看到aa,已经被清空
PrintWriter pw = response.getWriter();
pw.write("aa");
request.getRequestDispatcher("/day06/index.jsp").forward(request, response);
}
}

3、请求重定向和请求转发的区别

一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发.
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向.

1、RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.
2、如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录.
3、调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变.
4、HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为.
5、RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程.

4、include方法
RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能.

public class RequestDemo11 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//被包含页面不要有全局架构标签
request.getRequestDispatcher("/public/head.jsp").include(request, response);
response.getWriter().write("hahaha");
request.getRequestDispatcher("/public/foot.jsp").include(request, response);
}
}

ps:1、web工程中各类地址的写法

public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    //记住以下这点写地址无往而不利
    //首先写'/',给服务器用'/'代表当前web应用;给浏览器用'/'代表当前站点
    //例:如下几个使用案例 :
//超链接和form表单都是给浏览器
//正斜杠用在如上这些地方,反斜杠用在硬盘的资源定位上
    .request.getRequestDispatcher("/form1.html").include(request, response);
    .response.sendRedirect("/day06/form1.html");
    .this.getServletContext().getRealPath("/form1.html");
    .this.getServletContext().getResourceAsStream("/fomr1.html");
}
}

2、防盗链用法

public class RequestDemo9 extends HttpServlet {

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String referer = request.getHeader("referer");
if(referer!=null&&referer.startsWith("http://localhost:8080")){
response.sendRedirect("/day06/index.jsp");//跳首页
return;
}
...
}
}

javaEE(4)_response、request对象的更多相关文章

  1. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. request对象学习

    import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; imp ...

  3. request 对象和 response 对象

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 HttpServletResponse HttpServletR ...

  4. JSP内置对象之request对象【学习笔记】

    request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径. 一.获取请求头与 ...

  5. request对象和response对象

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用.Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏 ...

  6. 重温Servlet学习笔记--request对象

    request和response是一对搭档,一个负责请求一个负责响应,都是Servlet.service()方法的参数,response的知识点前面梳理过了,这里只说一下request,在客户端发出每 ...

  7. 通过Request对象对cookie的设置、获取

    <html> <head></head> <body> <% request.setCharacterEncoding("UTF-8&q ...

  8. JSP基础——属性保存范围和request对象

    JSP属性保存范围 JSP中提供了四种属性保存范围,分别为page,request,session及application. 1.page范围,指设置的属性只在当前页面有效.通过pageContext ...

  9. request对象详解

    先来了解一下Request的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值getAttribute(String name): ...

随机推荐

  1. jpa使用原生SQL查询数据库like的用法

    jpa使用like查询,需要拼接字符串,如下 oracle用法: //dao层代码 @Query(value = "SELECT * FROM TABLENAME WHERE USER_NA ...

  2. python 如何在 command 中能够找到 其他module

    部分代码如下: __author__ = 'norsd' # coding=utf8 # 上句说明使用utf8编码 try: import os import sys import time #关键语 ...

  3. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  4. 百度搜索:有关Baiduspider的10个问题

    猫宁!!! 参考链接: http://help.baidu.com/question?prod_id=99&class=476&id=2996 https://ziyuan.baidu ...

  5. xml中运用js和jq

    1.点击事件参数为this 一般<a>标签中会使用href和onclick两种方式来进行进行页面跳转或执行动作,但是小编一般都会使用onclick来进行执行Ajax函数进行跳转,并同时使用 ...

  6. idea下载

  7. Django (六) 视图 views

    views 1. 视图及HttpRequest 和HttpResponse Django中的视图主要用来接受Web请求,并做出响应. 视图的本质就是一个Python中的函数 视图的响应分为两大类 1) ...

  8. aix 推荐使用重启

    重启os AIX 主机 推荐 shutdown –Fr 在客户一次停机维护中,发现了这个问题. 环境是ORACLE 10G RAC for AIX6,使用了HACMP管理共享磁盘. 在停机维护时间段内 ...

  9. H5存储

    1.localstorage ① 500万字符限制② 一般存储ajax请求返回数据,并且需要设置过期时间③ 具有清理机制,将过期数据清理④ 不存储敏感信息⑤ 不存储SEO依赖数据,至少不能严重依赖⑥ ...

  10. WebService_Demo

    简述 使用IDEA开发webservice服务,从零开始一步一步指引你. 服务端开发 首先创建一个webservice项目,如下图 创建完项目后idea会帮我们创建一个类,helloword,我们把它 ...