JavaWeb学习3
一、HttpServlet
HttpServlet简述
HttpServlet类是专门为HTTP协议准备的。
- HttpServletRequest对象中封装了请求协议的全部内容。
- HttpServletResponse对象是专门用来响应HTTP协议到浏览器的。
HttpServlet的功能
HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中,大大简化了HttpServlet解析请求数据的工作量。
流程描述
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
二、HttpServletRequest接口详解
HttpServletRequest是一个接口
- HttpServletRequest对象封装了的信息
- HttpServletRequest对象是Tomcat服务器负责创建的。
- 封装了HTTP的请求协议。
- javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获取到请求的信息了。
- equest和response对象的生命周期
- request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。
一次请求对应一个request,两次请求则对应两个request。
- request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。
获取用户提交的数据
Map<String,String[]> getParameterMap() 这个是获取Map
Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key
String[] getParameterValues(String name) 根据key获取Map集合的value
String getParameter(String name) 获取value这个一维数组当中的第一个元素。这个方法最常用。
// 以上的4个方法,和获取用户提交的数据有关系。
四种方法的使用
//username=zhangsan&userpwd=123&interest=s&interest=d
/*Map<String,String[]>
key value
---------------------------
"username" {"zhangsan"}
"userpwd" {"123"}
"interest" {"s", "d"} */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException{
/*1.最常用的方式 String getParameter(String name)*/
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
System.out.println(username);
System.out.println(userpwd);
/*2.既然是checkbox,调用方法:request.getParameterValues("interest")*/
String[] interests = request.getParameterValues("interest");
for(String i : interests){
System.out.println(i);
}
/*3.直接通过getParameterNames()这个方法,可以直接获取这个Map集合的所有key*/
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name);
}
/*4.获取参数Map集合*/
Map<String,String[]> parameterMap = request.getParameterMap();
// 遍历Map集合(获取Map集合中所有的key,遍历)
Set<String> keys = parameterMap.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.print(key+"=");
// 通过key获取value
String[] values = parameterMap.get(key);
for(String value : values){
System.out.print(value+",");
}
System.out.println();
/*4.输出结果
username=zhangsan,
userpwd=123,
interest=s,d,
}
请求域对象request
请求域”对象要比“应用域”对象范围小很多。生命周期短很多。请求域只在一次请求内有效。
一个请求对象request对应一个请求域对象。一次请求结束之后,这个请求域就销毁了。
请求域对象中的三个方法:
// 存(怎么向request请求域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(怎么从request请求域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(怎么删除request请求域中的数据)
public void removeAttribute(String name); // map.remove(k)
三、请求转发
- 原理: 是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的。
// 第一步:获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
// 第二步:调用转发器的forward方法完成跳转/转发
dispatcher.forward(request,response);
// 第一步和第二步代码可以联合在一起。
request.getRequestDispatcher("/b").forward(request,response);
//注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
转发的下一个资源必须是一个Servlet吗?
不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html…
注意:转发的时候,路径的写法要注意,转发的路径以“/”开始,不加项目名。
特点:在请求转发过程中,浏览器只发送一个了个Http请求协议包。
参与本次请求的所有Servlet共享同一个请求协议包,因此
这些Servlet接收的请求方式与浏览器发送的请求方式保持一致
四、重定向
- 工作原理:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。
- 实现命令
response.sendRedirect("请求地址")
//注意:重定向地址需要加上 项目名
//因为浏览器发送请求是需要加上项目名的
- 特征
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求次数
浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。
后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是get
- 缺点
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
消耗在往返次数上,增加用户等待服务时间
转发和重定向区别
-
如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把request域里面的数据取出来,使用转发机制。
-
剩下所有的请求均使用重定向。(重定向使用较多。)
-
他俩跳转的资源只要是服务器内部合法的资源即可。(Servlet,JSP,HTML)
-
转发会存在浏览器刷新问题