JavaWeb Servlet基础知识
什么是servlet
处理请求和发送响应过程的程序,为解决实现动态页面而衍生
Tomcat与Servlet
Tomcat是Web应用服务器,一个Servlet/JSP容器。负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户端
servlet生命周期
- 初始化init()
服务器启动时或第一次请求该servlet时会用该方法初始化一个Servlet对象- load-on-startup=0(默认)
第一次请求该servlet时加载servlet,执行init() - load-on-startup=1
服务器启动时就加载servlet,执行init()
- load-on-startup=0(默认)
- 处理客户端请求service()
该servlet对象去处理所有客户端请求,在此方法中执行。有两种请求方式,GET和POST - 销毁destroy()
服务器关闭后,执行该方法,销毁这个servlet对象,将所有servlet卸载
HttpServlet
HttpServlet继承GenericServlet,GenericServlet实现了Servlet接口和ServletConfig接口,所以调用ServletConfig的方法时不需要先获取ServletConfig,可以直接调用,因为在GenericServlet中已经帮我们获取了这些数据
ServletConfig对象
- 获取途径:
getServletConfig();
- 功能
- getServletName()
获取servlet的名称,即servlet-name - getServletContext()
获取ServletContext对象 - getInitParameter(String)
获取在servlet中初始化参数的值,传入的参数是key,这只是在该servlet下的初始化参数 - getInitParameterNames()
获取在Servlet中所有初始化参数的key值。可以通过key值来找到相应的value值。返回的是枚举类型Enumeration
- getServletName()
ServletContext对象
- 获取途径
两种读是一样的,ServletContext对象被创建时,将会调用ServletContextListener接口中的contextInitialized()
方法- getServletContext()
- getServletConfig().getServletContext()
- 功能
tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁。ServletContext实例在一个web项目中共享数据,即一个web项目只存在一个ServletContext实例,每个Servlet读可以访问到它- web项目中共享数据
- getAttribute(String name)
在web项目范围内存放内容,项目中所有的servlet都能访问 - setAttribute(String name, Object obj)
通过指定名称获得内容 - removeAttribute(String name)
通过指定名称移除内容
- getAttribute(String name)
- web项目初始化参数
是全局初始化参数,每个Servlet中都能获取到该初始化值- getInitParameter(String)
通过指定名称获取初始化值 - getInitParameterNames()
获取所有初始化参数的key值。可以通过key值来找到相应的value值。返回的是枚举类型Enumeration
- getInitParameter(String)
- 获取web项目资源
- web项目下指定资源的路径
getRealPath("/WEB-INF/web.xml")
- web项目下指定资源的内容
返回的是字节输入流InputStream
getResourceAsStream(java.lang.String path)
- 指定路径下的所有内容
getResourcePaths(java.lang.String path)
- web项目下指定资源的路径
- web项目中共享数据
request对象
请求对象,包含:请求行、请求头、请求体
- 获取请求行内容
- 获取统一资源标记符:
getRequestURI()
- 统一资源定位符:
getRequestURL()
- 协议和版本:
getProtocol()
- 协议:
getScheme()
- 主机/域名:
getServerName()
- 端口:
getServerPort()
- 发布到tomacat下的项目名:
getContextPath()
- servlet路径:
getServletPath()
- 请求参数:
getQueryString()
- 远程主机IP地址:
getRemoteAddr()
- 获取统一资源标记符:
- 获取请求头
- 获得指定头内容
String getHeader(java.lang.String name)
- 获得指定头内容Date
long getDateHeader(java.lang.String name)
自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值 - 获得指定头内容int
int getIntHeader(java.lang.String name)
- 获得指定名称所有内容
Enumeration getHeaders(java.lang.String name)
- 获得指定头内容
- 获取请求体
获得get或post请求的参数- 获得指定名称的一个请求参数值
String request.getParameter(String)
- 获得指定名称的所有请求参数值
String[] request.getParameterValues(String)
- 获得所有的请求参数
Map<String , String[]> request.getParameterMap()
- 获得指定名称的一个请求参数值
- 封装在request域中的数据
- request.setAttribute()
将数据封装保存到request域中 - request.getAttribute()
返回在request.setAttribute()封装的域中存在的数据
- request.setAttribute()
- 请求转发/包含
浏览器只发起一次请求,请求在服务器内部被处理,可以被多次转发传递- 转发
request.getRequestDispatcher(String path).forward(req,resp);
转发后跳转的页面路径是以web项目根开始,因为请求转发只局限与在同一个web项目下使用,所以都是从web项目根下开始 - 包含
可以实现将多个资源的数据合并后输出,可以将多个输出内容中相同的部分提取出来方便开发
request.getRequestDispatcher(String path).include(req,resp);
- 特点
- 浏览器中url不会改变
- 只能在一个web项目内进行
- 多个Servlet之间使用的是同一个请求对象和响应对象
- 转发
response对象
- 设置指定的头
response.setHeader(java.lang.String name, java.lang.String value)
setIntHeader()
addHeader()
addIntHeader()
- 发送状态码方法
setStatus(int status)
setError(int status)
- 重定向
页面跳转,浏览器会发起两次请求。浏览器第一次请求后服务器响应发送302状态码表示要重定向,并在location字段中设置重定向地址,浏览器接收到后重新发起第二次请求- 两种方法
- 手动
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","path路径");
- 直接调用封装好的
response.sendRedirect("path路径");
- 手动
- path路径
重定向不局限于一个项目内- path路径以" / "开头即重新开始定位,可以访问另一个Web项目
- path路径不以" / "开始则默认访问该web项目下的servlet,可以省略项目名
- 特点
- 浏览器发起两次请求,第二次请求对象与第一次不是同一个
- 重定向的第二次请求一定是GET请求
- 请求后浏览器中url变成转发后的url
- 两种方法