目录
ServletRequestAttributeListener
ServletRequestAttributeEvent方法
ServletContextAttributeListener
ServletContextAttributeEvent对象方法
含义:http协议就相当于客户端和服务端定义好的一个规范,通过这个规范,所有人在请求和响应的过程中都需要遵循这样的规范
Http协议作用:规范了浏览器和服务器之间的数据交互
注意:HTTP1.1之后支持可持续连接
含义:Servlet全称server applet,其是基于HTTP协议协议的在服务端生成的程序,我们把实现Servlet接口的java程序叫做Servlet程序
主要功能:交互式的浏览生成数据,生成动态web内容
1.导入Java Servlet API 的包
打开idea的File-Project Structure,在Modules的依赖窗口加jars(servlet-api.jar),从tomcat的lib目录中
2.写一个类,继承HttpServlet类,重写doGet/doPost等方法
- public class MyServlet1 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.getWriter().write("
hello servlet
"); - }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- super.doPost(req, resp);
- }
- }
注意:因为我要发get请求,所以我只在doGet方法中向浏览器输入内容
3.配置web.xml映射路径
- <servlet>
- <servlet-name>myservletservlet-name>
- <servlet-class>com.msb.MyServlet1servlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>myservletservlet-name>
- <url-pattern>/firsturl-pattern>
- servlet-mapping>
注意:
4.配置tomcat
打开Edit Configurations,添加tomcat
点击Deployment后点击右边的+号添加你项目的war包然后apply并ok
注意:访问路径前缀(虚拟项目名)标识的是某一项目的war包,因为可能将多个项目放入tomcat容器中
过程:浏览器发起请求到web容器(tomcat),之后web容器产生两个对象(请求,响应)web容器根据请求url地址中的url信息在webapps目录下找到对应的项目文件夹(虚拟项目名),然后再web.xml中检索出对应的servlet,找到后调用并执行servlet的生命周期函数
- public interface Servlet {
- void init(ServletConfig var1) throws ServletException;
-
- ServletConfig getServletConfig();
-
- void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
-
- String getServletInfo();
-
- void destroy();
- }
关于初始化:在servlet标签里面配置
Servlet接口<——GenericServlet抽象类<——HttpServlet抽象类(无抽象方法)
注意:GenericServlet抽象类并没对service方法做任何处理,而HttpServlet抽象类重写了service方法并进行了判断,重写内容为判断你发的请求是什么类型,什么类型的请求在service方法里面调用什么类型的方法(doGet/doPost)
含义:Request对象用来解析请求参数,当浏览器访问服务器时,携带着一些请求参数,可以通过Servlet提供的Request对象提供的API来解析请求参数
注意:request对象封装了请求报文
String getMethod():获取请求中的请求方式
StringBuffer getRequestURL():获取请求完整地址
String getRequestURI():获取请求资源路径
String getScheme():获取请求中的协议
注意:由于请求头是Key:value键值对形式的,所以直接获取key就可以获得对应的value值
String getHeader("key"):获取对应key的请求头信息
Enumeration
getHeaderNames(): 获取请求头信息中的所有key的枚举对象
注意:
String getParameter("key"):获得请求体中key所对应的value值
Enumeration
getParameterNames(): 获取用户数据中的所有keyString[] getParameterValues("key"):如果key是多值,那么就将key的多值封装成一个数组
- Enumeration<String> parameterNames = request.getParameterNames();
- while (parameterNames.hasMoreElements()){
- System.out.println(parameterNames.nextElement());
- }
String getRemoteAddr():获取远程客户端地址
String getRemoteHost():获取远程客户端主机名称
int getRemotePort():获取远程客户端端口号
String getLocalAddr():获取本地计算机地址
String getLocalName():获取本地计算机名称
int getLocalPort():获取本地计算机端口号
void setAttribute(String var1, Object var2):在request对象内设置var1属性值为var2
Object getAttribute(String var1):在request对象内获取var1属性的值
void removeAttribute(String var1):在request对象内移除var1属性及值
void setCharacterEncoding("utf-8"):设置请求编码格式为utf-8
含义:HttpServletResponse对象是服务器的响应对象,这个对象中封装了向客户端发送数据,发送响应头,发送响应状态码的方法
注意:rsponse对象封装了响应报文
void setHeader("key", "value"):设置响应头,按照k:v键值对形式,key相同时value可以被覆盖
void addHeader("key", "value"):设置响应头,按照k:v键值对形式,key相同value不可以被覆盖
void sendError(状态码,"状态码信息"):设置响应状态
PrintWriter getWriter():获取打印流
ServletOutputStream getOutputStream():获取字节输出流
void setCharacterEncoding("utf-8"):设置响应编码格式为utf-8
void setContentType("text/html;charset=utf-8"):让浏览器以html和utf8编码的方式解析数据
void setHeader("Access-Control-Allow-Origin","*"):允许任何源跨域
含义:当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程
转发方式:请求对象.getRequestDispatcher("/servlet内部url地址或jsp页面").forward(请求对象, 响应对象);
注意:url的前面一定要有/
含义:属于客户端行为。服务器在收到客户端请求后,会通知客户端浏览器重新向另外一个 URL 发送请求,这称为请求重定向。它本质上是两次 HTTP 请求,对应两个 request 对象和两个 response对象。
重定向:响应对象.sendRedirect(String url)
前言:HTTP是一个无状态的协议,当一个客户端向服务端发送请求,在服务器返回响应后,连接就关闭了,在服务端不会保留连接信息
含义:Cookie是在客户端保持HTTP状态信息的技术
创建cookie:Cookie cookie = new Cookie(String name,String value)
响应对象.addCookie(Cookie var1):将cookie设置到response中,返回值为void
cookie.setMaxAge(int expiry):为cookie设置有效期,单位为秒,返回值为void
cookie.setPath("/"):只要访问同一个Tomcat中所有的项目资源,都会携带Cookie,返回值为void
cookie.setPath("/cookie"):只要访问当前项目(cookie)中的所有资源,都会携带Cookie,返回值为void
cookie.setPath("/cookie/abc"):只要访问当前项目(cookie)的abc路径下的所有资源,都会携带Cookie,返回值为void
请求对象.getCookies():获得cookie数组
cookie.getName():获得cookie的name,返回值为string
cookie.getValue():获得cookie的值,返回值为string
含义:session表示会话,在一段时间内,用户与服务器之间的一系列交互操作。
session对象:用户发送不同请求的时候,在服务器端保存不同请求共享数据的存储对象
理解:session相当于在服务端开了一个房,服务端生成session后保存起来,将sessionid与会话结束时间传入cookie返回给浏览器,之后用户根据这个含有sessionid的cookie取出sessionid就可以打开对应的session房子得到相应数据。
获取session对象:HttpSession session = 请求对象.getSession()
session.getId():获取sessionid,返回值为string类型
session.getAttribute(String name):获取session属性值,返回值为Object
session.setAttribute(String name,Object value):设置session属性,返回值为void
session.setMaxInactiveInterval(int n):修改session时长,以秒为单位,返回值为void
-
- <session-config>
-
- <session-timeout>1session-timeout>
- session-config>
session.invalidate():注销session,返回值为void
session.removeAttribute(String name):移除session中名为name的属性,返回值为void
前言:web容器启动的时候,他会为每个web程序都创建一个对应的servletContext对象,它代表当前的web项目(虚拟项目名下面的目录)
ServletContext servletContext = this.getServletContext();
ServletContext servletContext = this.getServletConfig().getServletContext();
ServletContext servletContext = req.getSession().getServletContext();
下面的参数为/虚拟项目名/具体的servlet路径映射(多余)
ServletContext servletContext = this.getServletContext().getContext("/servletContext/three")
注意:在同一个web应用中获取到的ServletContext对象相同
获取web.xml文件中的公共属性(初始化参数)
-
- <context-param>
-
- <param-name>nameparam-name>
- <param-value>valueparam-value>
- context-param>
-
String getInitParameter(String name):获取初始化参数中name属性对应的值
Enumeration
getInitParameterNames(): 获取所有初始化参数名
- Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
- while (initParameterNames.hasMoreElements()){
- System.out.println(initParameterNames.nextElement());
- }
String getRealPath(String name):获得此项目内文件名为name的相对于电脑盘符所在的真实路径
String getContextPath():获取虚拟项目名路径
请求转发:servletContext对象.getRequestDispatcher(String uri).forward(req, resp)
含义:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,主要用来获取web.xml文件中的初始化信息。
为每个Servlet程序设置初始化信息,通过ServletConfig对象来获取
获取ServletConfig对象:ServletConfig servletConfig = this.getServletConfig()
获取初始化参数name:String getInitParameter(String name)
获得所有的初始化key:Enumeration
getInitParameterNames()
-
- <servlet>
- <servlet-name>servletconfigservlet-name>
- <servlet-class>cn.tedu.ConfigServletservlet-class>
-
- <init-param>
-
- <param-name>nameparam-name>
- <param-value>valueparam-value>
- init-param>
- servlet>
- <servlet-mapping>
- <servlet-name>servletconfigservlet-name>
- <url-pattern>/oneurl-pattern>
- servlet-mapping>
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- ServletConfig servletConfig = this.getServletConfig();
- //获取初始值
- String value = servletConfig.getInitParameter("name");
- System.out.println(value);
- }
含义:过滤器是能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件
注意:
- public interface Filter {
- //用于完成tomcat的初始化,tomcat的启动时执行一次
- void init(FilterConfig var1) throws ServletException;
- //进行处理,var3用于放行
- void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
- //销毁功能,tomcat关闭的时候执行一次
- void destroy();
- }
作用:来获取过滤器的初始化参数和Servlet的相关信息。
- public class MyFilter implements Filter {
- //过滤器的生命周期函数
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- String name = filterConfig.getInitParameter("name");
- System.out.println("初始化参数值为"+name);
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("filter逻辑处理");
- servletResponse.setContentType("text/html;charset=utf-8");
- //添加此语句之后放行
- filterChain.doFilter(servletRequest, servletResponse);
- System.out.println("放行后");
- }
- @Override
- public void destroy() {
- System.out.println("我是filter销毁");
- }
- }
-
- <filter>
- <filter-name>myFilterfilter-name>
- <filter-class>com.jt.MyFilterfilter-class>
-
- <init-param>
-
- <param-name>nameparam-name>
- <param-value>valueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>myFilterfilter-name>
-
- <url-pattern>/*url-pattern>
- filter-mapping>
含义:在一个Web应用中,也可以部署多个过滤器,这些过滤器组成了一个过滤器链。
注意:code1为过滤器链的doFilter方法之前的代码,code2为过滤器链的doFilter方法之后的代码
过滤器链中的执行顺序按照web.xml中
标签的配置顺序决定的(只要满足过滤器链的请求都会走过滤器链)此标签越靠前的过滤器在过滤器链中越先执行 原因:路径查找在web.xml中是从头到尾进行查找,越在前面越先被查找到就越先被执行,找到路径后直接映射到具体的filter类执行具体逻辑
含义:Servlet监听器用于监听一些重要的事件发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理
注意:
作用:监听servlet中request对象的创建及销毁
servletRequestEvent.getServletContext():获得servletContext对象
servletRequestEvent.getServletRequest():获得ServletRequest对象
作用:监听servlet中request对象属性的相关配置(属性的添加,删除和修改)
servletRequestAttributeEvent.getName():获得属性的名,返回值为string类型servletRequestAttributeEvent.getValue():获得属性的值,返回值为Object类型
- public class MyListener implements ServletRequestListener, ServletRequestAttributeListener {
- //ServletRequestListener
- //request对象被销毁时调用
- @Override
- public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
- System.out.println("rquest对象被销毁");
- }
- //request对象被调用时调用
- @Override
- public void requestInitialized(ServletRequestEvent servletRequestEvent) {
- System.out.println("request对象被创建");
- }
-
- //ServletRequestAttributeListener
- //监听向request中添加属性
- @Override
- public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
- System.out.println("监听向request作用域添加数据");
- System.out.println("添加了"+servletRequestAttributeEvent.getName()+"值为"+servletRequestAttributeEvent.getValue());
- }
- //监听向request中移除属性
- @Override
- public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
- System.out.println("监听向request中移除数据");
- System.out.println("移除了"+servletRequestAttributeEvent.getName()+"值为"+servletRequestAttributeEvent.getValue());
- }
- //监听向request中属性的修改
- @Override
- public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
- System.out.println("监听向request中属性的修改");
- System.out.println("替换了"+servletRequestAttributeEvent.getName()+"新值为"+servletRequestAttributeEvent.getValue());
- }
- }
- <listener>
-
- <listener-class>com.msb.listener.MyListenerlistener-class>
- listener>
作用:监听ServletContext对象的创建和销毁
servletContextEvent.getServletContext():获得ServletContext对象
作用:监听ServletContext对象属性的相关配置(属性的添加,删除和修改)
servletContextAttributeEvent.getName():获得ServletContext属性名,返回值为string类型
servletContextAttributeEvent.getValue():获得ServletContext属性值,返回值为Object类型
- public class MyListener1 implements ServletContextListener, ServletContextAttributeListener {
- //ServletContextListener
- //ServletContext对象创建时调用
- @Override
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- System.out.println("servletContext对象创建");
- }
- //ServletContext对象销毁时调用
- @Override
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- System.out.println("servletContext对象销毁");
- }
-
- //ServletContextAttributeListener
- //ServletContext属性增加时调用
- @Override
- public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
- System.out.println("增加了"+servletContextAttributeEvent.getName()+"属性,值为"+servletContextAttributeEvent.getValue());
- }
- //ServletContext属性移除时嗲用
- @Override
- public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
- System.out.println("移除了"+servletContextAttributeEvent.getName()+"属性,值为"+servletContextAttributeEvent.getValue());
- }
- //ServletContext属性修改时调用
- @Override
- public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
- System.out.println("修改了"+servletContextAttributeEvent.getName()+"属性,新值为"+servletContextAttributeEvent.getValue());
- }
- }
-
- <listener>
- <listener-class>com.msb.listener.MyListener1listener-class>
- listener>
作用:监听session对象的创建和销毁
httpSessionEvent.getSession():获取session对象
作用:监听session对象属性的相关配置(属性的添加,删除和修改)
httpSessionBindingEvent.getName():获得session属性名,返回值为string类型
httpSessionBindingEvent.getValue():获得session属性值,返回值为Object类型
httpSessionBindingEvent.getSession():获得session对象
- public class MyListener2 implements HttpSessionListener, HttpSessionAttributeListener {
- //HttpSessionListener
- //session对象被创建时调用
- @Override
- public void sessionCreated(HttpSessionEvent httpSessionEvent) {
- HttpSession session = httpSessionEvent.getSession();
- System.out.println("session对象被创建");
- }
- //session对象被销毁时调用
- @Override
- public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
- System.out.println("session对象被销毁");
- }
-
- //HttpSessionAttributeListener
- //session添加属性时调用
- @Override
- public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session添加属性时调用");
- System.out.println();
- }
- //session移除属性时调用
- @Override
- public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session移除属性时调用");
- }
- //session修改属性时调用
- @Override
- public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
- System.out.println("session修改属性时调用");
- }
- }
- <listener>
- <listener-class>com.msb.listener.MyListener2listener-class>
- listener>