GET请求和POST请求

获取请求参数

最为常见的客户端传递参数方式有两种GETPOST

浏览器地址栏直接输入:一定是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”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值