Servlet (3)

Servlet中常用的接口、类、方法
1.Servlet接口
2.ServletConfig接口
3.ServletContext接口
4.HttpServletRequest 接口

ServletRequest与HttpServletRequest的关系
HttpServletRequest 接口继承自 ServletRequest 接口。
主要作用是封装 HTTP 请求消息,所以我们也将HttpServletRequest称之为请求对象。
由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分。
因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。
1.获取请求行信息的相关方法
当访问 Servlet 时,所有请求消息将被封装到 HttpServletRequest 对象中,请求消息的请求行中包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,HttpServletRequest 接口定义了一系列方法。
在这里插入图片描述

例如:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
	//通过HttpServletRequest对象得到请求行信息
	System.out.println("getMethod : " + request.getMethod());
	System.out.println("getRequestURI:" + request.getRequestURL());
	System.out.println("getQueryString:" + request.getQueryString());
	System.out.println("getContextPath:" + request.getContextPath());
	System.out.println("getServletPath:" + request.getServletPath());
	System.out.println("getRemoteAddr : " + request.getRemoteAddr());
	System.out.println("getRemoteHost : " + request.getRemoteHost());
	System.out.println("getRemotePort : " + request.getRemotePort());
	System.out.println("getLocalAddr : " + request.getLocalAddr());
	System.out.println("getLocalName : " + request.getLocalName());
	System.out.println("getLocalPort : " + request.getLocalPort());
	System.out.println("getServerName : " + request.getServerName());
	System.out.println("getServerPort : " + request.getServerPort());
	System.out.println("getRequestURL : " + request.getRequestURL());
}

http://localhost:8080/TestServlet7/test7?myname=zhangsan
在这里插入图片描述

2.获取请求消息头的相关方法
在这里插入图片描述

浏览器发送 Servlet 请求时,需要通过请求消息头向服务器传递附加信息,例如,客户端可以接收的数据类型、压缩方式、语言等。为此,在 HttpServletRequest 接口中定义了一系列用于获取 HTTP 请求头字段的方法,
在这里插入图片描述

@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//获取请求消息中的所有头字段
		Enumeration headerNames = request.getHeaderNames();
	    //用循环遍历所有请求头,并通过 getHeader() 方法获取一个指定名称的头字段
	    while (headerNames.hasMoreElements()) {
	    	    //得到请求头的名称
	            String headerName = (String) headerNames.nextElement();
	            System.out.println(headerName + ":" + request.getHeader(headerName));
	        }
	    
	}
}

在这里插入图片描述

3.获取请求参数
在实际开发中,经常需要获取用户提交的表单数据,例如用户名和密码等,为了方便获取表单中的请求参数,在 HttpServletRequest 接口的父类 ServletRequest 中定义了一系列获取请求参数的方法
在这里插入图片描述

例如:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//得到请求参数
		String name=request.getParameter("username");
		System.out.println("用户名:"+name);
		String password=request.getParameter("password");
		System.out.println("密码:"+password);
		String hobby[]=request.getParameterValues("hobby");
		System.out.print("爱好:");
		for(String value:hobby){
			System.out.print(value+",");
		}
	}

在这里插入图片描述

4.通过 Request 对象传递数据
在这里插入图片描述

上面的方法我们需要完成servlet的跳转时再来测试使用。
5.HttpServletResponse
HttpServletResponse 接口继承自 ServletResponse 接口。
主要用于封装 HTTP 响应消息。
由于 HTTP 响应消息分为状态行、响应消息头、消息体三部分。因此,在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
1.发送状态码相关的方法
当 Servlet 向客户端回送响应消息时,需要在响应消息中设置状态码。
1)setStatus(int status)方法
该方法用于设置 HTTP 响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而 HTTP 版本由服务器确定,因此,只要通过 setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,在正常情况下,Web 服务器会默认产生一个状态码为 200 的状态行。
2)sendError(int sc)方法
该方法用于发送表示错误信息的状态码。例如,404 状态码表示找不到客户端请求的资源。response 对象提供了两个重载的 sendError(int sc)方法,具体如下:
public void sendError(int code) throws java.io.IOException
public void sendError(int code,String message)throws java.io.IOException
在上面重载的两个方法中,第一个方法只发送错误信息的状态码,而第二个方法除了发送状态码以外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。
2.发送响应消息头相关的方法
在这里插入图片描述

