JavaWeb-Servlet
-
Servlet是JavaEE规范之一,也就是接口,是JavaEE的三大组件之一(Servlet程序、Filter过滤器、Listener监听器),它是运行在服务器上的Java小程序,它接收客户端发送过来的请求,并响应数据给客户端
-
创建Servlet程序
-
编写一个类实现Servlet的接口
-
实现Servlet方法,处理请求,并响应数据
-
web.xml配置Servlet程序的访问地址
<!--Servlet标签给Tomcat配置Servlet程序--> <servlet> <!--Servlet别名,一般是类名--> <servlet-name>HServlet</servlet-name> <!--Servlet全类名--> <servlet-class>com.example.DemoServlet.HServlet</servlet-class> </servlet> <!--给Servlet配置个访问地址--> <servlet-mapping> <!--告诉服务器,当前配置的地址给哪个Servlet程序使用--> <servlet-name>HServlet</servlet-name> <!--配置个访问地址, 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径 /hello表示 http://ip:port/工程路径/hello --> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
-
输入url,访问到servlet
http://localhost:port/工程路径/资源路径,ip定位到服务器主机,ip:port决定给哪个软件进行通信,工程路径定位到软件的具体工程,资源路径定位到具体的资源,web.xml中的配置定位到具体实现类
-
Servlet的生命周期
- 执行Servlet构造器方法
- 执行init初始化方法
- 执行service方法
- 执行destroy销毁方法
- 前两步是在第一次访问时创建Servlet执行,第三步每次访问都会调用,在停止时才会执行destroy
-
service中区分get和post请求(一般在实际项目开发中,都是直接继承HttpServlet类的方式实现Servlet程序,然后重写doGet和doPost方法,后再web.xml中配置Servlet程序的访问地址)
// 用来专门处理请求和响应的 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //类型转换,因为它有getMethod()方法 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; //获取此次提交方式 String method = httpServletRequest.getMethod(); if(method.equals("POST")){ System.out.println("post 请求"); //post请求方法 }else if(method.equals("GET")){ System.out.println("get请求"); //get请求方法 } }
-
使用IDEA来创建Servlet程序,直接新建一个Servlet,再配置一下访问地址
-
Servlet类的继承体系
- Servlet接口<–GenericServlet <–HttpServlet<–自定义Servlet程序
- Servlet接口只定义了Servlet的访问规范
- GenericServlet类实现了Servlet接口,做了许多空实现,有一个ServletConfig类的引用,并对ServletConfig的使用做一些方法
- HttpServlet实现了service,并实现了请求的分发处理String method = req.getMethod()-》doGet()或者doPost() 负责抛异常,说不支持请求
- 自定义的Servlet 根据业务需求,重写doGet() 和doPost()
-
ServletConfig类,配置信息类
- 获取Servlet程序的别名,servlet-name的值
- 获取初始化参数init-patam
- 获取ServletConText对象
- Servlet程序和ServletConfig对象都是由Tomcat创建
-
ServletContext
- ServletContext是一个接口,表示Servlet上下文对象
- 一个Web工程只有一个ServletContext对象
- ServletContext对象是一个域对象,可以像Map一样存取数据的对象,域指的是操作范围(setAttribute,getAttribute, removeAttribute)
- 获取web.xml中配置的上下文参数context-param
- 获取当前工程路径,/工程路径
- 获取工程部署后在服务器硬盘的绝对路径
- 像Map一样存取数据
- ServletContext是一个接口,表示Servlet上下文对象
-
HTTP协议
-
协议:多方相互约定好的,大家都遵守的规则
-
客户端和服务器之间通信时,发送的数据需要遵守的规则,协议中的数据又叫报文
-
get请求:
-
请求行
- 请求的方式 GET
- 请求的资源路径[+?+请求参数]
- 请求协议的版本号 HTTP/1.1
-
-
请求头 key:value
- Accept:告诉服务器,客户端能接收的数据类型
- Accept-Language: zh-CN中文 en-US
- User-Agent:浏览器的信息
- Accept-Encoding:客户端可以接收的数据编码格式
- Host:请求的服务器ip:port
- Connection:告诉服务器请求连接如何处理 Keep-Alive保持一段时间的连接,Closed回传数据后关闭
-
post请求
-
请求行
- 请求的方式 POST
- 请求的资源路径[+?+请求参数]
- 请求协议的版本号 HTTP/1.1
-
请求头 key:value
- Accept:告诉服务器,客户端能接收的数据类型
- Accept-Language: 客户端可以接收的语言类型zh-CN中文 en-US
- Referer:请求发起时,浏览器地址栏中的地址(从哪来)
- Content-Type:表示发送数据的类型 application/x-www-form-urlencoded 提交的数据格式:name=value&name&value,对其进行url编码,把非英文内容转换为%xx%xx,或者multipart/form-data表示以多段的形式提交数据给服务器,以流的形式,用于上传
- Content-Length:发送数据的长度
- User-Agent:浏览器的信息
- Accept-Encoding:客户端可以接收的数据编码格式
- Host:请求的服务器ip:port
- Connection:告诉服务器请求连接如何处理 Keep-Alive保持一段时间的连接,Closed回传数据后关闭
- Cache-Control:no-cache不缓存
空行
-
请求体:发送给服务器的数据
-
-
-
GET请求有哪些
- form标签,method=get
- a标签
- link标签引入css
- script标签引入js文件
- img引入图片
- iframe引入html
- 在浏览器地址栏中输入地址后回车
-
POST
- form标签 method=post
-
响应的HTTP协议格式
-
响应行
-
响应的协议和版本号 HTTP/1.1
-
响应状态码(200-请求成功,302表示请求重定向,404请求服务器已经收到了,但是你要的数据不存在(地址错了,或者真不存在),500表示服务器收到请求,服务器内部错误)
-
响应状态描述符,对响应码进行描述
-
-
响应头
- Server:服务器的信息
- Content-Type:响应体的数据类型
- Accept-Ranges:
- Content-Length:响应体的长度
- Date:请求响应的时间(格林时间,和北京时间差八小时)
空行
- 响应体:回传给客户端的数据
-
-
MIME:HTTP协议中的数据类型,多功能的Internet邮件扩充服务。大类型/小类型如text/html
-
HttpServletRequest类:只要有请求,Tomcat服务器会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service(doGet和doPost方法),可以通过该对象获取所有请求信息
-
请求的转发:服务器收到请求后,从一个资源跳转到另一个资源叫请求转发 ,例如客户端发送请求到servlet1,这个请求还需要servlet2处理,从servlet1到servlet2就是请求转发
- 浏览器的地址没有变化
- 它们是一次请求
- 它们共享Request域中的数据
- 可以转发到WEB-INF目录下,直接请求地址访问的话是不能访问到WEB-INF中的
//使用域数据给参数加标记 传递到servlet2 req.setAttribute("key","servlet1的标记"); //问路servlet2怎么走,这个是在web.xml中的配置 RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2"); //转发可以访问WEB-INF下的资源,直接通过地址请求时不能访问的 //RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/b.html"); //走向servlet2 requestDispatcher.forward(req,resp);
-
base标签
两个html进行相互跳转时:
在点击a标签进行跳转时候,地址栏是http://localhost:8080/DemoServlet_war_exploded/a/b/c.html,跳转回去的a标签的地址是…/…/index.html**(所有相对路径在工作时都会参照当前浏览器地址栏中的地址进行跳转)**,参照之后的地址是http://localhost:8080/DemoServlet_war_exploded/index.html,是正确的。
但是通过请求转发跳转的时候http://localhost:8080/DemoServlet_war_exploded/forwardc,跳转回去的a标签的地址是…/…/index.html,参照之后的地址是http://localhost:8080/index.html,是不正确的。
解决方案:跳转错误的原因就是相对路径的参照路径是错误的,因此要在html的head里边使用base标签加上要参照的地址,有了base标签,相对路径会忽略当前地址栏中的地址。
-
Web中的 / 的不同意义
- 被浏览器解析:是http://ip:port/
- 被服务器解析:是http://ip:port/工程路径
- 特殊的:response.sendRediect("/")把斜杠发送给浏览器解析,解析出http://ip:port/
-
HttpServletResponse类和HttpServletRequest一样,每次请求进来,tomcat服务器都会创建一个Response对象传递给Servlet程序使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。
-
两个响应流:
-
字节流:getOutputStream() 常用于下载,传递二进制数据
-
字符流:getWriter() 常用于回传字符串
//1.解决中文乱码 PrintWriter writer = resp.getWriter(); //writer.write("response's content"); //设置服务器支持中文,默认的ISO-8859-1不支持中文 //writer.setCharacterEncoding("UTF-8"); //通过响应头,设置浏览器也是用UTF-8字符集,否则依然显示乱码 //resp.setHeader("Context-Type", "text/html; charset=UTF-8"); //网客户端回传字符串数据 writer.write("你好"); //2.一行解决中文乱码 //一行代码达到上面两行效果,同时设置服务器和客户端的编码为UTF-8,但是必须在获取流之前设置 resp.setContentType("text/html; charset=UTF-8"); PrintWriter writer = resp.getWriter();
-
两个流同时只能使用一个
-
-
请求重定向
客户端给服务器发请求,然后服务器告诉客户端,给你一些地址,你去新地址访问(因为之前的地址可能被废弃),客户端再去访问新地址,最终得到结果。
//1.重定向 //设置状态码302表示重定向 resp.setStatus(302); //Location 新的地址 resp.setHeader("Location","http://localhost:8080/DemoServlet_war_exploded/response2"); //2.更简洁的重定向, 因为302是固定的 resp.sendRedirect(""http://localhost:8080/DemoServlet_war_exploded/response2"")
- 重定向的地址栏会发生变化
- 重定向是两次请求
- 不共享Request域的数据
- 重定向依然不能访问WEB-INF下的资源,因为第二次依然是浏览器发的请求。
- 可以访问工程以外的地址,如百度页面等等