request和response,请求转发和重定向(图文详解)

request对象

request对象时javax.servlet.http.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接受通过Http协议传送到服务端的数据(包括信息头,系统信息,请求方式及请求参数等)。request对象的作用域为一次请求。

request对象常见的方法:
           String getParameter(String name):根据请求的字段名key(比如input标签的name属性),返回字段值value
           String[] getParameterValue(String name):根据请求的字段名key,返回多个字段值(比如input标签的value属性,一般是checkbox对象)
           void setCharacterEncoding(" utf-8"):设置post请求编码(tomcat7以前默认为iso-8859-1,tomcat以后为utf-8)
           getRequestDispatcher("b.jsp").forward(request,response):请求转发的方式跳转页面
           ServletContext getServletContext():获取项目的ServletContext对象

登录注册实例:

register.jsp 和show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'register.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <form action="show.jsp" method="post">
   		用户名:<input type="text" name="useName"><br/>
   		密码:<input type="password" name="usePwd"><br/>
   		年龄:<input type="text" name="useAge"><br/>
   		爱好:<br/>
   		<input type="checkbox" name="useHobbies" value="音乐">音乐
   		<input type="checkbox" name="useHobbies" value="编程">编程
   		<input type="checkbox" name="useHobbies" value="游戏">游戏
   		<input type="checkbox" name="useHobbies" value="篮球">篮球<br/>
   		<input type="submit" value="注册"><br/>
   </form> <br>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'show.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	<%
		//设置post编码
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("useName");
		String pwd = request.getParameter("usePwd");
		int age = Integer.parseInt(request.getParameter("useAge"));

		String[] hobbies = request.getParameterValues("useHobbies");
	%>

	注册成功信息如下:<br />
	 姓名:<%=name%><br /> 
	 年龄:<%=age%><br /> 
	 密码:<%=pwd%><br />
	 爱好:<br />
	<%
		if (hobbies != null) {
			for (String hobby : hobbies) {
				out.print(hobby + "&nbsp;");
			}
		}
	%>

</body>
</html>

结果显示如下:

register.jsp

show.jsp

网页跳转:http://localhost:8888/MyJspProject/show.jsp?useName=Emove&usePwd=123&useAge=23&useHobbies=%E9%9F%B3%E4%B9%90&useHobbies=%E7%BC%96%E7%A8%8B
        其格式为:链接/文件?参数名1=参数值1 & 。。。。
    get提交方式:method=”get“ 和地址栏、超链接(<a href="xx">)请求方式默认都属于get提交方式
    get和post请求方式的区别:
        1、get方式在地址栏上显示信息(但是地址栏能容纳的信息有限,4-5kb,如果请求数据存在大文件,会出现地址栏无法容纳全部的数据而出错),post不会
        2、文件上传操做必须是post
          一般推荐使用post    

response对象

response对象代码的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。

response对像的重要方法:

void addCookie(Cookie cookie):服务端向客户段增加cookie对象
           void sendRedirect(String location)throws IOException:页面跳转的一种方式(重定向)
           void setContentType(String type):设置服务端响应编码(设置服务端ContentType类型)

实例:登录
            login.jsp check.jsp success.jsp

login.jsp

<form action="login/check.jsp" method="post">
    	用户名:<input type="text" name="useName"><br/>
    	密码:<input type="password" name="usePwd"><br/>
    	<input type="submit" value="登录"><br/>
</form>

           check.jsp

<%
    	request.setCharacterEncoding("utf-8");
    	String name = request.getParameter("useName");
    	String pwd = request.getParameter("usePwd");
    	if(name.equals("Emove") && pwd.equals("123456")){
    		//只有登录成功,session中才会有userName和userPwd
    		session.setAttribute("userName", name);
    		session.setAttribute("userPwd", pwd);
    		System.out.print("sessionid:"+session.getId()+"<br/>");
    		Cookie cookie = new Cookie("name",name);
    		response.addCookie(cookie);
    		//请求转发跳转到welcome
    		request.getRequestDispatcher("Welcome.jsp").forward(request, response);
    	}else{
            //重定向	
    		//登录失败
    		response.sendRedirect("login.jsp");
    	}
 %>

         success.jsp

登陆成功! <br>
   	欢迎:
   		<%
   			String name = request.getParameter("useName");
   			out.print(name);
   		 %>

请求转发和重定向原理

请求转发

当客户端提交表单信息,向服务端发送请求时,服务端通过check.jsp验证表单信息,验证成功后,跳转到success.jsp。其中只有一次请求,一次响应。

request.getRequestDispatcher("Welcome.jsp").forward(request, response);

注:.forward(request,response);为默认格式。

其原理图如下:

重定向

当客户端提交表单信息,向服务端发送请求时,服务端通过check.jsp验证表单信息,验证成功后,向客户端发送第一次响应,告诉客户端发送请求到success.jsp。服务端success.jsp再给出响应。其中有两次请求,两次响应。

response.sendRedirect("success.jsp");

其原理图如下:

请求转发和重定向的区别

  请求转发 重定向
地址栏是否改变
数据是否在一次请求中有效 保留 不保留
请求的次数 一次 两次
跳转发生的位置 服务端 第二次时响应的位置

 

注:数据是否在一次请求中有效意思为:数据是否可在JSP页面间共享。因为请求准发在服务端发生跳转,即为一次请求,所以数据会被保留。而重定向需要两次请求,数据保留在第一次请求中,即采用重定向到跳转到的页面访问不到第一次请求时的数据。

猜你喜欢

转载自blog.csdn.net/weixin_40516653/article/details/83342672