Hypertext Transfer Protocol,HTTP超文本传输协议,是一个简单的请求-响应协议。规定了客户端和服务器之间,传输数据的一种格式。
(二)HTTP特点1.简单快速。客户端向服务器请求服务时,只需要传送请求方法和路径。
2.灵活。HTTP协议允许传送任意格式的数据。正在传输的类型由,content-type标明。
3.无连接。就是每个请求都建立一个连接,请求处理完毕并发送至客户端之后就断开连接。这样明显有其缺点,就是在需要连续发送请求时,需要为每一个请求单独的再次建立连接,很浪费时间和资源。于是在HTTP协议1.1版本之后引入了可持续连接,也就是再每一个请求处理完毕后,它不会立刻就断开连接,而是再等待一段时间,如果在此期间又有新的请求过来,那么等待时间刷新,如果没有,则等待时间完毕后,连接关闭。
4.无状态。是指协议对于每次请求的处理没有记忆能力,它不知道之前是否已经访问过,不保留访问痕迹。主要目的是为了保证数据传输的安全性。
(三)传输数据的特点 1、request请求请求分为三部分:
请求行:请求行中,我们可以通过request对象的相应方法获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。
请求头:请求头是当前对用户发送的数据的描述信息。请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
请求体:请求体就是请求中携带的数据,也就是我们需要获取的参数。
2、response响应响应分为三部分:
响应行:响应行中包含协议和版本
响应头:服务器想要告诉浏览器的一些信息。
响应体:服务器响应给浏览器的源码信息
二、Servlet (一)Servlet概念Servlet是运行在web服务器中的小型Java程序。Servlet通常通过HTTP接收和响应来自web客户端的请求
(二)Servlet使用
以实际例子体现:
1、需求:写一个HTML页面将一个表单中的账号和密码传递到java类中并打印输出到控制台。
2、步骤
①创建HTML页面,并设计表单
②创建一个普通类,并继承HTTPServlet抽象类,重写service方法。
③在web.xml文件中注册servlet,作为前后台连接的中间件
④修改前后台表单中的action的请求地址
⑤通过浏览器输入对应的地址来访问测试
3、代码实现①表单
登录页面
页面展示:
②创建普通类继承HTTPServlet
package com.offcn.web; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //继承HTTPServlet必须要导入一个Servlet jar包,这个jar包在tomcat下的lib文件夹下servlet-api.jar public class ServletDemo01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取表单里的值 String name = req.getParameter("username"); String password = req.getParameter("password"); //在控制台输出获取的值 System.out.println("账号:"+name); System.out.println("密码:"+password); } }
③在web.xml文件中注册Servlet,作为前后台的中间件
这个文件是javaweb项目下的web或者是WEB-INF下的web.xml
Day13 index.html index.jsp firstWeb com.offcn.web.ServletDemo01 firstWeb /login
④测试
(三)Servlet原理
实现原理:
1、当服务器接收到客户端浏览器的请求后,先解析请求的url路径,获取访问Servlet的资源路径。
2、查找项目的web.xml,根据资源路径匹配web.xml中的
3、如果没有匹配到报404,如果匹配到了,根据
4、再去匹配
5、如果匹配到了,执行
servlet的生命周期分为三个阶段:初始化、使用(提供服务)、销毁
1、init()初始化阶段:默认情况当第一次访问Servlet时,Servlet容器(tomcat)会加载Servlet,加载完成后,Servlet(tomcat)会创建一个Servlet实例并调用init()方法进行初始化;如果需要改变创建时机,只需要在web.xml文件中配置load-on-startup节点值大于等于0的整数即可。
init()方法只会执行一次,也说明一个Servlet只有一个实例,即单例模式。
2.service()服务阶段:当Servlet每次被访问一次,service方法就会自动被调用一次,所以该方法可执行多次。
3、Destroy()销毁阶段:当关闭服务器或资源重新加载时,destroy方法会被执行,这就标志着整个Servlet的生命周期到此结束。该方法仅被执行一次。
(五)Servlet注解方式的使用目的:简化web.xml文件配置
以之前的login页面为例,之前的测试写了三个文件,分别是HTML显示页面,Servlet后台逻辑和web.xml中间连接文件。而注解的目的就是直接跳过web.xml文件,也就是说,用了注解之后,再完成以上功能,就只用写两个文件就行了。
示例代码:
表单页面不变,action依然选择地址login
登录页面
Servlet层,设置注解
package com.offcn.web; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //与html中的action值相同 @WebServlet("/login") public class ServletDemo01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取表单里的值 String name = req.getParameter("username"); String password = req.getParameter("password"); //在控制台输出获取的值 System.out.println("账号:"+name); System.out.println("密码:"+password); } }
注意事项:
一个Servlet的配置可以使用注解,也可以使用web.xml文件,但是二者不能共存,只能任选其一,否则会报错。
三、request (一)Request的理解以及体系1、request是由tomcat创建的
2、request对象是来获取请求信息的
request是实现的HttpServletRequest接口
在重写service方法的时候,自动以参数的形式传过来的,我可以直接使用。
3、request的作用接收客户端的请求,获取请求中的信息。除了可以获取请求中的携带的数据之外,还可以获取比如主机地址、端口、请求方式、项目名称等一系列信息。
请求分类:
请求行、请求头、请求体
(二)获取请求行数据请求行中,我们可以通过request对象的相应方法获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。
1、req.getScheme(); 获取协议名
2、req.getServerName(); 获取服务器名
3、req.getServerPort(); 获取端口号
4、req.getContextPath(); 获取项目名
5、req.getMethod(); 获取请求方式
6、req.getQueryString(); 获取参数字符串
7、req.getRequestURI(); 获取具体地址
8、req.getRequestURL(); 获取请求的URL
9、req.getServletPath(); 获取服务器路径
注意:
全部以字符串的形式返回。
(三)获取请求头数据请求头是当前对用户发送的数据的描述信息。
将浏览器的相关信息发送给服务器
请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
如果想查看请求头信息,也可以在Servlet中通过getHeader方法获取
1、获取请求头数据的方法(四)获取请求正文数据 1、获取流对象
只有post请求方式,才有请求体,在请求体重封装了post请求的请求参数
步骤:
①获取流对象(字符流/字节流)
②在从流对象中拿数据
获取流对象的方式:
①BufferedReader getReader() 获取字符输入流
②ServletInputStream getInputStream() 获取字节输入流
2、获取流对象的方式请求体就是请求中携带的数据,也就是我们需要获取的参数。
获取请求参数的方法:
3、解决中文乱码
req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8");(五)请求转发 1、介绍
一种在服务器内部资源跳转的方式。浏览器请求ServletA资源时,ServletA资源不足或者没有资源,ServletA请求其他的资源然后响应给浏览器,这个过程叫转发;浏览器向服务器发送请求,服务器接收请求后调用A处理请求,但是A处理一部分后将剩下的部分交给B去处理。
2、实现
req.getRequestDispatcher("路径").forward(req,resp);
request对象的特性:
①共享域:在同一个请求中,能够实现多个组件之间的数据共享(所涉及的所有组件都会共享request对象上保存的数据)
作用域:一个请求的大小
②能够保存(绑定)数据
req.setAttribute(String key,Object value);
3、获取绑定的数据
Object req.getAttribute(String key);
4、移除绑定数据
req.removeAttribute(String key)
3、特点
①转发发生在服务器内部,浏览器不知道
②转发的过程中url地址不变
③转发可以访问到WEB-INF中的资源
④转发的路径是当前项目下,因此转发不可以访问项目以外的资源
⑤转发的路径一般是相对路径
⑥转发发生在一次请求中
四、response (一)简介 1、介绍response是由tomcat创建的,response对象是来设置响应信息
response实现了HTTPServletResponse接口
2、作用
针对页面发送的请求做出数据响应,向页面输出信息,包括文本、图片、视频等。
响应分类:
响应行、响应头、响应体
(二)设置响应头设置响应头信息可以通过一下两种方法:
response.setHeader(String name,String value);
response.addHeader(String name,String value);
二者的区别:
setHeader:一个关键字可以对应一个值,如果设置了多个值,则会覆盖。
addHeader:一个关键字可以对应多个值,在实际开发中,同一个响应头信息只会对应一个值,所以在使用时一般没什么区别。
(三)设置响应体响应的数据就是响应体。响应对象response在返回数据、响应数据的时候,会将一些HTML、text、流数据等信息通过响应主体返回给页面,而响应体绝大多数都是文本类型。
响应数据需要通过流来进行数据传输,而response自带的流有两个:
response.getWriter()==>PrintWriter 输出文本信息
response.getOutputStream==>ServletOutputStream 输出字节信息,比如图片、音频、视频
需要注意:这两个流不能同时存在。
(四)重定向 1、理解重定向是客户端行为,当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发出新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象回自动销毁,所以两次请求的request对象并非同一个,座椅两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应。
2、实现
response.sendRedirect(String path);
path:重定向的地址
3、特点①重定向发生在浏览器和服务器之间
②重定向的过程url发生改变
③重定向发生至少两次请求中
④重定向访问不到WEB-INF的资源
⑤重定向可以访问当前应用外的资源
⑥重定向一般使用绝对路径
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)