服务器端的小程序
Servelt就是一个接口,定义了java类被浏览器访问到(tomcat的识别)规则。
Servlet执行原理:
1、当服务器接收到客户端浏览器请求后,会解析请求的URL路径,获取访问的Servlet的资源路径
2、查找web.xml文件,是否有对应的<url-pattern>标签内容。
3、如果有,则在找到对应的<servlet-class>对应的全类名,
4、tomcat会创建其对象。
Srevlet中的方法:
生命周期:
init():初识花方法,在Servelt创建是被执行,只会被执行一次;
Servlet什么时候被创建?
默认情况下,第一次访问时,Servlet会被创建,
可以配置Servlet创建的时机:
在<servlet>标签下配置:
(1)第一次被访问时创建,配置<load-on-startup>的值为负数
(2)在服务器启动时创建:<load-on-startup>的值为0或正整数
Servlet的init()方法只会被执行一次,说明一个Servlet在内存中只存在一个队形,Servlet是单例的。
多个同时访问时,可能存在线程安全问题。解决方案:尽量不要在servlet中定义成员变量,就算定义了成员变量,也不要修改值。
Service():每一次servlet被访问时执行,会执行多次
每次访问Servlet时,Servlet方法都会被调用。
Destory():销毁方法,服务器正常被关闭,执行一次。(只有正常被关闭)
ServletConfig():获取Servlet配置信息
ServletGetInfo():
Servlet注解配置:
Servlet3.0
好处:支持注解配置,可以不需要web.xml了
步骤:
1、创建JavaEE项目,选择Servlet3.0版本以上
2、创建项目时,可以不需要勾选web.xml
3.定义一个类,实现Servlet接口,实现Servlet接口,实现方法
4、在类上使用@WebService注解,并进行配置。@WebService("/资源路径")
IDEA与tomcat相关配置:
1、IDEA会为每一个tomcat部署的每一个项目,单独建立一份配置文件。
查看控制台输出:配置文件所在路径:在日志中可以看到,其中key为:(即为当前Tomcat的配置)
Using CATALINA_BASE: "C:\Users\Lenovo\.IntelliJIdea2019.1\system\tomcat\Unnamed_anti-fraud-poc_24"
2、工作空间项目和tomcat部署的web项目不一样。
tomcat真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着工作空间项目的web目录下的所有资源。
WEB-INF下的资源,不能被浏览器直接访问。
Srevlet体系结构:
Srevlet -----接口
|
|
GenericServlet ---------抽象类:将Servlet接口中其他的方法做了默认空实现,只将Servce方法做了实现
|
|
HttpServlet-------------抽象类:
Servlet相关配置:
urlpartten:Servlet访问路径
* 一个Servlet可以定义多个访问路径,:@WebServlet({"/dd","/aa"})
*路径定义规则:/XXX
/XXX/XXX:多层路径
REQUEST:
1.request的功能:
1、获取请求消息数据
(1)获取请求行数据 *GET
a:获取请求行方式String getmethod();
b:获取虚拟目录 :String getContextPath();
c:获取Servlet路径:Stirng getServletPath();
d:获取get方式的请求参数: String getQueryString;
e:获取请求的URI:getRequestURI();
getRequestURL();完全路径
f:获取协议及版本:String getProtocol();
g:获取客户机IP地址:getRemoteAddr;
2、获取请求头数据:
a:getHeader(String name);通过请求头的名称,获取请求头的值
b:getHeaderNames();返回所有请求头的名称;返回迭代器。
3、获取请求体数据:只有post请求方式,才有请求体,在请求体中封装了Post请求参数。
步骤:
1、获取流对象
BufferReader getReader();字符输入流,只能获取字符数据
ServletInputStream(继承了InputStream) getInputStream();获取字节输入流,可以操作所有类型的数据。
2、再从流对象中拿取数据
其他功能:
1、获取请求参数通用方式:不论是get还是post请求方式,都可以使用下列请求方法。
1、String getParameter(String name);根据参数名称获取数据值
2、String【】 getParameterValues(Stirng name); 根据参数名称获取参数值的数组
3、getParameterNames();获取所有请求参数名称
4、Map<Stirng,String> getParameterMap();获取所有参数Map集合。
*中文乱码问题:
get方式:tomcat8已经将乱码问题解决了
Post方式:在获取参数前,设置请求request的编码。 request.setCharacterEncoding("utf-8");
2、请求转发
步骤:
1、通过request对象获取请求转发器对象: RequestDispacther getrequestDispatcher(String Path);
2、使用RequestDispacther 对象来转发 forward(ServletRequest request,ServletResponse response);
特点:
1、浏览器地址栏路径不发生变化
2、 只能转发到服务器内部资源中
3、装发是一次请求
3、共享资源
域对象:一个有作用范围的对象,可以在范围内共享数据
request:代表一起请求的范围,一般用于请求转发的多个资源中共数据。
方法:
1、setAttribute(String name,Object obj);存储数据
2、Object getAttribute(String name);获取数据
3、void removeAttribute(String name);通过键,移出键值对
4、获取ServletContext
ServletContext getServletContext();
HTTP响应消息:
请求消息:客户端发送给服务器端的数据
响应消息:服务器端发送给客户端的数据
请求消息数据:
请求行、请求头、请求空行、请求体
响应消息数据:
1、响应行:
(1)组成:协议/版本 状态码 状态码描述
(2)响应状态码:服务器告诉浏览器客户端,本次请求和响应的一个状态(状态码都是三位数字)
状态码分类:1XX:服务器接收客户端消息,但是没有接收完成,等待一段时间后,返回1XX
2XX:成功 代表:200
3XX:重定向 302重定向 304访问缓存
4XX:客户端错误 404代表服务器没有对应请求路径(资源) 405请求方式没有对应的doXX方法
5XX:服务端错误 500服务器内部出现异常
2、响应头:
(1)格式 名称:值
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
*in-line:在当前浏览器页面打开
attachment;filename=xxx;:以附件形式打开响应体,文件下载
3、响应空行:
4、响应体:
Response设置响应消息:
1、设置响应行:setStatus(int sc);
2、设置响应头:setHeader(String name,String Value)
3、设置响应体:
使用步骤:
1、获取输出流:
字符输出流:PrintWriter getPrintWriter();
字节输出流:ServletOutputStream getOutputStream();
2、使用输出流将数据输出到客户端浏览器
1、重定向
资源跳转的方式 :
1.告诉浏览器需要重定向,状态吗302
2。告诉浏览器B资源的路径:响应头localhost:B资源的路径
简单的重定向方法:response.sendRedirect("");
重定向特点: redirect
1、重定向地址栏发生改变
2、重定向可以访问其他服务器资源(可以访问其他站点的资源)
3、重定向是两次请求
转发特点:forward
1、转发地址栏路径不变
2、转发只能访问当前服务器下的资源
3、转发是一次请求
2、路径写法
1、路径分类
绝对路径:通过绝对路径,可以确定唯一资源 如:/开头的路径
相对路径:通过相对路径,不可以确定唯一资源 不以/开头,以.开头,
规则:确定访问当前资源和目标资源之间的相对位置关系