在这里插入图片描述

需要注意的是,在上表列举的一系列方法中,addHeader()、setHeader()、addIntHeader()、setIntHeader() 方法都用于设置各种头字段,而 setContetType()、setLoacale() 和 setCharacterEncoding() 方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。
3.发送响应消息体相关的方法
由于在 HTTP 响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse 遵循以 I/O 流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法。
1)getOutputStream() 方法
该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOutputStream是OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。
2)getWriter() 方法
该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。

例如:通过HttpServletResponse 接口输出一个html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");

		//得到请求参数
		String name=request.getParameter("username");
		
		//通过HttpServletResponse 接口输出一个html文件
		PrintWriter out=resp.getWriter();
		out.write("<html>");
		out.write("<head><meta charset=\"utf-8\"><title>Servlet</title></head>");
		out.write("<body><center><center><h1>恭喜"+name+",登陆成功</h1></center></body>");
		out.write("</html>");
		out.close(); 
	}

在这里插入图片描述

forward与Redirect的区别?
1.forward—RequestDispatcher接口的
forward(ServletRequest request,ServletResponse response)—该方法用于将请求从一个 Servlet 传递给另一个 Web 资源。【请求转发】
HttpServletRequest接口从ServletRequest接口中继承了一个获取 RequestDispatcher 对象的方法
RequestDispatcher getRequestDispatcher (String path)–返回封装了某条路径所指定资源的 RequestDispatcher 对象。
参数String path—目标路径【必须以“/”开头,用于表示当前 Web 应用的根目录】
需要注意的是,WEB-INF 目录中的内容对 RequestDispatcher 对象也是可见的。因此,传递给 getRequestDispatcher(String path) 方法的资源可以是 WEB-INF 目录中的文件
例如:

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

http://localhost:8080/TestServlet8/test8
在这里插入图片描述

通过 Request 对象传递数据
在这里插入图片描述

例如:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
	<form action="test8" method="post">
		用户名:<input type="text" name="username"><br/>
      	密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   //从 HttpServletRequest对象中删除指定名称的属性
		   //req.removeAttribute("myname");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;

import java.io.IOException;

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

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到来自TestServlet8中保存在HttpServletRequest中的myname数值
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname==="+myname);
	}
}

在这里插入图片描述

RequestDispatcher的forward(req, resp)—请求转发的工作原理图
在这里插入图片描述

2.Redirect----HttpServletRespone.sendRedirect()[重定向]
为了实现请求重定向,HttpServletResponse 接口定义了一个 sendRedirect() 方法.
sendRedirect() 方法的完整语法如下所示:
public void sendRedirect(java.lang.String location) throws java.io.IOException
参数String location—重定向后目标访问路径。
在这里插入图片描述

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletResponse对象的sendRedirect方法完成重定向
		   resp.sendRedirect("other"); //http://localhost:8080/TestServlet8/other
		   
	}
}
package com.wangxing.servlet;

import java.io.IOException;

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

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

在这里插入图片描述

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		    //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   resp.sendRedirect("other");
	}
}
package com.wangxing.servlet;

import java.io.IOException;

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

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname=="+myname);	
	}
}

在这里插入图片描述

总结:
在这里插入图片描述

1.html页面-----》Servlet处理程序

1.<form action="test8" method="post">
2.<a href=”test8”></a>`

3.Js的ajax异步请求发送
2.Servlet处理程序----》html页面
1.RequestDispatcher.forward(req, resp)
2.HttpServletRespone.sendRedirect()

猜你喜欢

转载自blog.csdn.net/guoguo0717/article/details/109102209