• 【servelt原理_10_servlet应用_转发请求】


    转发请求【重点】

    请求转发是一种服务器行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的url地址不会发生改变,得到相应后,服务器端会将请求发送给客户端,从始至终只有一个请求发出。

    request.getRequestDispatcher(url).forward(request, response);
    
    • 1

    具体实现,定义两个servlet

    /**
     * 
     * @author lenovo
     *         请求转发跳转
     *                 可以让服务器端跳转到客户端(或者指定的(Servlet)
     *           特点:	
     *     1.服务器端行为      
     *     2.地址栏不会发生改变
     *     3.从始至终都是一个请求
     *     4.request当中的数据在servlet程序中共享
     */
    @WebServlet(value="/s01")
    public class Servlet01 extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		String username  = req.getParameter("username");
    		String password = req.getParameter("password");
    		System.out.println("s01="+username + " " + password);
    		// 请求跳转到Servlet02
    		//req.getRequestDispatcher("s02").forward(req, resp);
    		//请求发送到html页面
    		req.getRequestDispatcher("RegistServlet.html").forward(req, resp);
    	
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    @WebServlet(value="/s02")
    public class Servlet02 extends HttpServlet{
          @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        	// TODO Auto-generated method stub
        	  String username  = req.getParameter("username");
      		String password = req.getParameter("password");
      		System.out.println("s02=" + username + " " + password);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行起来我们发现s01和s02都会输出,且只是请求了一次
    在这里插入图片描述
    在这里插入图片描述
    ⑤:request作用域[重点]
    request表示一个请求,只要发出一个请求就会创建一个request对象,他的作用域:仅在当前请求中有效。
    用处:常用于服务器间同一请求不同页面之间的参数传递,常用于表单的控制值传递。
    在这里插入图片描述
    使用方式:给Servlet传值

    @WebServlet("/s03")
    public class Servlet03 extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		System.out.println("我是03");
    		req.setAttribute("user", "qcby");
        	req.setAttribute("age", 18);
                    		
        	req.getRequestDispatcher("s04").forward(req, resp);
    
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    
    @WebServlet("/s04")
    public class Servlet04 extends HttpServlet{
          @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        	// TODO Auto-generated method stub
        	System.out.println("我是04");
        	System.out.println(req.getAttribute("user"));
        	System.out.println(req.getAttribute("age"));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    访问:http://localhost:8080/SecondServlet/s03
    在这里插入图片描述

    2.response对象
    在这里插入图片描述
    ①:response的主要方法
    在这里插入图片描述
    getWriter()

    @WebServlet("/regist")
    public class RegistServlet  extends HttpServlet{
    	
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		
    		
    		
    		PrintWriter printWriter = resp.getWriter();
    		printWriter.print("success");
    	
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    getOutputStream()

    @WebServlet("/regist")
    public class RegistServlet  extends HttpServlet{
    	
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		// PrintWriter writer = resp.getWriter();
    		// writer.print("success");
    		ServletOutputStream stream  = resp.getOutputStream();
    		stream.write("Success".getBytes());
    	
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="/SecondServlet/regist" method="post"> 
    		用户名:<input type="text" name="username"/>
    		密码:<input type="text" name="password"/>
    		<input type="submit" value="注册">
    	</form>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    ②:响应乱码问题
    浏览器与服务器传输中文数据会乱码,原因就是服务器响应数据默认采用iso8859-1码表,浏览器默认采用GBK码表,所以就会乱码。
    要解决该乱码只能在服务器端告诉服务器使用一种能够支持中文的编码格式,比如UTF-8

    response.setCharacterEncoding("UTF-8");
    
    • 1

    此时还只是完成了一半的工作,要保证数据的正确显示,还要指定客户端的编码方式

    response.setHeader("content-type", "text/html;charset=UTF-8");
    
    • 1

    两端指定编码后,乱码就解决了,一句话:保证发送端和接收端的编码一致
    以上两句话可以简化为一句话,同时指定客户端和服务器端

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

    案例

    @WebServlet(value="/s01")
    public class Servlet01 extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter writer = response.getWriter();
    		writer.append("

    你好

    "
    ); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @WebServlet(value="/s01")
    public class Servlet01 extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html;charset=utf-8");
    		ServletOutputStream outputStream = response.getOutputStream();
    		outputStream.write("

    你好

    "
    .getBytes()); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Unity 头顶信息的优化
    力扣——并查集算法系列
    Neo4j数据和Cypher查询语法笔记
    nginx学习(4)Nginx 配置高可用集群(主从配置)
    TinyRenderer学习笔记--Lesson 3、4
    机械臂速成小指南(六):步进电机驱动器
    卷积公式和分布函数去解决Z=X+Y,Z=XY,Z=Y/X等Z的概率密度函数以及如何确定他们的范围
    数据结构之栈
    教你轻松使用Fastjson
    Python下载安装教程Python3.7版本
  • 原文地址:https://blog.csdn.net/edwer93/article/details/128143745