Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
简单的说,Setvlet就是应用在服务端的java程序
依次填写groupid和artifactid后点击next即可
选中提前配置好的maven,点击next
输入项目名称Spring,点击Finish即可
这样就创建好了一个名称为Spring的maven项目,结构如下图:
/**
* 实现Servlet接口编写Servlet程序
*/
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("ServletConfig");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
servletResponse.getWriter().write("hello~~~");
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.cn.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
<web-app>
每创建一个Servlet,我们都需要在web.xml文件中添加两个标签,和(可以将这两个标签看做是一组标签)
两个标签内都会有标签,内容可以修改,但是必须保证两个标签更改后的内容必须保持一致
用于配置servlet的全路径名
用于配置浏览器以什么路径去访问该Servlet类,默认的路径名为/类名
例如:MyServlet类配置的标签为/MyServlet,因此我们在浏览器上的访问路径就是
http://主机名/web项目访问路径/MyServlet
5.部署都Tomct中,
在弹出的窗口上选中MyServlet:war 或者MyServlet:war exploded
最后一步,依次点击apply, ok按钮,到此我们的项目就已经部署到了Tomcat服务器上
启动服务器,访问自己配置的MyServlet程序
思考:上一节我们通过浏览器访问服务器中的MyServlet,可以在页面上看到MyServlet类返回的结果,那么这个Servlet是如何被调用的呢?Servlet又是怎么被执行的?
在上面我们是实现了Servlet接口后,需要实现5个方法这样太麻烦了
而接下来我们要介绍的是HttpServlet这个类,它实现了Servlet接口的所有方法,并且还在原有的基础上添加了与HTTP协议处理的一些方法,比Servlet接口更为强大
因此我们在编写Servlet的时候,只需要继承HttpServlet这个类,也就是间接的实现了Servlet接口,我们关注的只是重新我们需要的方法即可
public class Demo1 extends HttpServlet {
/**
* 在我们开发的过程中,通常我们使用doGet,doGet来处理请求,
* 但是不论是哪一种方法,处理方式都是一样的
* 因此我们可以在doGet方法时,重新调用会doPost方法进行处理
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello~~~");
}
}
同一个Servlet被映射在多个URL上
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.cn.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
<!--多次映射-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet1</url-pattern>
</servlet-mapping>
无论我访问的是http://localhost:8080/MyServlet还是http://localhost:8080/MyServlet1,被调用的全部都是MyServlet这个类
两种格式:
匹配所有
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.cn.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*
匹配扩展名为.jsp的
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.cn.MyServlet</servlet-class>
<!--<load-on-startup>1</load-on-startup>-->
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
上述的Servlet生命周期介绍过,如果浏览器多次对Servlet的请求,一般情况下服务器只创建一个对象,并保存在内存中,为后续的请求做准备
对于每次访问请求,Servlet都会创建一个新的HttpServletRequest对象和HttpServletResponse对象,然后将这两个对象作为参数传递给它的service()方法,service()方法再根据请求的方式调用它的doGet()或者doPost()方法
而当多个用户访问共享的Servlet的时候,服务器会为每个用户创建一个线程,因此一起访问的时候就会出现线程安全问题,对于这种情况我们可以加同步机制synchronized (对象){};
在元素中配置这样一个标签,那么在Web应用程序启动时,服务器就会加载并创建Servlet的实例,并且调用它的初始化init()方法
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.cn.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
作用:可以实现一些定时任务(定时写日志,定时备份数据等)
Web容器为每一个Servlet创建了一个ServletConfig对象。该对象用于从web.xml文件中获取配置信息。
也就是说当Servlet配置了初始化参数后,Web容器在创建Servlet实例对象时,会自动的将这些初始化的参数封装到创建的ServletConfig对象中,并在调用init()方法时将ServletConfig对象传递给Servlet
在web.xml文件中为Servlet配置初始化参数
<!--测试ServletConfig对象-->
<servlet>
<servlet-name>Demo2</servlet-name>
<servlet-class>com.cn.config.Demo2</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>juzi</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Demo2</servlet-name>
<url-pattern>/Demo2</url-pattern>
</servlet-mapping>
测试代码
/**
* ServletConfig对象
*/
public class Demo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig config = this.getServletConfig();
String name = config.getInitParameter("name");
resp.getWriter().write(name);
}
}
输出结果
Tomcat容器在启动时,会为每个WEB应用程序创建一个ServletContext对象,代表着当前的WEB应用
由于一个WEB应用中所有的Servlet都共享着同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯
ServletContext对象通常也被称为context域对象
在web.xml文件中为Servlet配置初始化参数
测试代码,Demo3代码
/**
* ServletContext对象
*/
public class Demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.setAttribute("name","juzi");
}
}
测试代码,Demo4代码
/**
* ServletContext对象
*/
public class Demo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
Object name = context.getAttribute("name");
System.out.println(name);
}
}
输出结果,先访问请求Demo3,再访问请求Demo4