精华内容
下载资源
问答
  • 接着我们上一篇文章继续:servlet的java类我们稍作修改:public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决请求参数乱码 // 1....

    接着我们上一篇文章继续:

    servlet的java类我们稍作修改:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//解决请求参数乱码
    		// 1.post请求方式的数据是以二进制流的形式发送到服务器。
    	    // 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。
    	    // setCharacterEncoding必须要获取请求参数之前调用才有效
    	    request.setCharacterEncoding("UTF-8");
    	    //解决返回显示内容乱码
    	    //告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
    	    response.setContentType("text/html; charset=utf-8");
    	    String username = request.getParameter("username");
    	    System.out.println("你输入的是" + username);
    	    // 把输入的数据反显到前台页面
    	    PrintWriter out = response.getWriter();
    	    out.println("<h1>" + username + "</h1>");
    	    //关闭输入流
    	    out.close();
    	    //清空缓冲区
    	    out.flush();
    	    
    	}




    这里PrintWriter把内容输出到页面的时候是重新新建的页面,但如果我们想反显的内容在原请求的页面,怎么做呢?

    servlet重定向常用的两种方法:

    1、运用javax.servlet.RequestDispatcher接口的forward方法,

    2、运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法

    一、请求转发:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//解决请求参数乱码
    		// 1.post请求方式的数据是以二进制流的形式发送到服务器。
    	    // 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。
    	    // setCharacterEncoding必须要获取请求参数之前调用才有效
    	    request.setCharacterEncoding("UTF-8");
    	    //解决返回显示内容乱码
    	    //告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
    	    response.setContentType("text/html; charset=utf-8");
    	    String username = request.getParameter("username");
    	    System.out.println("你输入的是" + username);
    	    //重定向
    	    request.getRequestDispatcher("/test.jsp").forward(request, response);
    	    // 把输入的数据反显到前台页面
    	    PrintWriter out = response.getWriter();
    	    out.println("<h1>" + username + "</h1>");
    	    //关闭输入流
    	    out.close();
    	    //清空缓冲区
    	    out.flush();
    	    
    	}

    这里需要注意:request.getRequestDispatcher("/test.jsp").forward(request, response);需放置在响应前面

    举例:

    我们把重定向放到最后:


    接下来我们再看sendRedirect方法:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//解决请求参数乱码
    		// 1.post请求方式的数据是以二进制流的形式发送到服务器。
    	    // 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。
    	    // setCharacterEncoding必须要获取请求参数之前调用才有效
    	    request.setCharacterEncoding("UTF-8");
    	    //解决返回显示内容乱码
    	    //告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
    	    response.setContentType("text/html; charset=utf-8");
    	    String username = request.getParameter("username");
    	    System.out.println("你输入的是" + username);
    	    //重定向 
    	    response.sendRedirect("test.jsp");
    	    // 把输入的数据反显到前台页面
    	    PrintWriter out = response.getWriter();
    	    out.println("<h1>" + username + "</h1>");
    	    //关闭输入流
    	    out.close();
    	    //清空缓冲区
    	    out.flush();
    	    
    	}

    这里我们同前面的操作:


    嗯?这是什么问题呢?我们再把地址加上/:

        response.sendRedirect("/test.jsp");


    再改://重定向 

        response.sendRedirect("../test.jsp");

    可见:在此方法中使用方法:

    response.sendRedirect(request.getContextPath()+"/test.jsp");

    response.sendRedirect("../test.jsp");

    我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。也就是说使用response.sendRedirect时,前面不能有HTML输出

    最后总结两个方法:

    1、使用forward()方法

    RequestDispatcher rd = request.getRequestDispatcher("wel.jsp");
    rd.forward(request, response);

    这种方法实现跳转效率高,同时request对象还可以在下一个页面引用,并且有助于隐藏实际的链接

    2、使用sendRedirect()方法

    response.sendRedirect("wel.jsp");

    这种重定向,效率较慢,一般不这么使用。

    ===========重定向中 绝对路径和相对路径的使用================

    <form action=”" >中的路径一般写相对

    相对路径response.sendRedirect(“foo/stuff.do”)。容器相对于原来请求URL的目录加参数来生成完整的URL

    绝对路径:response.sendRedirect(“/foo/stuff.do”)。容器相对于Web应用本身加参数建立完整的URL

    HttpServletRequest.getRequestDispatcher(String)

    参数可以指定为相对路径或绝对路径。

    相对路径情况下生成的完整URL与sendRedirect方法相同。

    绝对路径与重定向不同,容器将相对于Web应用的根目录加参数生成完整的URL

    展开全文
  • Servlet重定向

    2019-09-27 23:13:26
    重定向就是在访问一个Servlet时,没有得到资源,只能去找另外一个Servlet去获取资源。状态码为302。...import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java...

    重定向就是在访问一个Servlet时,没有得到资源,只能去找另外一个Servlet去获取资源。状态码为302。

    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(name = "MyServlet")
    public class MyServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setStatus(302);
            response.setHeader("Location", "https://start.firefoxchina.cn/");
        }
    }

    在服务器执行该程序的时候,状态码被设置为302(重定向),并且告诉了服务器的访问地址。

    在通过Http协议访问MyServlet时,http地址由http://localhost:8080/MyServlet_war_exploded/abc自动变为火狐的网址。因为状态码已经告诉服务器http://localhost:8080/MyServlet_war_exploded/abc这条路走不通了,并且告诉它了一条新路。

     

    转载于:https://www.cnblogs.com/zhai1997/p/11483346.html

    展开全文
  • Servlet重定向解决页面刷新问题 重定向可以解决页面的刷新问题 案例:页面进行表单提交,后台连接数据库后插入提交的数据,然后跳转到插入成功页面;跳转的方式有两种 转发 重定向 public class Save extends ...

    Servlet重定向解决页面刷新问题

    重定向可以解决页面的刷新问题

    案例:页面进行表单提交,后台连接数据库后插入提交的数据,然后跳转到插入成功页面;跳转的方式有两种

    • 转发
    • 重定向
    public class Save extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
    
            //解决中文乱码
            request.setCharacterEncoding("UTF-8");
    
            //获取表单数据
            String usercode = request.getParameter("usercode");
            String username = request.getParameter("username");
    
            Connection conn = null;
            PreparedStatement ps = null;
            int row = 0;
    
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "admin");
                conn.setAutoCommit(false);
                ps = conn.prepareStatement("insert into t_user(usercode,username) value(?,?)");
                ps.setString(1,usercode);
                ps.setString(2,username);
                row = ps.executeUpdate();
                conn.commit();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException throwables) {
                //如果发生异常,如果conn!=null,回滚数据
                if(conn != null) {
                    try {
                        conn.rollback();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                throwables.printStackTrace();
            } finally {
                //省略关闭
            }
    
            if(row ==1) {
                //执行成功,跳转到成功页面
    
                //1. 转发
                //浏览器只进行一次请求,如果此时浏览器进行刷新,浏览器刷新的是最后一次请求,即提交表单的请求,
                //此时多次刷新浏览器,那么就会请求多次,就会执行多次Servlet,
                //就会多次连接数据库插入数据,导致数据重复插入
                //request.getRequestDispatcher("/success.html").forward(request,response);
    
                //2. 重定向
                //服务器返回重定向的地址(success.html),浏览器就会请求新的地址,
                //一共有两次请求:提交表单的请求和重定向的请求
                //此时如果浏览器多次刷新,那么请求的也是重定向的success.html静态页面,
                //不会因为刷新而导致多次提交表单
                response.sendRedirect(request.getContextPath() + "/success.html");
            }
        }
    }
    

    浏览器刷新,刷新的是浏览器的最后一次请求

    使用转发:

    浏览器提交表单后,后台进行转发到access.html成功页面,浏览器只进行了一次请求,如果此时浏览器进行刷新,那么就会刷新最后一次提交表单的请求,会导致因为多次刷新而提交多次表单,导致后台执行多次Servlet,导致数据库插入多条重复记录

    在这里插入图片描述
    在这里插入图片描述

    使用重定向:

    浏览器提交表单后,后台通过重定向,将重定向的地址(/webapp17/access.html)发送给浏览器,浏览器会请求重定向的地址;这个过程中一共有两次请求:提交表单的请求、重定向的新的地址的请求;此时浏览器进行刷新,刷新的是最后一次重定向地址的请求,请求的资源是access.html,多次刷新就会多次请求access.html,并不会导致多次提交表单!

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • servlet重定向

    2014-04-14 11:30:40
    servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现: 1,运用javax.servlet.RequestDispatcher接口的forward方法, 2,或者运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法...

    在servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现:

    1,运用javax.servlet.RequestDispatcher接口的forward方法,

    2,或者运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法。

    要运用RequestDispatcher接口的forward方法,首先要得到一个RequestDispatcher对象。servlet技术提供了三种方式来得到它:

    1. 通过运用javax.servlet.ServletContext接口的getRequestDispatcher方法,将一个包含路径的String传递给其它资源。该路径是相对于ServletContext的根路径的。 
    2. 通过运用javax.servlet.ServletRequest接口的getRequestDispatcher方法,将一个包含路径的String传递到其它资源。该路径是相对于当前的HTTP请求的。 
    3. 通过运用javax.servlet.ServletContext接口的getNamedDispatcher方法,传递一个包含其它资源名字的String。 

    但要注意,你只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward方法前必须先清空缓冲区。否则,会抛出一个IllegalStateException。forward方法也可以用来将请求发送到一个静态的页面。

    在运用RequestDispatcher对象的forward方法来将一个控件从一个叫做ABCServlet的servlet传递到另一个叫做XYZServlet的servlet时,最简单的方法就是把ABCServlet和XYZServlet的类文件放在同一个目录中。通过这种方法,你就可以从 http://www.handandaily.com/servlet/ABCServlet来调用ABCServlet,从http://www.handandaily.com/VirtualDir/servlet/XYZServlet来调用XYZServlet了。然后运用forward方法就很简单了。你可以从ServletRequest接口运用getRequestDispatcher ,传递第二个servlet的名字。在ABCServlet中,你可以写下面的代码:  
    RequestDispatcher rd = 
    request.getRequestDispatcher("SecondServlet");
      rd.forward(request, response);
    你不需要在XYZServlet前放 / 符号。这种方法是最简单的,因为你根本不需要担心两个servlets的路径。 
    稍复杂的方法就是把下面这个String传递到ServletRequest的getRequestDispatcher:"/servlet/XYZServlet"
    如果你必须调用一个从ServletContext的getRequestDispatcher得到的RequestDispatcher对象的forward方法,你需要将“/VirtualDir/servlet/XYZServlet”作为路径参数来传递,如下:  
    RequestDispatcher rd =  getServletContext().getRequestDispatcher( "/servlet/XYZServlet");
      rd.forward(request, response);

    <jsp:forward page=”OtherPage.jsp”/>在结果servlet中就转换成了下面的代码:pageContext.forward("OtherPage.jsp");

    运用HttpServletResponse接口的sendRedirect方法
    该方法把一个命令发送到浏览器,让浏览器对在location中指定的URL提出请求。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。如果地址是相对的,没有一个’/’,那么Web container就认为它是相对于当前的请求URI的。

    你应该运用哪种技巧?
    [QUOTE]为了编写最有效的代码,你应该了解这两种重定向技巧的不同。forward方法是在Web container内部工作的。sendRedirect方法需要到客户端的一个往返。所以forward方法比sendRedirect要快。但是,运用forward方法有局限性,你只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何URL。结论:如果可以解决你的问题,那么就用forward方法。只有当你不能用forward方法时才运用sendRedirect方法。

    forward不会改变当前浏览器地址栏中的路径


    本文转自:http://www.cnblogs.com/kaixin110/archive/2008/04/14/1152897.html

    展开全文
  • Servlet重定向与转发

    2019-07-14 15:46:36
    重定向与转发的区别 重定向:服务器告诉客户端,你去请求另外一个地址,这是客户端行为,但是是服务器干的事情。 地址栏会变; 不能携带参数; response.sendRedirect("https://baidu.com"); 转发:服务器自己...
  • RTservlet在对客户端请求的数据处理之后,会向客户端返回相应的响应结果。这个响应结果可以是由当前servlet对象的PrintWriter输出流直接输出到页面上的信息,也可以是一个新的URL地址对应的信息。
  • Web容器加载servlet,生命收起开始,通过调用servlet 的的init()方法进行servlet的初始化,通过调用service()方法实现,根据请求的不同调用不同的do***()方法,结束服务,web容器调用servlet的destroy()...
  • Servlet 请求转发和重定向的区别 先看看怎么实现的 // 1、容器内请求转发 request.getRequestDispatcher("url").forward(request,response); // 2、浏览器重定向 response.sendRedirect("url"); 共同点: 都可以...
  • jsp和servlet重定向

    2010-05-31 18:27:00
    一、   在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。Servlet控制业务流转,JSP则负责业务处理结果的显示。此时,将大量用到重定向技术。  重定向技术可以分为两类,一类是客户端...
  • Servlet中的请求转发与重定向探究 a. 探究过程 b. 经验总结1.采用与 Jsp与Servlet ...index.jsp、servlet()与web.xml此三文件。$1.修改ServletRequest.java中的代码:request.getRequestDispatcher("end.jsp").for
  • 1. 获得Servlet初始化参数 2. 将请求重定向到某个网站 从一个Servlet跳转到另一个Servlet 包含该页面内容,从一个Servlet跳转到另一个Servlet
  • 我们知道,当一个请求到达Servlet时,如果你不想处理该请求,你可以将请求分派(转发)给Web引用中的另一个组件(Servlet或Jsp等)来处理(即转发),又或者可以把请求重定向到另一个完全不同的URL来处理(即重定向...
  • 转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。 1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过 HttpServletRequest 的 getRequestDispatcher() ...
  • 主要有两种方式: ...sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如: response.sendRedirect("URL"); 注:这个url是要加上http的。 跳转后浏览器地址栏变化。 这种方式要传值出去
  • 写在前面:学习JAVA WEB,在提交新增表单后F5,form表单会不停的提交,困扰了我很久,也试过网上很多方法,可能是我使用方法不对,一直不成功。 其中代码为: int result = sf.add(stuno, pwd, stuname, stusex...
  • 转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。 1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()...
  • servlet类欲和jsp界面关联,其中的@WebServlet声名格式为 @WebServlet( name=“XXservlet” urlPatterns={&quot;/XXX&quot;} … ) 由此观之XML可注解的@webservlt也能注解 重定向与请求转发 ...
  • servlet实例 目录:a. 探究过程及源代码 b. 最后总结**a.探究过程及源代码**1.jsp探究原理方法: 创建4张jsp页面,index.jsp、f1.jsp、f2.jsp、end.jsp。index.jsp:首页链入f1.jsp、f2.jsp。f1.jsp:jsp转发页面...
  • servlet重定向到jsp后,css样式和图片都没了,原因是在servlet中转发时css和图片的路径变成相对于这个servlet的相对路径而非相对于web项目的路径了。 解决办法:导入css样式和图片时把css写成动态绝对路径, 如用...
  • 4.请求结果返回给web容器,web容器给浏览器发出带重定向的http响应 5.浏览器发出新的http请求。。。(该请求步骤和上述一样,最后一步中浏览器得到结果) 转载于:...
  •  web服务器发送一个302状态码及一个Location消息头(该消息头的值是一个地址,一般称之为重定向地址)给浏览器,浏览器收到之后,会立即向重定向地址发请求。  简单理解为:服务器通知浏览器向一个新地址发请求。  ...
  • 首先,web浏览器发布请求给web容器,web容器首次访问,容器创建一个目标Servlet1,然后会创建一个请求和响应的对象(request和response),拿着对象去执行service方法,在service内部读取请求和响应的头,在service...
  • 原因是在servlet中转发时css和图片的路径变成相对于这个servlet的相对路径而非相对于web项目的路径了。 解决办法:导入css样式和图片时把css写成动态绝对路径, 如用EL表达式表示: <link rel="stylesheet" ...
  • 重定向什么是重定向 服务器通知浏览器向一个新的地址发送请求 注: 可以发送一个302状态码和一个location消息头 该消息头包含了一个地址。这个地址称为重定向地址。浏览器收到之后,会立即向重定向地址发请求2、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,763
精华内容 27,905
关键字:

webservlet重定向