Servlet体系结构:
GenericServlet(抽象类)——实现——Servlet(接口)
HttpServlet(抽象类)——继承并封装——GenericServlet(抽象类)
HttpServlet:是对HTTP协议的有一种封装,简化操作。
1.继承HttpServlet。
2.重写doGet/doPost方法
如图:
HTTP协议
概念:协议是服务器之间进行交互必须遵守共同的规定或规则,超文本传输协议(Hyper Text Transfer Protocol / HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
原理:输入URL地址后,客户端(浏览器)给Web服务器发送了一个Request请求, Web服务器接到Request后进行处理,生成Response响应,然后发送给客户端(浏览器),客户端(浏览器)解析Response中的HTML;如下图所示
特点:
1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据,协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
Http协议与服务器端交互的方法:
GET:查;获取/查询资源信息
POST:改;更新资源信息
PUT:增
DELETE:删
(实例理解:TCP就像物流车,用TCP来运输数据,可靠且从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等。 HTTP规定,当执行GET请求的时候,要给车上贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢(Request body)里。)
Get和Post方法的区别:
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。HTTP只是个行为准则,GET和POST实现的基本是TCP。
1.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
2.GET参数通过URL传递,POST放在Request body中。
3.GET产生一个TCP数据包(跑一趟就把货送到了)。POST产生两个TCP数据包(得跑两趟,先和服务器打招呼,再送货)。
4.GET请求在URL中传送的参数是有长度限制的,而POST么有。
Request(请求):
概念:request是获取请求消息的
功能:
1.获取请求行
* 获取请求方式:GET
String method = request.getMethod()
* 获取虚拟目录:/day14
String contextPath = request.getContextPath()
* 获取Servlet路径:/demo1
String servletPath = request.getServletPath()
* 获取请求URI:/day14/demo1
String requestURI = request.getRequestURI()
StringBuffer requestURL = request.getRequestURL() 获取请求的完整路径
:http://localhost/day14/demo1
2.获取请求头
String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
3.获取请求体(只有POST请求才有请求体)
1.获取流对象步骤:
(1)字符输入流:BufferedReader br = request.getReader();
字节输入流:ServletInputStream input= request.getInputStreainputm();
(2)再从流对象中拿数据
2.获取请求参数通用方式:get和post都可以使用下列方法来获取请求参数
(1) String getParameter(String name):根据参数名称获取参数值
//获取用户和密码(jsp文件中的数据)
String username = request.getParameter("username")
String password = request.getParameter("password")
//封装到User实现类中
User user = new User()
user.setUsername("Username")
user.setPassword("password")
(2) String[] getParameterValues(String name):根据参数名称获取参数值的数组
例: String[] hobbies = request.getParameterValues("hobby")
(3).Enumeration<String> getParameterNames():获取所有请求的参数名称
例:Enumeration<String> parameterNames = request.getParameterNames()
(4) Map<String,String[]> getParameterMap():获取所有参数的map集合
例:Map<String, String[]> parameterMap = request.getParameterMap()
3.中文乱码问题:
post方式:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
4.共享域
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:(1) void setAttribute(String name,Object obj):存储数据
(2) Object getAttitude(String name):通过键获取值
(3)void removeAttribute(String name):通过键删除键值对
5.获取ServletContext(获取上下文)
1.特点:上下文环境对象:对应整个web应用的。一个web应用只能有一个ServletContext对象。
2.获取:
(1) 通过request对象获取:request.getServletContext()
(2) 通过HttpServlet获取:this.getServletContext()
3.功能:
域对象:
(1) setAttribute(String name,Object value)
(2) getAttribute(String name)
(3) removeAttribute(String name)
获取文件的真实(服务器)路径
//获取接收对象
String filename = req.getParameter("filename");
//接收对象,获取真实路径
ServletContext context = req.getServletContext();
String realPath = context.getRealPath("/img/" + filename);
System.out.println(realPath);
请求转发(forward)
(1) 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
(2) 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
如下:
Response(请求):
概念:response是设置响应消息的
功能:
1.设置响应行
(1) 格式:HTTP/1.1 200 ok
(2) 设置状态码:setStatus(int sc)
2.设置响应头
response.setHeader(String name, String value)
3.设置响应体
(1)字符输出流:PrintWriter out = response.getWriter();
(2)字节输出流:ServletOutputStream out = response.getOutputStream();
重定向(redirect)
设置状态码(状态码为302)
response.setStatus(302)
设置响应头
String mimeType = context.getMimeType(filename);//获取文件的Mime类型
resp.setHeader("connect-type",mimeType);//文件后缀名
resp.setHeader("connect-disposition","attachment;filename="+filename);//附件文件名
方法
response.sendRedirect("/response/responseDemo1")
重定向和转发的区别
1. 重定向使用的是sendRedirect();转发使用的是getRequestDispatcher()方法
2. 重定向地址栏发生变化;转发地址栏路径不变
3. 重定向可以访问其他站点(服务器)的资源;转发只能访问当前服务器下的资源
4.重定向是两次请求。不能使用request对象来共享数据;转发是一次请求,可以使用request对象来共享数据