【Jsp】第三课 Servlet常用对象(四)

在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里介绍第二个常用对象,HttpServletRequest

概念

request对象是用于接收浏览器发送过来的请求数据。

常用获得浏览器请求的方法

} 获取浏览器信息
getRequestURL()   得到请求的URL地址
getRequestURI ()  得到请求的资源
getQueryString ()  得到请求的URL地址中附带的参数
getRemoteAddr ()  得到来访者的IP地址
getRemoteHost ()  来访者的主机名
getRemotePort ()  使用的端口号
getMethod ()  得到请求URL地址时使用的方法
getLocalAddr ()  获取WEB服务器的IP地址
getLocalName ()  获取WEB服务器的主机名

代码如下:

/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获得浏览器的请求,得到请求信息
		//得到请求的URL地址
		String a=request.getRequestURL().toString();
		System.out.println(a);
		
		//得到请求的数据
		String b=request.getRequestURI();
		System.out.println(b);
		
		//得到请求的URL地址中附带的参数
		String c=request.getQueryString();
		System.out.println(c);
		
		//得到来访者的IP地址
		String d=request.getRemoteAddr();
		System.out.println(d);
		
		//来访者的主机名
		String e=request.getRemoteHost();
		System.out.println(e);
		
		//来访者的端口号
		int f=request.getRemotePort();
		System.out.println(f);
		
		//得到请求URL地址时使用的方法(重要)
		String h=request.getMethod();
		System.out.println(h);
		
		//获取WEB服务器的IP地址
		String l=request.getLocalAddr();
		System.out.println(l);
		
		//获取WEB服务器的主机名
		String n=request.getLocalName();
		System.out.println(n);
		
		//获取WEB服务器的端口号
		int m=request.getLocalPort();
		System.out.println(m);
	}

 将项目运行在tomcat服务器上,然后通过浏览器地址去访问服务器:

查看到控制台输出的信息如下:

 

当浏览器携带数据访问服务器的时候,我们观察一下效果:

 

 

常用获得浏览器发送的数据信息的方法

 

代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获得浏览器发送过来的姓名和年龄的数据
		String a=request.getParameter("name");
		String b=request.getParameter("age");
		String c=request.getParameter("phone");
		System.out.println("获得浏览器发送给Servlet的数据为:"+a+"--"+b+"--"+c);
		
		//当浏览器发送的数据是同一个名称多个不同的数据
		//servlet需要使用以下这个方法去接收这种数据
		String[] ss=request.getParameterValues("hobby");
		System.out.println(Arrays.toString(ss));
		//tomcat服务器的编码格式是:ISO-8859-1
		//注意:servlet获得浏览器表单发送的数据时,
		//获得的名称一定要和表单上文本框定义的name属性中的名称保持一致
	
		//当浏览器发送大量数据给servlet的时候
		//如果使用getParameter一个个获得,效率太慢
		//使用以下方法可以节省代码,加快开发速度
		Enumeration<String> e= request.getParameterNames();
		while (e.hasMoreElements()) {
			//循环获得的是浏览器发给servlet的数据的名称
			String name=e.nextElement();
			if (name.equals("hobby")) {
				String[] str=request.getParameterValues(name);
				System.out.println(name+":"+Arrays.toString(str));
			}else {
				String value=request.getParameter(name);
				System.out.println(name+":"+value);
			}
			
		}
		
		//使用Map集合获得浏览器发送的所有数据
		Map<String,String[]> map=request.getParameterMap();
		for (Entry<String, String[]> entry : map.entrySet()) {
			String name=entry.getKey();
			String[] values=entry.getValue();
			System.out.println(name+"%"+Arrays.toString(values));
		}
	}

 创建一个jsp页面,编辑一个表单,供用户填写提交的信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
	<!-- 创建表单 -->
	<form action="Servlet2" method="get">
		姓名:<input type="text" name="name" ><br>
		年龄:<input type="text" name="age" ><br>
		手机号:<input type="text" name="phone" ><br>
		兴趣爱好:<input type="checkbox" name="hobby" value="看书">看书&nbsp;
		<input type="checkbox" name="hobby" value="打游戏">打游戏&nbsp;
		<input type="checkbox" name="hobby" value="看小学妹">看小学妹&nbsp;
		<br>
		<input type="submit" value="提交">
	</form>
</body>
</html>

 当用户填写完信息,点击提交的时候,将数据发送给指定的虚拟地址为Servlet2的Servlet。

通过控制台可以看到,四种方式都能获得浏览器发送的数据信息。

 

 

 

代码自行编写后,运行查看效果,请初学者仔细梳理知识点的获得,以及数据传输的流程。

请求转发

在上一篇文章中讲解了response对象的重定向的用法,【Jsp】第三课 Servlet常用对象(三)_笔触狂放的博客-CSDN博客在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里介绍第二个常用对象,HttpServletResponse概述1. Servlet收到浏览器的http请求后,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象2. request和response对象即代表了请求和响应,那我们要获取浏览器提交过来的数据,只需要找request对象就可以了,Servlet要想将数据发送给浏览器上显示,只需要找response即可https://blog.csdn.net/u010321564/article/details/120736132

 那么这篇文章讲解另一种跳转多个Servlet的方式。

什么是请求转发?

指一个servlet收到浏览器请求后,通知tomcat服务器去调用另外一个servlet进行处理

注意:

当浏览器使用get请求访问ServletA的时候,ServletA会对应doGet方法接收浏览器的请求,
然后由于ServletA将该请求转发给ServletB,在转发的过程中请求没有发生变化,还是get请求,
ServletB还是使用doGet方法接收.同理,post也是一样的流程.

代码如下:

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet3
 */
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet3() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//当浏览器访问Servlet3的时候,Servlet3自己跳转到Servlet4,
		//由Servlet4回复消息给浏览器
		request.setAttribute("apple", "苹果");
		request.getRequestDispatcher("Servlet4")
					.forward(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet4
 */
@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet4() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter pw=response.getWriter();
		String a=(String) request.getAttribute("apple");
		pw.print("收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+a);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

访问流程图如下:

整个的访问流程称为一次请求,Servlet3跳转至Servlet4的方式称为请求转发 

重定向与请求转发的区别:
共同点:
都是用于Servlet之间的跳转
区别:
重定向属于浏览器跳转,请求转发属于服务器跳转
重定向浏览器的访问地址会发生变化,请求转发浏览器地址是不会发生改变
重定向跳转Servlet是不能携带数据跳转,请求转发跳转Servlet是可以携带数据跳转
response对象中在跳转页面的时候是不能存储数据做跳转
request对象在跳转页面 到时候是可以存储数据,带上数据跳转页面
总结:
一般不需要将一个Servlet的数据发给另一个Servlet的时候,使用重定向跳转页面
需要发送数据的时候,使用请求转发跳转页面


重定向和请求转发的区别
1.请求转发是在服务器完成的,重定向是在客户端完成的

2.请求转发的速度快,重定向速度慢

3.请求转发的是同一次请求,重定向是二次不同的请求

4.请求转发地址栏没有变化,重定向地址栏有变化

5.转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成的

猜你喜欢

转载自blog.csdn.net/u010321564/article/details/120782176