笔记大纲
- Servlet作用
- Servlet简介
- 创建Servlet步骤(实现Servlet接口)
- Servlet工作原理
- Servlet生命周期【单例多线程】
- ServletConfig与ServletContext
- 最终创建Servlet的方式(继承HttpServlet类)
- 比对(请求)request与(响应)response
1.Servlet作用
用来处理请求与响应,Tomcat只能处理静态资源,Servlet可以处理动态资源,其实就是一个接口(java类),也可以看成一个容器;
因为客户端(html/jsp)无法直接访问java文件。我们需要客户端请求java文件。所以需要特殊的java文件即Servlet。
2.Servlet简介
(1)Servlet:即是Server Applet(服务器端小程序)。
(2)狭义&广义
①狭义:javax.servlet.Servlet接口及其子接口。
②广义:指实现了Servlet接口的实现类。
(3) 特点
①可以被页面直接请求即URL特性。
②全类名。
附加(STS创建动态工程):
第一步:右键“New”,选择Web下的Dynamic Web Project。
第二步:自定义工程名,目前选择version2.5,注解就是3.0,点击Finsh即可。
3.创建Servlet步骤(实现Servlet接口)
(1)声明Class类实现javax.servlet.Servlet接口( 实现接口中的抽象方法)。
package com.codinglin.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
}
}
(2)在web.xml中注册
①全类名(让Servlet容器、JSP容器、Web容器、Web服务器创建Servlet对象)。Servlet是单例。
②URL特性(页面可以直接访问、浏览器也可以直接访问)。
4.Servlet工作原理
(1)测试类:HelloServlet 实现了Servlet接口
(1)请求:<a href="HelloServlet">HelloServlet</a>
(2)匹配(HelloServlet)的Url在web.xml--- <url-pattern>/HelloServlet</url-pattern>
(3)通过url查找指定<servlet-name>HelloServlet</servlet-name>
(4)通过servlet-name查询指定的Servlet:
<servlet-class>com.coding0110lin.servlet.HelloServlet</servlet-class>
(5)执行HelloServlet中service()方法,处理请求并做出响应。
URL
(2)正常的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 注册HelloServlet -->
<servlet>
<!-- Servlet别名 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 全类名-->
<servlet-class> com.codinglin.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!-- URL特性 ,统一资源-->
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
5.Servlet生命周期
Servlet从被创建到销毁(消亡)的过程,称之为Servlet生命周期。
执行时机 | 执行次数 | |
---|---|---|
构造器 | 第一次接收请求时执行 | 在整个生命周期中执行一次 |
init() | 第一次接收请求时执行(在构造器之后执行) | 在整个生命周期中执行一次 |
service() | 每次接收请求时执行 | 在整个生命周期中执行多次 |
destroy() | 关闭服务器时执行 ,释放资源 | 在整个生命周期中执行一次 |
【必须掌握!】通俗的说:第一次请求Servlet时,服务器(Web服务器、Servlet容器)创建Servlet对象,之后会调用init()方法进行初始化操作(为形参赋值操作),最后调用service()方法处理请求并做出响应。以后再次请求时,只会调用service()方法处理请求(不会调用构造器&init())。处理完所请求后,关闭服务器时,调用destroy()方法销毁Servlet。
6.ServletConfig与ServletContext
6.1.ServletConfig代表了Servlet的配置信息。
主要作用:
①获取当前Servlet名称 :getServletName()
②获取当前Servlet初始化参数:getInitParameter(“参数名”)
说明:初始化参数需要配置到web.xml的servlet标签中
③获取ServletContext对象:getServletContext()
6.1.ServletContext代表了Servlet上下文(当前web应用,别名:application)。
主要作用:
①获取当前上下文的初始化参数getInitParameter(“参数名”)
②获取真实路径(D:test\test2…)getRealPath("/xxx.html")
③域对象(四个)
【附】Servlet相关接口
①ServletConfig:用来封装Servlet标签中的信息。
②ServletContext:封装了当前web工程的信息,一个web应用有且仅有一个ServletContext对象,是最大的域对象。
③ServletRequest:
④ServletResponse;
⑤HttpServletRequest:用来封装浏览器发给服务器的请求报文。
⑥HttpServletResponse;用来封装服务器发给浏览器的响应报文。
(3)web.xml配置信息(1)(2)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!--⑵ServletContext初始化参数-->
<context-param>
<param-name>age</param-name>
<param-value>20</param-value>
</context-param>
<!--注册DemoServlet-->
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.atguigu.servlet.DemoServlet</servlet-class>
<!--⑴ServletConfig初始化参数-->
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<!--URL特性 ,统一资源-->
<url-pattern>/DemoServlet</url-pattern>
<!--"/"代表了WebContent目录-->
</servlet-mapping>
</web-app>
如果只需要留下Service()方法,之前创建Servlet就显得很累赘。
7.最终创建Servlet的方式(继承HttpServlet类)
EndServlet 继承HttpServlet 继承 GenericServlet :实现Servlet
7.1.GenericServlet类
①getServletConfig()
②getServletContext()
③abstract service()
7.2.HttpServlet类底层源码
HttpServlet继承GenericServlet类,抽象方法必须要重写!
//重写
override service(ServletRequest req,ServletResponse res){
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
service(request,response);
}
//重载
overload service(HttpServletRequest request,HttpServletResponse response){
//获取请求方式
String method = request.getMethod();
if(method.eq("GET")){
doGet();
}else if(method.eq("POST")){
doPost();
}
}
7.3.代码示例(创建)
①新建servlet文件类型TestServlet(其实就是java文件),自动就会继承HttpServlet类,配置文件web.xml也会自动加载!
package com.codinglin.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet-->doGet()");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet-->doPost()");
}
}
②index.html页面:
body>
<h2>index.html</h2>
<h3>Get请求</h3>
<form action="TestServlet" method="get">
用户名:<input type="text" id="username" name="username" ><br>
密码:<input id="pwd" type="password" name="pwd" ><br>
<input type="reset">
<input id="btnSub" type="submit" value="登录">
</form>
<h3>Post请求</h3>
<form action="TestServlet" method="post">
用户名:<input type="text" id="username" name="username" ><br>
密码:<input id="pwd" type="password" name="pwd" ><br>
<input type="reset">
<input id="btnSub" type="submit" value="登录">
</form>
</body>
③sts窗口输出结果
当form中的method为“get”时,控制台输出“TestServlet–>doGet()”
当form中的method为“post”时,控制台输出“TestServlet–>doPost()”
8.(请求)request与(响应)response
8.1.request
(1)类型:HttpServletRequest。
(2)定义:相当于客户端向服务器发送的请求报文,该对象由服务器创建,并以参数的形式传递给doGet()或doGet()。
(3)作用:
序号 | 作用 | 方法 |
---|---|---|
1 | 获取请求参数 (通过表单名) | request.getParameter() /request.getParameterValues():获取多个同名表单提交 |
2 | 获取项目的虚拟路径(项目的虚拟路径为:"/项目名") | request.getContextPath() |
3 | 转发(跳转路径) | request.getRequestDispatcher().forword(request,response) |
4 | 域对象(四个) | |
5 | 获取请求报文中请求头中的信息 | request.getHeader() |
6 | 获取请求协议 | request.getServerPort();获取请求服务器端口号 request.getScheme():获取请求协议 request.getServerName();获取请求服务器名称 |
8.2.response
(1)类型:HttpServletResponse。
(2)定义:相当于服务器向客户端发送的响应报文,该对象由服务器创建,并以参数的形式传递给doGet()或doGet()。
(3)作用:
序号 | 作用 | 方法 |
---|---|---|
1 | 响应数据(数据:文本|html) | response.getWriter().write(); |
2 | 重定向(跳转路径) | response.sendRedirect() |
说明:WEB-INF是web应用的私密目录,只有服务器访问,客户端不能直接访问。
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.csdn.net/ 欢迎转载,一起技术交流吧!