一、什么是servlet?
Servlet是运行在java服务器中的小型Java程序。
作用:接收用户请求,并对请求作出处理,将处理结果相应给客户端。
Servlet是JavaWeb三大组件(Servlet、过滤器,监听器 )之一,它属于动态资源。Servlet的作用是处理请求,服务器(Tomcat等)会把接收到的请求交给Servlet来处理,在Servlet中通常要完成以下三步:接收请求、处理请求、完成响应。
举个栗子:客户端发出登陆请求,服务器通过请求路径映射到对应的Servlet,将请求交由Servlet来处理,Servlet需要由我们自己编写,实现一个Servlet接口可以继承 javax.servlet.http.HttpServlet类。
二、实现Servlet有哪些方式?
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类。
三、请你说说Servlet的声明周期。
先看一个简单的Servlet样例
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("hello world!");
}
@Override
public void init() throws ServletException {
super.init();
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
@Override
public void destroy() {
super.destroy();
}
}
- 初始化:默认情况下,服务器会在第一次访问时创建对应的Servlet,如果需要在服务器启动时创建Servlet,需要在web.xml配置文件中配置load-on-startup参数,如<load-on-startup>0</load-on-startup>,数值越小,越先被启动。Servlet创建成功后,会调用init方法,我们在编写Servlet程序时,可以重写init方法,在init方法中进行一些初始化的处理。
- Servlet服务:服务器接到一次Servlet请求,就会调用一次service方法,所以我们要将Servlet的逻辑代码写在service方法中。如果是通过继承javax.servlet.http.HttpServlet的方式实现Servlet,service方法又分成了doGet,doPost等方法,我们可以根据不同的请求方式将代码写在对应的方法中,如doGet,doPost等。
- 销毁:Servlet通常在服务器关闭时销毁,在销毁之前会去调用servlet的destroy方法,我们可以把对某些资源释放的代码放在destroy方法中。
四、Servlet是线程安全的吗?
Servlet是单例的,对于具体的一个Servlet来说,无论多少个请求过来,都是同一个Servlet对象在处理,所以是存在线程安全问题的,所以我们不应该在Servlet类中随便创建成员变量,因为可能存在一个线程对这个变量进行写操作。
五、如何让某个Servlet在服务器启动时就创建?
默认情况下,Servlet是在第一次请求的时候创建,可以在web.xml文件中配置load-on-startup参数,使Servlet在服务启动时创建,如:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.llg.servlet.HelloServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
六、Servlet get和Servlet post的区别是什么?
-
get方式请求
- get方式提交的请求,参数通过url路径拼接的方式传递;
- 不安全的提交方式;
- 提交的参数大小是有限制的,最多只能传递1024个字节,并且只能传递文本类型的参数;
- 提交后调用的是Servlet的doGet方法。
-
post方式请求
- post方式提交的请求,参数放在请求体中;
- 相对安全的提交方式;
- 参数大小没有限制,不仅可以提交文本格式的参数,还可以提交二进制格式的参数;
- 提交后调用的是Servlet的doPost方法。
七、重定向和转发的区别是什么?
- 重定向是指服务器返回一个重定向指令,告诉浏览器,使用新的路径再发起新的请求,新请求和原来的请求相互独立,互不影响,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。response.sendRedirect()的默认Location重定向用的是302状态码。在Servlet中可以使用ServletResponse的sendRedirect方法实现重定向;重定向会改变浏览器的地址栏。
- 转发是指服务器内部转发,当一个Servlet接收到一个请求时,他可以转发给另外一个Servlet处理,可以使用req.getRequestDispatcher("路径").forward(req, resp)实现转发,转发不会改变浏览器的地址栏。
八、实操-动手写一个Servlet程序。
请参考另一篇博文:Java Web 编写第一个Servlet程序全过程_lilianggui的博客-CSDN博客