1.通过request获得请求行:
获得客户端请求方式:String getMethod()
获得请求的资源:
String getRequestURI() 获得相对路径
StringBuffer getRequestURL() 获得网址
String getContextPath() 获得web应用的名称(项目名称)
String getQueryString() 获得地址后的参数的字符串
request.getRomoteAddr() 获得访问的客户端IP地址
例1:
form.html文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/WEB15/line" method="get">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="submit" name="提交"><br>
</form>
</body>
</html>
Servlet文件:
package line;
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 LineServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获得请求方式
String method = request.getMethod();
System.out.println("method:"+method);
StringBuffer requestURL = request.getRequestURL();
String requestURI = request.getRequestURI();
System.out.println("URI:"+requestURI);
System.out.println("URL:"+requestURL);
// 3.获得web应用的名称(项目名称)
String contextPath = request.getContextPath();
System.out.println("web应用:"+contextPath);
// 4.地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
发布WEB15后,在浏览器中输入:localhost:8080/WEB15/form.html
输入:zhangsan
123
点击提交,返回eclipse控制台,则控制台显示:
2.通过request获得请求头
Long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders()
Int getIntHeader(String name)
例2:
新建servlet文件:
package header;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HeaderServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获得指定的头
String header = request.getHeader("User-Agent");
System.out.println(header);
// 2.获得所有头的名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
发布WEB15后,浏览器输入:http://localhost:8080/WEB15/header,返回eclipse控制台,控制台显示:
3.通过request获得请求体
请求参数:
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map getParameterMap()
例3:
Servlet文件:
package content;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ContentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获得单个表单值
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
System.out.println("-----------");
// 2.获得多个表单的值
String[] hobbys = request.getParameterValues("hobby");
for(String hobby:hobbys){
System.out.println(hobby);
}
System.out.println("-----------");
// 3.获得所有请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
System.out.println("-----------");
// 4.获得所有的参数,封装到一个Map<String,String[]>
Map<String,String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String, String[]> entry:parameterMap.entrySet()){
System.out.println(entry.getKey());
for(String str:entry.getValue()){
System.out.println(str);
}
System.out.println("-----------");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/WEB15/content">(此处的”content”是建立servlet时填写的路径名称)
<input type="text" name="username">
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="zq">足球
<input type="checkbox" name="hobby" value="pq">排球
<input type="checkbox" name="hobby" value="ppq">乒乓球<br>
<input type="submit" value="提交"><br>
</form>
</body>
</html>
在浏览器输入:localhost:8080/WEB15/form.html
输入:
Lisa
789
勾选:排球、乒乓球
点击提交按钮后,回到eclipse控制台,显示如下:
4.request其他功能
4.1 request是一个域对象
Request对象也是一个存储数据的区域对象,所以也有如下方法:
setAttribute(String name,Object o)
getAttribute(String name)
removeAttribute(String name)
4.2 request完成请求转发
获得请求转发器
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
forward(ServletRequest request,ServletResponse response)
重定向和请求转发过程图示:
例4:
第一个servlet文件:
package forward;
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 Servlet1 extends HttpServlet {
private RequestDispatcher requestDispatcher;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 向request域中存储数据
request.setAttribute("name", "Tom");
// servlet1将请求转发给servlet2
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
// 执行转发的方法
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
第二个servlet文件:
package forward;
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 Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从request域中取出数据
Object attribute = request.getAttribute("name");
response.getWriter().write("hello haohao..."+attribute);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在浏览器中输入:localhost:8080/WEB15/servlet1
则会自动调用servlet2的方法,在浏览器页面显示:
注意:
Request域的作用范围:一次请求中(不同于重定向是两次请求)
5.request细节
-
ServletContext域与Request域的生命周期的比较
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中 -
转发与重定向区别
A. 重定向两次请求,转发一次请求
B. 重定向地址栏的地址变化,转发则不变
C. 重定向可以访问外部网站,转发只能访问内部资源
D. 转发的性能要优于重定向 -
客户端地址与服务端地址的写法
客户端地址:
是客户端去访问服务器的地址,服务器外部的地址,特点:要写上web应用的名称
直接输入地址:
如:重定向
服务器端地址:
服务器内部资源的跳转的地址,特点:不需要写web应用的名称
如:转发