一个Servlet
就是一段将HTTP请求信息转换为HTTP响应内容(一般为HTML页面)的程序,我们开发者做的工作就是实现这种转换。此前我们实现的doGet()
方法包含的两个参数HttpServletRequest
和HttpServletResponse
就分别用来表示请求信息和响应信息。
了解了如何通过HttpServletResponse
生成基本的HTTP响应信息,现在我们来进一步了解HttpServletRequest
。首先我们需要知道一个基本的HTTP请求包含哪些信息。
一个HTTP请求信息包含哪些内容呢? 你可以从浏览器中的网址就能看到,比如Spring Boot——开发新一代Spring Java应用这个页面的网址是这样的:
http
就是告诉浏览器通过HTTP协议来访问资源。tianmaying.com
是URL中的主机名称,称之为Host,表示Web资源(你此时可以认为就是Web页面)所在的主机的位置。80
是Web应用在服务器中占用的端口号,所以不同的端口号对着一台服务器上的不同Web应用。tutorial/spring-boot-overview
就是URL路径,不同的URL路径一般就对应着一个不同HTTP请求处理程序,就如前面的图中所看到的那样。你可能会说浏览器中没有显示tianmaing.com
后面的:80
,这是因为80
代表的是端口号,Web应用默认的端口号是80,所以就没有显示。
有时我们需要在URL的后面增加参数,比如类似这样的URL:
URL参数是以键值对的形式(name=value
)出现,name
表示参数名称,不同键值对之间通过&
字符连接。
HTTP请求信息中还有一部分重要的信息是HTTP方法。Servlet中我们要实现的最常见的两个方法是doGet()
和doPost()
,它们分别对对应于处理HTTP方法GET和POST的后端代码。
简单地理解,当从浏览器中获取信息,比如上面例子中访问比如Spring Boot——开发新一代Spring Java应用这个页面,使用的就是GET方法;而向浏览器提交信息,比如你在网站上注册用户时,填好信息点击按钮(比如提交或者确定)时,一般使用的是POST的方法。关于如何处理Post请求,我们在下一节课程中学习。
通过Chrome的开发者工具(如何使用请戳Chrome调试)你可以看到一个HTTP请求的所有信息,比如:
关于HTTP协议的更多知识请参考HTTP协议初探和HTTP协议解析。
从Chrome开发者工具中可以看到一个HTTP请求其实包含了普通用户看不到的很多信息,这些信息都可以通过HttpServletRequest
来获取。比如获得当前请求的访问路径可以调用getRequestURI()
方法。HttpServletRequest
包含的完整方法列表请见最有一节内容,无需死记硬背,当你发现处理请求需要用到某些信息时,作为参考手册去查找对应的方法即可。
这里我们介绍一个最重要的方法,即如何获取请求参数,这需要使用getParameter()
方法。
大家在天码营上进行搜索关键字“jsp”,可以看到浏览器中呈现的URL是类似这个样子:https://www.tianmaying.com/search?key=jsp。
天码营网站的Servlet中就是通过这样的代码来处理大家的搜索请求的:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String key = request.getParameter("key");
// 拿到key后在后台搜索包含了关键字的内容,然后返回
}
通过不同的用户输入(HTTP请求中的参数区分),返回不同的内容,这样就能实现了对页面的动态化。
这里举一个更加简单的例子,我们来新建一个Servlet,让其处理两个整数的加法,假设请求的URL为/add
,则我们访问localhost:8080/add?a=1&b=2
时,让页面返回a
参数与b
参数之和。
这个Servlet的代码如下:
package com.tianmaying.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;
@WebServlet("/add")
public class Add extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int a = Integer.parseInt(request.getParameter("a"));
int b = Integer.parseInt(request.getParameter("b"));
response.setCharacterEncoding("UTF-8");
response.getWriter().append(a + b + "");
}
}
同理,如果我们希望获取一篇特定博客的内容,就可以把博客的id
作为请求参数,在Servlet中获取id
参数后,从后台(比如数据库中)查询到该篇博客,然后渲染出相应的HTML内容进行返回。
javax.servlet.http.HttpServletRequest
类用于表示一个HTTP请求,当一个HTTP请求到达时,Servlet容器就会产生一个HttpServletRequest
对象来描述这个请求。这个类提供了一系列方法来获取HTTP信息头,包括参数信息、URL信息、HTTP方法、表单数据、cookies等。
方法名 | 功能 |
---|---|
Cookie[] getCookies() |
返回客户端所有的Cookie的数组 |
Enumeration getAttributeNames() |
返回request对象的所有属性名称的集合 |
Enumeration getHeaderNames() |
返回所有HTTP头的名称集合 |
Enumeration getParameterNames() |
返回请求中所有参数的集合 |
HttpSession getSession() |
返回request对应的session对象,如果没有,则创建一个 |
HttpSession getSession(boolean create) |
返回request对应的session对象,如果没有并且参数create为true,则返回一个新的session对象 |
Locale getLocale() |
返回当前页的Locale对象,可以在response中设置 |
Object getAttribute(String name) |
返回名称为name的属性值,如果不存在则返回null。 |
ServletInputStream getInputStream() |
返回请求的输入流 |
String getAuthType() |
返回认证方案的名称,用来保护servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP没设置保护措施 |
String getCharacterEncoding() |
返回request的字符编码集名称 |
String getContentType() |
返回request主体的MIME类型,若未知则返回null |
String getContextPath() |
返回request URI中指明的上下文路径 |
String getHeader(String name) |
返回name指定的信息头 |
String getMethod() |
返回此request中的HTTP方法,比如 GET,,POST,或PUT |
String getParameter(String name) |
返回此request中name指定的参数,若不存在则返回null |
String getPathInfo() |
返回任何额外的与此request URL相关的路径 |
String getProtocol() |
返回此request所使用的协议名和版本 |
String getQueryString() |
返回此 request URL包含的查询字符串 |
String getRemoteAddr() |
返回客户端的IP地址 |
String getRemoteHost() |
返回客户端的完整名称 |
String getRemoteUser() |
返回客户端通过登录认证的用户,若用户未认证则返回null |
String getRequestURI() |
返回request的URI |
String getRequestedSessionId() |
返回request指定的session ID |
String getServletPath() |
返回所请求的servlet路径 |
String[] getParameterValues(String name) |
返回指定名称的参数的所有值,若不存在则返回null |
boolean isSecure() |
返回request是否使用了加密通道,比如HTTPS |
int getContentLength() |
返回request主体所包含的字节数,若未知的返回-1 |
int getIntHeader(String name) |
返回指定名称的request信息头的值 |
int getServerPort() |
返回服务器端口号 |
登录发表评论 登录 注册
老师第四节第二篇,这一句打错了。应该是想说最后一节吧..