Servlet
一、简介
1、Servlet:
狭义上的Servlet:仅仅指的是这个servlet接口
广义的Servlet:不仅包含该Servlet接口,还包含该Servlet的接口的子类!
2、Servlet是JavaWeb部分的三大组件:
JavaWeb部分三大组件:Servlet、Filter、Listener,这三个组件都需要交给web服务器管理!
3、Servlet的主要作用
接收请求
处理请求
完成响应
4、创建Servlet的三种方法:
1>自定义一个Servlet:
1).自定义一个类,实现Servlet接口,并实现接口中的方法
2).将自定义的servlet类在web.xml文件中配置一下!
1 <!-- 使用servlet标签配置我们自定义的servlet --> 2 <servlet> 3 <!-- 在servlet-name该标签中,我们可以配置一个servletName, 4 建议和servlet类的简类名一致 ,该servletName是我们自己使用--> 5 <servlet-name>HelloServlet</servlet-name> 6 <!-- 使用servlet-class标签配置自定义servlet类的全类名, 7 这个全类名是给服务器使用的,服务器会使用这个全类名创建该类所对应的servlet对象 8 --> 9 <servlet-class>com.neuedu.servlet.HelloServlet</servlet-class> 10 </servlet>
1 <!-- 使用servlet-mapping标签配置servlet映射 --> 2 <servlet-mapping> 3 <servlet-name>HelloServlet</servlet-name> 4 <!-- 该url-pattern 是用来请求映射url地址的,也就说 5 该标签中的内容是给浏览器访问使用的! 6 --> 7 <url-pattern>/Hello</url-pattern> 8 </servlet-mapping>
2>新建类,继承HttpServlet,重写doGet()和doPost()方法
在web.xml文件中手动配置servlet信息(同第一种方法配置相同)
3>直接在项目的某一个包下右键—>New—>Servlet
这种创建方式不用配置web.xml文件,系统会进行自动配置
5、新建Servlet没有service()方法原理
目前我们常用的新建Servlet的方法就是直接右键,创建Servlet,这种方法创建的Servlet没有有service()方法,而是doGet()和doPost()方法
这是由于这种方法新建的Servlet,继承HttpServlet,而HttpServlet继承了GenericServlet,
GenericServlet类实现了Servlet, ServletConfig接口,因此HttpServlet中继承了父类的service()方法
在HttpServlet类中,重写了service()方法,将ServletRequest,ServletResponse对象强制转换为
HttpServletRequest,HttpServletResponse对象,并根据浏览器的请求方式,调用doGet()或doPost()方法
Eclipse中查看Tomcat源代码的方法:
选中某个接口或类,右键—>Open Declaration—>Attach Source—>将下载好的tomcat源代码压缩包apache-tomcat-7.0.67-src.zip添加到eclipse中
查看源代码时,直接选中按F3即可
二、Servlet生命周期
- Servlet生命周期:就是Servlet对象由产生到销毁的过程
涉及到的方法:
1) Servlet构造器:在第一次访问该servlet的时候调用,且只会被调用一次,说明该Servlet是单例的,注意:不要在Servlet中定义非共享的变量。
2) init()方法:在第一次访问该servlet的时候调用【在构造器被调用之后紧接着被调用】,且该方法只会被调用一次
3) service()方法:每次访问该Servlet都会调用一次service()方法,因此业务逻辑代码,主要写在service()方法中
4) destroy()方法:该方法会在项目被卸载(服务器关闭)的时候被调用,且只会被调用一次
2、普通Servlet生命周期:请求的时候才将Servlet对应的字节码文件加载到虚拟机中
3、默认<load-on-startup></load-on-startup>值为负,即普通Servlet
4、设置<load-on-startup>1</load-on-startup>值为正(优先级0,1,2……),当部署的时候就会调用init()方法
三、相关接口
1、ServletConfig
1) 代表:代表当前Servlet的配置信息,每个Servlet对应唯一的一个ServletConfig对象
1 <servlet> 2 <servlet-name>MyServlet1</servlet-name> 3 <servlet-class>com.neuedu.firstservlet.web.MyServlet1</servlet-class> 4 <init-param> 5 <param-name>username</param-name> 6 <param-value>张三</param-value> 7 </init-param> 8 </servlet>
2) 获取:由Tomcat服务器创建,通过参数的形式传递给init()方法
3) 功能:
获取当前servlet的名称【getServletName()】
获取当前servlet的初始化参数【getInitParameter("username")】
获取Servletcontext【getServletContext()】
2、ServletContext:
1) 代表:ServletContext代表的是当前web应用!
2) 获取 :通过ServletConfig对象获取[getServletContext()]
3) 功能:
获取整个web应用的初始化参数【getServletContext()】
可以做为javaweb部分的四大域对象之一使用
可以获取当前项目的名称【getContextPath()】
可以获取文件的绝对路径【getRealPath("/index.html")】
路径:
虚拟路径:http://localhost:8080/servlet01/BServlet
真实路径:是指的在本地磁盘上的具体路径
3、HttpServletRequest
1)代表:代表浏览器向服务器发送的请求报文
2) 获取:由tomcat服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
3) 功能:
getParameter()获取请求参数
getContextPath():获取当前项目名
setAttribute/getAttribute:本身就是一个域对象!
request.getRequestDispatcher("1.html").forward(request,response);可以实现转发功能
4、HttpServletResponse
1)代表:服务器响应给浏览器的响应报文
2)获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
3)功能:
response.getWriter().println("<h3>helloworld!</h3>");可以返回给浏览器一个页面或者一个页面片段!
response.sendRedirect("/servlet1/1.html"); :可以做请求的重定向
四、服务器转发与重定向
1、Tomcat(Servlet/JSP容器)服务器转发
RequestDispatcher请求分发器接口
RequestDispatcher.forward(HttpServletRequest req,HttpServletResponse resp);
RequestDispatcher requestDispatcher=request.getRequestDispatcher(“/second”);
requestDispatcher.forward(request,response);
是同一个请求,继续延长原有的请求,只能转发本应用程序内的资源,转发发生在服务器端
服务器在Servlet间的转发既不属于get请求,也不属于post请求,只是由转发到的Servlet的doGet()方法处理
2、重定向
由服务器响应对象告诉浏览器去请求(重定向)另一资源,对原有客户端请求来说,是浏览器向服务器发送了另一个请求,如果请求是外部资源,将由响应的服务器应用处理,是两个不同的请求(request)
注意作用域范围:request在请求范围内有效,ServletContext在整个应用内有效,因此重定向无法从源request内getAttribute
response.sendRedirect(request.getContextPath()+”index.jsp”);
3、转发与重定向对比
|
浏览器请求次数 |
地址栏是否发生变化 |
发生在服务器端/浏览器端 |
浏览器能否感知 |
|
转发 |
1 |
否 |
服务器端 |
否 |
Request |
重定向 |
2 |
是 |
浏览器端 |
是 |
Response |