Servlet的使用
一、Servlet实现 大家好才是真的好 例子
1.1 Servlet的概述:
- 创建一个HelloServlet类,继承于HttpServlet
- 重写doGet方法,并且向浏览器输出一些文本(例如:HelloWorld)
- 配置web/WEB-INF/web.xml文件
1.2 Servlet与普通的Java程序的区别 - 普通的Java程序由main函数调用,而Servlet由Web容器,Tomcat来调用。
-
Servlet是运行在Web容器中
- 对浏览器发送过来的请求做出响应
创建好web结构如下图
****1.编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置servlet-->
<servlet>
<!--servlet的名字-->
<servlet-name>lizi1</servlet-name>
<!--serlvet的类全名--> <servletclass>com.dahaizi.servlet.Demo01</servlet-class>
</servlet>
<!--配置访问地址-->
<servlet-mapping>
<!--这个名字与上面的名字相同-->
<servlet-name>lizi1</servlet-name>
<!--访问地址,必须以/开头-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
2.编写Demo1文件
package com.dahaizi.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
//创建1个Servlet,继承于HttpServlet抽象类,它已经实现了Servlet接口
public class Demo01 extends HttpServlet{
@Override
//重写doGet或doPost
//request一个请求对象, response是一个响应对象。这两个对象由tomcat创建
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置内容的类型和编码,告诉浏览器这是一个网页,编码是utf-8
resp.setContentType("text/html;charset=utf-8");
//得到打印流,将数据输出给浏览器
PrintWriter out = resp.getWriter();
//把网页打印给浏览器 打印的时间 new Timestamp(System.currentTimeMillis())
out.print("<h2>大家好才是真的好"+new Timestamp(System.currentTimeMillis())+"</h2>");
}
}
浏览器显示结果
使用Servlet3.0新增的方法
- 新增了一些注解,简化的javaweb代码开发,可以省略web.xml配置文件.
- 支持异步处理:多线程技术.
- 支持可插性特性:书写的代码编译后生成的class文件可以直接部署到其他项目自动加载执行.
使用注解@WebServlet,指定name和urlPatterns属性
@WebServlet注解属性 说明
name = "HelloServlet" Servlet名字,类似于<servlet-name>one</servlet-name>
urlPatterns = "/hello" 访问地址,可以指定多个地址<url-pattern>/hello</url-pattern>
注解开发servlet代码,继承于HttpServlet,重写doGet方法:
package com.dahaizi.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet (name="demo2",urlPatterns = "/demo2")
public class Demo02 extends HttpServlet {
@Override
//重写doGet方法
//request一个请求对象, response是一个响应对象。这两个对象由tomcat创建
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置内容的类型和编码,告诉浏览器这是一个网页,编码是utf-8
resp.setContentType("text/html; charset=utf-8");
//得到打印流,将数据输出给浏览器
PrintWriter out = resp.getWriter();
out.print("<h2 style='color:blue'>老鼠爱大米</h2>");
}
}
浏览器显示结果
Servlet生命周期
方法 作用 运行次数
构造方法 在对象实例化的时候执行 1次
void init(ServletConfig config) 在初始化的时候执行 1次
void service(ServletRequest req,
ServletResponse res) 每次请求都会执行 n次
void destroy() 在服务器关闭的时候 1次
package com.dahaizi.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.sql.Timestamp;
@WebServlet("/demo3")
public class Demo03 implements Servlet {
//初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println(new Timestamp(System.currentTimeMillis())+"第一次");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(new Timestamp(System.currentTimeMillis())+"第二次开始到死");
}
@Override
public String getServletInfo() {
return null;
}
//销毁方法
@Override
public void destroy() {
System.out.println(new Timestamp(System.currentTimeMillis()) + ",死了");
}
}
浏览器请求后显示的结果
浏览器请求
只有当有用户第一次访问时才会初始化一次
往后不会继续初始化
图中所示的第一次只运行了一遍
服务端显示的结果,关闭服务器就显示死了
GenericServlet类
默认实现了Servlet和ServletConfig这两个接口,并且有默认的实现,它的子类是HttpServlet,为了简化HttpServlet编写。如果我们写的Servlet使用的是Http协议,建议继承于HttpServlet。现在所有的浏览器都是使用http协议,所以我们以后都是继承于HttpServelt类就可以了。
案例:继承于GenericServlet实现一个Servlet
package com.dahaizi.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo4")
//继承GenericServlet类
public class Demo04 extends GenericServlet{
@Override
//重写service方法
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//设置内容的类型和编码,告诉浏览器这是一个网页,编码是utf-8
response.setContentType("text/html;charset=utf-8");
//拿到打印流
PrintWriter out = response.getWriter();
//打印到服务端
System.out.println("请求:"+request);
System.out.println("响应:"+response);
//打印到浏览器
out.print("<span>小姐姐</span> ");
}
}
浏览器显示的结果
服务端显示的结果