获取请求参数
最为常见的客户端传递参数方式有两种GET 和 POST:
浏览器地址栏直接输入:一定是GET请求;
超链接:一定是GET请求;
表单:可以是GET,也可以是POST,这取决于表单Form的method属性值;
<form action="/servlet/ServletA" method="post">
GET请求和POST请求的区别:
GET请求:
1)请求参数会在浏览器的地址栏中显示,所以不安全;
2)请求参数长度限制长度在1K之内;
3)GET请求没有请求体,无法通过
request.setCharacterEncoding()来设置参数的编码;
POST请求:
1)请求参数不会显示浏览器的地址栏,相对安全;
2)请求参数长度没有限制;
获取请求参数的具体方法:
根据参数名称获取参数
public String getParameter(String name);
例子:
页面一个超链接一个表单
<body>
<!--超链接是GET请求-->
<a href="/servlet/ServletA?name=zhangsan&age=28">超链接</a>
<hr/>
<!--表单的请求方式method为post-->
<form action="/servlet/ServletA" method="post">
参数1:<input type="text" name="name"/><br/>
参数2:<input type="text" name="age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
Servlet中java代码(doGet doPost 都一样可以)
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("request.getParameter(\"name\"): " + request.getParameter("name"));
System.out.println("request.getParameter(\"age\"): " + request.getParameter("age"));
}
打印结果为:
当多个参数名称相同时,可以使用方法来获取
String[] getParameterValues(String name);
访问地址为:
http://localhost:8080/servlet/ServletA?name=zhangsan&name=lisi
System.out.println("request.getParameter(\"name\"): "
+ request.getParameter("name"));
String[] names = request.getParameterValues("name");
System.out.println(Arrays.toString(names));//遍历数组中的值
打印结果为:
可以看得出来request.getParameter(“name”) 打印的是第一个姓名
获取所有参数的名称
public Enumeration getParameterNames();
发送HTTP请求:
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male
Enumeration pNames = request.getParameterNames();
while(pNames.hasMoreElements()) {
System.out.println(pNames.nextElement());
}
输出结果为:
获取所有参数封装到Map中,其中key为参数名,value为参数值
因为一个参数名称可能有多个值,所以参数值是String[],而不是String
public Map getParameterMap();
例子:
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male&name=lisi&age=18
//转换为Map
Map<String,String[]> paramMap = request.getParameterMap();
//获取键,根据键获取值数组
for(String name : paramMap.keySet()) {
String[] values = paramMap.get(name);
System.out.println(name + ": " + Arrays.toString(values));
}
输出结果为:
请求转发和请求包含
RequestDispatcher forward include
无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。
请求转发与请求包含比较
1)如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,
即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;
如果是使用请求包含,那么没有这个限制;
2)请求转发虽然不能输出响应体,但还是可以设置响应头的
例如:response.setContentType(”text/html;charset=utf-8”);
3)请求包含大多是应用在JSP页面中,完成多页面的合并;
4.请求转发大多是应用在Servlet中,转发目标大多是JSP页面;
请求转发示例:
ServletA中代码如下:
response.getWriter().println("ServletA");
//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。
RequestDispatcher rd = request.getRequestDispatcher("/ServletB");
rd.forward(request, response);
//或者写成:
//request.getRequestDispatcher("/ServletB").forward(request,response);
ServletB中仅仅响应信息
response.getWriter().write("ServletB");
请求地址为:
http://localhost:8080/servlet/ServletA
输出结果的页面数据为:
从输出结果中可以看出,虽然A中有response.getWriter().println(“ServletA”);
但是没有任何的结果,请求直接被转发给了ServletB
请求包含示例:
请求的地址:
http://127.0.0.1:8080/servlet/ServletA
ServletA代码如下:
response.getWriter().println("ServletA");
//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。
RequestDispatcher rd = request.getRequestDispatcher("/ServletB");
rd.include(request, response);
页面的输出结果为:
此时A和B Servlet的响应都可以正常输出,也就是响应进行了合并
请求转发与重定向比较
1)请求转发是一个请求,而重定向是两个请求;
2)请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
3)请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
4)请求转发对ServletA和ServletB的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
5)重定向的第二个请求一定是GET;
1)请求转发是一个请求,而重定向是两个请求;
请求转发示例:
模拟用户登录
RequestDemo04----Servlet转发到JSP页面
//处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//模拟查询当前用户的个人信息
String name="测试";
String addr="武汉";
//将数据存入request对象的map集合中,一个request域中
request.setAttribute("name", name);
request.setAttribute("addr", addr);
//通过转发将request对象及其中的数据转发带入到show.jsp进行显示
request.getRequestDispatcher("show.jsp").forward(request, response);
show.jsp页面
<body>
<h3>show.jsp....</h3>
<p><%= request.getAttribute("name")%></p>
<p><%= request.getAttribute("addr") %></p>
<!--获取request域对象中的存储的值-->
</body>
页面输出结果为:
请求的地址为:
http://localhost/day09/RequestDemo04
我们看到,请求转发前后(从访问RequestDemo04的Servlet跳转到show.jsp做响应)地址栏地址没有发生变化
(因为浏览器不知道服务器内部做了跳转)
重定向的示例:
ResonseDemo02----Servlet----跳转到JSP页面
//重定向到day09/show2.jsp,在同一个Web应用内部的资源之间进行跳转
response.sendRedirect("show2.jsp");
//show2.jsp指的是相对路径
show2.jsp
<body>
<h3>day09.....show2.jsp....</h3>
</body>
输出页面的结果为:
从上面可以看出访问的地址由
http://localhost/day09/ResponseDemo2
变为了请求show2.jsp的地址,说明重定向是用户浏览某个网址时,将其导向到另一个网址去了,将浏览器地址栏进行重新的请求
即发生了二次请求,
重定向还可以是:
1)//重定向到day09/show2.jsp,在同一个Web应用内部的资源之间进行跳转
//response.sendRedirect(“show2.jsp”);
2)//重定向到 不同Web应用/show2.jsp 不同Web应用的资源的跳转
//response.sendRedirect("…/day06-servlet/show2.jsp");
3)//重定向到http://tmooc.cn 重定向到另外一台主机
response.sendRedirect(“http://tmooc.cn”);
重定向到其它网站
定时刷新:
1)和重定向很相似,唯一的区别在于,定时刷新可以指定在多少秒之后再跳转。例如,在注册之后,往往会提示:“恭喜您注册成功, 3秒之后将会跳转到首页…”
2)通过Refresh响应头可以实现在多少秒之后跳转到指定的地址和重定向不同的是,重定向是立即跳转,而定时刷新是在指定多少秒之后再立即跳转
实现定时刷新:(模拟登录成功后跳转到首页)
语法格式:
response.setHeader(“Refresh”, “3;url=/LoginServlet/index.html”);