(一)浏览器访问Servlet过程示意图
1.Servlet主要作用就是处理客户端请求和响应。浏览器每一次请求Servlet,服务器Tomcat在调用Service()方法之前,都会创建两个对象,分别是HttpServletRequest对象和HttpServletResponse对象。
3.HttpServletResponse的作用:封装HTTP响应消息。
(二)HttpServletRequest对象
1.作用:
- 封装HTTP请求消息
- 获取请求头、请求行、请求消息体
2.获取请求行的一些方法
- String getMethod():获取HTTP请求消息的请求方式。
- String getRequestURI():获取URL的主机和端口号之后,参数部分之前的部分。
- String getQueryString():获取资源路径以后的所有内容。
- String getProtacol():获取请求行的协议名和版本。
- String getContextPath():获取web应用程序的路径。
- String getServletPath():获取Servlet映射的路径。
- String getRemoteAddr():获取客户端的IP地址。
- String getRemoteHost():获取完整主机名。
- String getLocalName():获取web服务器上接收当前网络连接IP对应的主机名。
- String getLocalAddr():获取web服务器上接收当前网络连接IP地址。
- String getServletName():获取当前请求 所指向的主机名。
- int getServletPort():获取当前请求所连接的服务器端口号。
- String getScheme():获取请求协议名。
- StringBuffere getRequestURL():获取客户端发出请求的完整URL.
4.输出结果 :
5.HttpServletRequest获取请求消息头的一些方法
- String getHeader(String name):获取指定头字段值
- Emumeration getHeaders(String name):获取Emumeration集合
- Emumeration getHeaderNames():获取一个包含所有请求头字段的Emumeration
- int getIntHeader(String name):获取指定名称的头字段。
- long getDateHeader(String name):获取指定头字段的值。
- String getContentType():获取Content-type头字段值。
- int getContentLength():获取Content-Type头字段的值。
- String getCharacterEncoding():获取编码。
6.利用Referer请求头防止“盗链”
package com.haha;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Properties;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet088")
public class TestServlet088 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html,charser=utf-8");
// 1.创建PrintWriter对象 用于向页面打印数据
PrintWriter out = response.getWriter();
//2.获取referer头字段的值
String referer=request.getHeader("referer");
//3.获取访问路径
String path="http://"+request.getServerName();
//4.判断referer头是否为空
if(referer!=null&&referer.startsWith(path)){
out.println("dead downloading...");
}else{
RequestDispatcher rd=request.getRequestDispatcher("/download.html");
rd.forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<servlet>
<servlet-name>qwe</servlet-name>
<servlet-class>com.haha.TestServlet088</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>qwe</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
(三)HttpServletResponse的使用
作用 :
- 封装HTTP响应消息(响应状态行、响应消息头、响应消息体)
2.发送状态码的一些方法
- setStatus(int status):设置HTTP消息响应的状态码,并生成消息的相应行。
- sendError(int sc):发送表示错误消息的状态码。
3.发送响应消息头的一些方法
- void addHeader(String name,String value)
- void setHeader(String name,String value):设置HTTP协议响应头字段。
- void addIntHeader(String name,int value):
- void setIntHeader(String name,int value):设置包含整数值得消息头
- void setContentType(String type):设置Servlet输出内容的MIME类型
- void setContentLength(int len):设置响应消息体的内容大小,单位为字节。
- void setLocale(locale loc):设置响应消息体的本地化消息。
- void setCharacterEncoding(String charset):设置输出内容使用的编码。
4.发送响应消息的一些方法
1.Servlet中的数据要呈现到浏览器界面,需要通过IO流来实现
- getOutputStream():直接输出字节数组中的二进制数据。(ServletOutputStream)
- getWriter():输出的内容全部为字符文本的网页文档。(PrintWriter)
5.实例演示
package com.haha;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Properties;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet123")
public class TestServlet123 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html,charser=utf-8");
String str="Hello World";
//1.创建ServletOutputStream对象
ServletOutputStream out = response.getOutputStream();
//2.将字符数组转换为字节数组输出去
out.write(str.getBytes());
//3.或调用PrinWriter对象的write()方法
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
----------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<servlet>
<servlet-name>123</servlet-name>
<servlet-class>com.haha.TestServlet123</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>123</servlet-name>
<url-pattern>/123</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
输出结果 :
(四)解决中文输出乱码问题
方法一:
response.setContentType("text/html,charser=utf-8");
方法二:
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type","text/html;charset=utf-8")