Servlet
文章目录
1.什么是servlet
Servlet是Server和Applet的缩写,是服务端小程序的意思。使用Java语言编写的服务程序,可以生成动态的web页面,Servlet主要运行在服务器端,由服务器调用执行,是一种按照Servlet标准开发的类。
Servlet本质上也是java类,但要遵循Servlet规范进行编辑,没有main方法,它的创建、使用、销毁。都由Servlet容器进行管理(如Tomact服务器),写自己的类,不用写main方法,别人自动调用。,由服务器统一调用和执行。
2.Servlet做了什么
本身不做任何业务处理
只是接收请求并决定调用哪个JavaBean去处理请求
确定用哪个页面来显示处理返回的数据
3.JSP与Servlet之间关系
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
①Servlet是一个特殊的Java程序,它运行于服务器的JVM中,依靠服务器的支持向浏览器提供显示内容;
②JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成;
③Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件(有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然,这个说法还是很片面的);
4.Servlet API
主要Servlet API介绍
javax.servlet.Servlet接口
所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
javax.servlet.GenericServlet类
是Servlet的通用版本,是一种与协议无关的Servlet
javax.servlet.http.HttpServlet类
在GenericServlet基础上扩展的基于Http协议的Servlet
5.如何创建Servlet
@WebServlet
URL映射,用于servelt类上@WebServlet(“/login”);
方式一:实现Servlet接口
@WebServlet("/test1")
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//s使用ServletConfig对象初始化我们的Servlet
//执行了,从这个地方可以说明一个问题 Servlet已经被实例化了
System.out.println("init方法执行");
}
@Override
public ServletConfig getServletConfig() {
//获取servlet配置信息对象
//没有执行
System.out.println("getServletConfig方法执行");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//核心方法 类似于我们的doGet()方法,和doPost()方法 请求和响应
//一定执行的
System.out.println("service");
}
@Override
public String getServletInfo() {
//获取Servlet的详细信息
//没有执行
System.out.println("getServletInfo方法执行");
return null;
}
@Override
public void destroy() {
//当tomcat关闭的时候,执行销毁这个servlet的方法
System.out.println("destroy方法执行");
//只有当tomcat关闭的时候,才会执行这个方法
}
}
xml配置文件
<servlet>
<servlet-name>hello</servlet-name>
<!-- servlet-name要和servlet-mapping所对应,映射的关系-->
<servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
方式二:继承GenericServlet抽象类
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class GenericServlet extends GenericServlet {
//只有一个方法是必须重写的,抽象方法
//为什么?service是核心方法,因为请求和响应就是执行这个方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是第二种创建Servlet的方法");
}
}
xml配置文件
<servlet>
<servlet-name>generic</servlet-name>
<servlet-class>com.by.servlet.GenericServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>generic</servlet-name>
<url-pattern>/generic</url-pattern>
</servlet-mapping>
方式三:继承HttpServlet
@WebServlet("/test3")
public class HttpServletDemo extends HttpServlet {
//因为在前端的时候,有两种请求方式get和post
//doGet和doPost方法写在了Service方法中了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("我是HttpServlet创建的Servlet");
}
}
xml配置文件
<servlet>
<servlet-name>http</servlet-name>
<servlet-class>com.by.servlet.HttpServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>http</servlet-name>
<url-pattern>/http</url-pattern>
</servlet-mapping>
最好的方式是继承HttpServlet
1.可以减少对其他方法的要求 init destroy
2.可以根据前端的要求进行分门别类 doGet doPost
6.Servlet生命周期
Servlet生命周期各个阶段
加载和实例化
初始化
处理请求
销毁
构造方法 实例化
init 初始化
service 判断请求类型 get|| post
加载 get||post方法
destroy 销毁
生命周期 | 谁来做 | 何时做 |
---|---|---|
实例化 | Servlet 容器 | 当Servlet容器启动或者容器检测到客户端请求时 |
初始化 | Servlet 容器 | 实例化后,容器调用Servlet的init()初始化对象 |
处理请求 | Servlet 容器 | 得到客户端请求并做出处理时 |
销毁 | Servlet 容器 | 当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候 |
部署运行Servlet
修改web.xml(部署描述文件)
添加:把Servlet内部名映射到一个Servlet类名
添加:把用户访问的URL映射到Servlet的内部名
<servlet-mapping>与<servlet>中的<servlet-name>必须一致
通过URL访问Servlet