servlet简介:
全称:servlet Applet,简单地说,它就是一个java程序,是一个运行在web服务器上的程序。它可以对Web浏览器或其他HTTP客服端程序发出的请求进行处理。但是使Servlet能够处理以上请求的前提条件是Servlet对象要被布置在Servlet容器当中,我们这里用的Servlet容器就是我们前面用到的Tomcat服务器。可以使浏览器和服务器进行交互,实现web的动态开发。
Servlet的本质:
1.是一个普通的java类,交给tomcat服务器运行
2.访问servlet程序实质是访问web.xml中的url-pattern.
Servlet的基本结构:
package servlet_life;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletLifeDemo")
public class ServletLifeDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* 无参构造
*/
public ServletLifeDemo(){
System.out.println("servlet对象被创建。。。");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("调用了Servlet初始化方法。。。");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("调用了servlet服务方法。。。");
}
@Override
public void destroy() {
System.out.println("调用了servlet销毁方法。。。");
}
}
service()方法一般是通过doGet(),doPost()等方式实现,
当服务器关闭时,该destroy()方法会被调用,销毁该实例
servlet的web.xml配置:
Servlet在使用之前需要进行一定的配置,来告诉服务器被请求的Servlet应该发到哪里。这其实就是一个Servlet在服务器的注册过程,这样服务器就会知道哪个Servlet请求对应哪个Servlet对象。配置过程通常分为Servlet的声明和Servlet的映射两部分。
声明:
<servlet>
<servlet-name>servlet名称</servlet-name>
<servlet-class>包名.类名</servler-class>
</servlet>
第二条语句中的path是用于指定你的Servlet的class文件的路径的。通常你把你的Servlet编译好的class文件放在Tomacat安装目录下的/webapp/ProjectName/WEB-INF/classes文件夹下,此时只需要写你的Servlet的class文件的名字就行了:
映射:
<servlet-mapping>
<servlet-name>servlet名称</servlet-name>
<url-pattern>/servlet名称</url-pattern>
<servlet-mapping>
这里是对我们上面声明的Servlet的一个映射,所以这里的servlet名称要和上面声明中的servlet名称一样才行。
url-pattern用于映射你的访问URL
你可以通过:localhost:8080/servlet名称 访问Servlet程序
Servlet的生命周期
Servlet是运行在服务器端的程序,它的运行状态由Servlet容器(简称容器)来维护。
通常,在容器收到客户对Servlet的请求时,容器会判断这个Servlet是否为第一次被访问,如果是第一次被访问,则会创建一个Servlet实例同时调用该实例的init()方法,进行初始化。
每个Servlet只会被创建一个实例,同时也只会被初始化一次。然后将这个实例一直保存在内存中,对所有的请求进行处理。默认的服务功能是调用与HTTP请求方法相应的do功能。同时,HttpServlet.service()方法会检查请求方法是否调用了适当的处理方法。
最后,当服务器关闭时,容器将会调用Servlet的destroy()方法清除Servlet实例
一个简单的servlet程序
package b_servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决中文乱码问题
response.setContentType("text/html;charset=utf-8");
//获取refer请求头信息
String referer = request.getHeader("referer");
System.out.println("referer:"+referer);
if(referer==null || !referer.contains("/adv.html")){
//跳转到广告页面
response.getWriter().write("当前属于非法连接,请跳转<a href='/Java_Servlet_Demo/adv.html'>首页</a>");
}else{
response.getWriter().write("正在下载资源...");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
referer:防止非法链接的请求头,只有提供超链接的跳转才会有此请求头。
例如:直接向浏览器请求:http://localhost:8080/项目名称/RequestDemo3就属于非法链接,此时referer=null
请求:http://localhost:8080/项目名称/adv.html,经过广告页面的跳转下载资源