1.HttpServlet概述
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
doGet()和doPost()
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。
HttpServlet执行过程
2 Servlet 相关细节
1. Servlet创建时间
Servlet默认创建的时间: 在第一次请求的时候创建 第一次惩罚
可以配置Servlet, 让他在Tomcat启动的时候,就创建
在
<servlet>
中添加<load-on-startup>非负整数</load-on-startup>
非负整数 越小, 对应Servlet越先创建
2.url-pattern
<url-pattern>
给servlet绑定一个url
一个Servlet 可以配置多个
<url-pattern>
, 一个Servlet绑定多个url<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.fs.web.HelloServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern> <url-pattern>/xxx</url-pattern> </servlet-mapping>
<url-pattern>
使用通配符*
配置所有<!--使用*通配符 /* 匹配所有的url, 优先级最低 /user/* 匹配user的路径下所有后代路径 /user/abc /user/bbb /user/ccc .. 匹配 /xxx 不匹配 *.do 后缀匹配 xxx.do aaa.do *出现在最前面,或者最后面, 只能出现一次 /*.do 错误 /user/*/add 错误 *.* 错误 -->
3.Servlet是否是线程安全
一个Servlet类的对象在Tomcat只创建一个, 但是用户发送请求该Servlet, Tomcat为这次请求创建一个线程处理, 但是调用Servlet对象是同一个, 也就是说,多个线程共享同一个Servlet, 所以它是线程不安全的
在实际开发中, 不要在Servlet中创建存放数据的属性
get请求:
直接在地址栏输入url
超链接访问
form表单method="get" 默认值get
ajax发送get请求
post请求:
form 的method="post"
ajax发送post请求
3 ServletContext
服务器会为每个应用创建一个ServletContext对象:
-
ServletContext对象的创建是在服务器启动时完成的;
-
ServletContext对象的销毁是在服务器关闭时完成的。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。
作用:
域对象 : 实现数据存取, 类比 银行,域对象存储数据格式: key/value
javaWeb中有四大域对象: 范围不一样,
PageContext; page域, 范围在当前页面有效 最窄
ServletRequest: request域: 范围在同一次请求内有效 重点
HttpSession;session域: 范围在同一次会话(包含n次请求)中有效 重点
ServletContext;application域: 范围在整个项目所有的客户都共享 最宽
域对象一定包含下列方法: 存数据,取数据, 删除数据
void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
如果name不存在,返回null
void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
Enumeration getAttributeNames():获取所有域属性的名称;
获取全局的初始化参数
<!--全局的初始化参数: 所有的servlet/jsp可以访问--> <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param>ServletContext的getInitParameter()
获取web下资源文件 文件上传使用
得到ServletContext对象
通过ServletConfig的getServletContext(),
//获取ServletConfig ServletConfig servletConfig = this.getServletConfig(); //通过ServletConfig的getServletContext() 获取ServletContext对象 ServletContext servletContext = servletConfig.getServletContext();
Servlet本身就是ServletConfig的子类 推荐
this.getServletContext();
基于注解方式的Servlet
在servlet3.0之后, javaEE提出注解方式 替换web.xml文件方式, 后期都是使用注解方式
@WebServlet("资源路径")