Servlet
1.Servlet
1.1 什么是Servlet
1、Servlet是JavaEE规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是: Servlet 程序、Filter 过滤器、Listener监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
1.2 手动实现Servlet程序
1、编写一个类去实现 servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("构造函数执行了。。");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init执行了。。。");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service执行了。。。");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy执行了。。。。");
}
}
<!--servlet 给Tomcat配置servlet程序-->
<servlet>
<!--servlet-name 为Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是Servlet程序的全类名-->
<servlet-class>com.apple.cookie_session.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping 给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 告诉服务器,当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern配置访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/helloServlet 表示地址为:http://ip:port/工程路径/helloServlet
-->
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
1.3 Servlet的生命周期
- 执行 Servlet 构造器方法
- 执行 init 初始化方法(前两步,是在第一次访问的时候创建Servlet程序会调用)
- 执行 service 方法(每次访问都会调用)
- 执行 destroy 销毁方法(在web工程停止的时候调用)
执行上面的程序可以看到
注意:从上面可以看到,Servlet只在第一次访问的时候创建了,后面每次请求时没有再创建,所以Servlet是线程不安全的
1.4 通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序
1、编写一个类去继承 Httpservlet 类
2、根据业务需要重写 doGet或 doPost方法
3、到 web.xml中的配置 Servlet 程序的访问地址
public class HelloServlet2 extends HttpServlet {
/**
* 在get请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet方法");
}
/**
* 在post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost方法");
}
}
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.apple.cookie_session.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<url-pattern>/helleServlet2</url-pattern>
</servlet-mapping>
1.5 继承体系
2. ServletConfig
ServletConfig类从类名上看,就知道是Servlet程序的配置信息类
作用:
- 可以获取Servlet程序的别名 servlet-name 的值
- 获取初始化参数init-param
- 获取ServletContext对象
3. ServletContext
1、ServletContext是一个接口,它表示 Servlet 上下文对象
2、一个 web工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。
4、ServletContext是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围。
作用:
- 获取 web.xml中配置的上下文参数 context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map一样存取数据
4. 请求转发
请求转发必须要以斜杠打头,/ 斜杠表示地址为: http://ip:port/工程名/ ,映射到IDEA代码的web目录
httpServletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);
- 浏览器地址栏没有变化
- 他们是一次请求
- 他们共享Request域中的数据
- 可以转发到WEB-INF目录下
- 是否可以访问工程以外的资源(否)
5. 请求重定向
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/index.jsp");
- 浏览器地址栏会发生变化
- 两次请求
- 不共享Request域中数据
- 不能访问WEB-INF下的资源
- 可以访问工程外的资源,比如 https://www.baidu.com/
6. / 的不同含义
/ 斜杠 如果被浏览器解析,得到的地址是: http://ip:port/
/ 斜杠 如果被服务器解析,得到的地址是: http://ip:port/工程路径
特殊情况:response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/