zoukankan      html  css  js  c++  java
  • javaEE(4)_response、request对象

    一、简介

    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="1";
            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.22webappsday06download
    ew.jsp
            String filename=path.substring(path.lastIndexOf("\")+1);
         //如果下载文件是中文文件,则文件名需要经过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=0; byte buffer[]=new byte[1024]; out=response.getOutputStream(); while((len=in.read(buffer))>0){ out.write(buffer,0,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=80;  
            private final static int HEIGHT=30;  
              
            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=0;i<4;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="u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";  
              
                //获取字符长度  
                int length=resource.length();  
                //随机操作对象  
                Random r=new Random();  
                //存储字符对象  
                StringBuffer sb=new StringBuffer();  
                  
                for(int i=0;i<4;i++){  
                    //随机产生数字  
                    int index=r.nextInt(length);  
                    //获取字符  
                    char c=resource.charAt(index);  
                    //拼接字符  
                    sb.append(c);  
                }  
                g.setColor(Color.black);  
                g.drawString(sb.toString(), 20, 20);  
            }  
          
            /** 
             * 设置边框 
             * @param g 
             */  
            private static void setBorder(Graphics g) {  
                  
                g.setColor(Color.black);  
                g.drawRect(0, 0, WIDTH-2, HEIGHT-2);  
            }  
          
            /** 
             * 设置背景颜色 
             * @param g 
             */  
            private static void setBackGroud(Graphics g) {  
                  
                //绘制矩形  
                g.setColor(Color.lightGray);  
                g.fillRect(0,0, WIDTH, HEIGHT);  
            }  
        }  
        public class ImgServlet extends HttpServlet {  
            
            final int WIDTH=80;  
            final int HEIGH=30;  
          
            public void doGet(HttpServletRequest request, HttpServletResponse response)  
                    throws ServletException, IOException {  
          
                //禁止浏览器缓存数据  
                response.setHeader("expires", "0");  
                response.setHeader("Cache-Control", "no-cache");  
                response.setHeader("Pragma", "no-cache");  
                //通知浏览器以图片的方式打开数据  
                response.setContentType("image/jpeg");  
                //把图片显示给浏览器  
                ImageIO.write(RandomImage.createImage(), "jpeg", response.getOutputStream());  
                  
            }  
        } 
    View Code

    页面中这么写注意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", "3"); String data = new Random().nextInt(100000)+""; 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()+3600*1000);
            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=0;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表单都是给浏览器
               //正斜杠用在如上这些地方,反斜杠用在硬盘的资源定位上
            1.request.getRequestDispatcher("/form1.html").include(request, response);
            2.response.sendRedirect("/day06/form1.html");
            3.this.getServletContext().getRealPath("/form1.html");
            4.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;
            }
            ...
        }
    }
  • 相关阅读:
    解决安装Visual Studio 2012后SQL Server 2008 远程过程调用失败的问题
    解决 Visual Studio 2012 有时不能调试的问题
    WPF实现窗体最小化后小图标在右边任务栏下
    WinForm实现窗体最小化后小图标在右边任务栏下
    C# 开机启动代码
    C# ?? 操作符示例
    WPS页面设置
    PCA(主成分分析)和LDA详解
    MySQL命令行导入sql文件时出现乱码解决方案
    IKAnalyzer 独立使用 配置扩展词典
  • 原文地址:https://www.cnblogs.com/wangweiNB/p/4899628.html
Copyright © 2011-2022 走看看