request对象的类是HttpServletRequest,提供了很多有实用价值的方法
步骤1:先运行,看到效果,再学习
步骤2:模仿和排错
步骤3:request的常见方法
步骤4:获取参数
步骤5:获取头信息
步骤6:服务端传参
示例 1 : 先运行,看到效果,再学习
老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
示例 2 : 模仿和排错
在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。
推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
示例 3 : request的常见方法
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter( "name" );
String password = request.getParameter( "password" );
System.out.println( "浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有): " + request.getRequestURL());
System.out.println( "浏览器发出请求的资源名部分,去掉了协议和主机名: " + request.getRequestURI());
System.out.println( "请求行中的参数部分: " + request.getQueryString());
System.out.println( "浏览器所处于的客户机的IP地址: " + request.getRemoteAddr());
System.out.println( "浏览器所处于的客户机的主机名: " + request.getRemoteHost());
System.out.println( "浏览器所处于的客户机使用的网络端口: " + request.getRemotePort());
System.out.println( "服务器的IP地址: " + request.getLocalAddr());
System.out.println( "服务器的主机名: " + request.getLocalName());
System.out.println( "得到客户机请求方式: " + request.getMethod());
String html = null ;
if ( "admin" .equals(name) && "123" .equals(password))
html = "<div style='color:green'>登录成功</div>" ;
else
html = "<div style='color:red'>登录失败</div>" ;
response.setContentType( "text/html; charset=UTF-8" );
PrintWriter pw = response.getWriter();
pw.println(html);
}
}
|
示例 4 : 获取参数
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
本例准备了一个注册的例子
包括一个注册页面 register.html
服务端的 RegisterServlet
分别演示了获取单值参数,多值参数以及遍历所有的参数
<!DOCTYPE html>
<meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" >
<form action= "register" method= "get" >
账号 : <input type= "text" name= "name" > <br>
爱好 : LOL<input type= "checkbox" name= "hobits" value= "lol" >
DOTA<input type= "checkbox" name= "hobits" value= "dota" > <br>
<input type= "submit" value= "注册" >
</form>
|
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println( "获取单值参数name:" + request.getParameter( "name" ));
String[] hobits = request.getParameterValues( "hobits" );
System.out.println( "获取具有多值的参数hobits: " + Arrays.asList(hobits));
System.out.println( "通过 getParameterMap 遍历所有的参数: " );
Map<String, String[]> parameters = request.getParameterMap();
Set<String> paramNames = parameters.keySet();
for (String param : paramNames) {
String[] value = parameters.get(param);
System.out.println(param + ":" + Arrays.asList(value));
}
}
}
|
<?xml version= "1.0" encoding= "UTF-8" ?>
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet- class >HelloServlet</servlet- class >
<load-on-startup> 10 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet- class >LoginServlet</servlet- class >
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet- class >RegisterServlet</servlet- class >
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
</web-app>
|
示例 5 : 获取头信息
request.getHeader() 获取浏览器传递过来的头信息。
比如getHeader("user-agent") 可以获取浏览器的基本资料,这样就能判断是firefox、IE、chrome、或者是safari浏览器
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息
在本例,修改HelloServlet,使其获取头信息
访问HelloServlet获取如下头信息:
host: 主机地址
user-agent: 浏览器基本资料
accept: 表示浏览器接受的数据类型
accept-language: 表示浏览器接受的语言
accept-encoding: 表示浏览器接受的压缩方式,是压缩方式,并非编码
connection: 是否保持连接
cache-control: 缓存时限
import java.io.IOException;
import java.util.Date;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
public void init(ServletConfig config){
System.out.println( "init of Hello Servlet" );
}
public void doGet(HttpServletRequest request, HttpServletResponse response){
Enumeration<String> headerNames= request.getHeaderNames();
while (headerNames.hasMoreElements()){
String header = headerNames.nextElement();
String value = request.getHeader(header);
System.out.printf( "%s %s%n" ,header,value);
}
try {
response.getWriter().println( "<h1>Hello Servlet!</h1>" );
response.getWriter().println( new Date().toLocaleString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
示例 6 : 服务端传参
setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享
在MVC章节会提供更好实例帮助大家理解这两个方法的用途
更多内容,点击了解: https://how2j.cn/k/servlet/servlet-request/555.html