1.什么是Servlet
1、Servlet是JavaEE规范之一。规范就是接口
2、Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
3、Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
2.手动实现Servlet程序
1.创建一个javaweb工程
选择Java enterprise —>Web application —> next
Model name进行修改:finish
此时有的版本没有直接生成web下的子目录以及.xml文件,此时需要自己添加
file—project structure —>facets —>点击右边刚刚创建的工程—>点击path右边的加号添加
此时注意新建的WEB-INF不在web下,要自己修改
点击OK
此时已经添加成功,一个初始的Servlet就创建成功了!!!
2.在src新建的包中创建一个类去实现Servelt
public class HelloServelt implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!!!");
}
3.到web.xml中配置servelt程序访问的地址
<?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标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>HelloServelt</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址<br/>/斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径<br/>/hello表示地址为:http://ip:port/工程路径/hello<br/>-->
<url-pattern>/test1</url-pattern></servlet-mapping>
</web-app>
4.修改Tomcat名字:一般修改为自己工程的名字这样便于识别
把Tomcat改为ServletTest—>点击run—>出现.jsp文件中的内容—>在浏览器路径后面加<url-pattern>/test1</url-pattern></servlet-mapping>
中的/test1—>浏览器显示类中定义的输出
3.url地址到Servlet程序的访问
localhost定位主机
8080:通过端口号定位Tomcat
ServletTest确定访问工程
/test1 确定资源路径:通过资源路径—>别名—>访问类
4.Servlet的生命周期
1、执行Servlet构造器方法
2、执行init初始化方法第一、二步,是在第一次访问,的时候创建Servlet程序会调用。
3、执行service方法第三步,每次访问都会调用。
4、执行destroy销毁方法第四步,在web工程停止的时候调用。
5.get和post请求的分发处理
5.1 implements Servlet接口实现分发处理
@Override
/***service方法是专门用来处理请求和响应的
*
* *@param servletRequest
* *@param servletResponse
* *@throws ServletException
* *@throws IOException*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.Hello Servlet!!!");//每次访问都会执行
//类型转换:因为他又getMethod()方法
HttpServletRequest httpservletRequest1 = (HttpServletRequest)servletRequest;
//获取请求的方式
String method = httpservletRequest1.getMethod();
if ("GET".equals(method)){
Doget();
}
if ("Post".equals(method)){
DoPost();
}
}
public void Doget(){
System.out.println("GEt请求");
System.out.println("GEt请求");
}
public void DoPost(){
System.out.println("Post请求");
System.out.println("Post请求");
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> //访问http://localhost:8080/a.htlm点击提交method="post"/"get"
<form action="http://localhost:8080/test1" method="post">
<input type="hidden" name="action" value="login" />
<input type="hidden" name="username" value="root" />
<input type="submit">
</form>
</body>
</html>
5.2通过继承 HttpServlet 实现 Servlet 程序 程序
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址
步骤一:
public class HelloServlet2 extends HttpServlet{//需要在xml中配置
/***doGet()在get请求的时候调用
* *@paramreq
* *@paramresp
* *@throwsServletException
* *@throwsIOException*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2中Doget");//网页提交get请求时会执行里面的代码
}
/***doPost()在post请求的时候调用
* *@paramreq
* *@paramresp
* *@throwsServletException
* *@throwsIOException
* */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2中Dopost");//在做post时执行里面的代码
}
}
xml中配置HelloServlet2
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>servlettest.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<!--到时候的访问路径/test2-->
<url-pattern>/test2</url-pattern>
</servlet-mapping>
6.idea创建Servlet程序
7.Servlet 类的继承体系
自定义的Servlet程序 —> httpservlet类 —>gengricservlet类—>servlet接口
8.ServletConfig 类
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是****每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象**。(就是每个servlet程序都有一个,因为每个类在xml中的配置都是不同的)
// ServletConfig类的三大作用
// 1、可以获取Servlet程序的别名servlet-name的值
// 2、获取初始化参数init-param
// 3、获取ServletContext对象
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
// 1 、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2 、获取初始化参数 init-param
System.out.println(" 初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println(" 初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3 、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
xml中的配置
<servlet>
<servlet-name>HelloServlet5</servlet-name>
<servlet-class>servlettest.HelloServlet5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet5</servlet-name>
<!--到时候的访问路径/test2-->
<url-pattern>/test5</url-pattern>
</servlet-mapping>
9.ServletContext 类(他查看的是整个工程的一些属性与说明,所以一个过程只有一个)
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
域对象 setAttribute() getAttribute() removeAttribute();
ServletContext 类的四个作用 类的四个作用
1、获取 web.xml 中配置的上下文参数 context-param
2、获取当前的工程路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像 Map 一样存取数据
public class HelloServlet5 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取web.xml中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param参数username的值是:" + username);
System.out.println("context-param参数password的值是:" + context.getInitParameter("password"));
// 2、获取当前的工程路径,格式: /工程路径
System.out.println( "当前工程路径:" + context.getContextPath() );
// 3、获取工程部署后在服务器硬盘上的绝对路径
/**
* / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录<br/>
*/
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
System.out.println("工程下css目录的绝对路径是:" + context.getRealPath("/src"));
System.out.println("工程下imgs目录1.jpg的绝对路径是:" + context.getRealPath("/web/index.jsp"));
}
}
public class HelloServlet6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context=getServletContext();
System.out.println(context);
System.out.println("保存之前:Context1获取key1的值是:"+context.getAttribute("key1"));
context.setAttribute("key1","value1");//设置key1的值
System.out.println("Context1中获取域数据key1的值是:"+context.getAttribute("key1"));}//得到key1的值value1
}
//在另一个类中访问刚刚设置的key1:说明是整个工程适用
public class HelloServlet7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context=getServletContext();
System.out.println(context);
System.out.println("Context2中获取域数据key1的值是:"+context.getAttribute("key1"));
}
}