一.Servlet的使用
编写Servlet步骤:
1.自定义类,继承HttpServlet
2.重写service方法
public class FirstServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
//编写服务
}
}
3.在web.xml配置访问的路径
<!-- 配置servlet访问路径-->
<!-- servlet路径指定-->
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.zqwl.servlet.FirstServlet</servlet-class>
</servlet>
一个Servlet可以有多个访问路径
(1)/内容(访问时,必须严格匹配)
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
注意:修改web.xml之后必须重新启动tomcat服务器。
(2)内容.do(访问时,必须严格匹配)
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>aa.do</url-pattern>
</servlet-mapping>
(3)*.do(访问时,只要为.do结尾都可匹配)
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
(4)/*(访问时,所有内容都能匹配)
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
(5)/(访问时,除了jsp,其它内容都能匹配)
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Idea集成Tomcat
1.复制conf log work 目录,集成的tomcat使用单独的目录。
2.更换了项目部署的目录,默认不在使用tomcat的webapps的目录。
3.集成的每一个tomcat可以单独管理和设置。
欢迎页面
web.xml的欢迎页面也可以匹配多个,优先级从上至下。
<!--默认欢迎页面-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
在web.xml可以自定义欢迎页面,它的优先级高于父。
<welcome-file-list>
<welcome-file>hello.html</welcome-file>
</welcome-file-list>
二.Servlet的继承结构
1.Servlet接口
-
init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
-
service(),处理客户端请求,执行业务操作,可以利用响应对象响应客户端请求。
-
destroy(),在销毁Servlet对象之前调用该方法。
-
getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
-
getServletInfo(),获取servlet相关信息。
2.ServletConfig接口
-
String getServletName(),获取servlet中servlet-name的值。
-
ServletContext getServletContext(),获取 ServletContext 对象。
-
String getInitParameter(String name),获取初始化参数值。
-
Enumeration getInitParameterNames(),获取所有的初始化参数名。
3. GenericServle抽象类
GenericServlet 是一个抽象类,它实现了 Servlet 接口。它提供了一个通用的、协议无关的 Servlet 基础,可以被扩展以创建特定协议的 Servlet。
4. HttpServlet类
HttpServlet类定义了一系列生命周期方法,包括init()、service()和destroy()。在Servlet容器启动时,init()方法被调用来初始化Servlet。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse,不再需要强转。 在每次收到HTTP请求时,service()方法被调用来处理请求,并根据请求类型调用doGet()、doPost()等具体的方法。
doGet() 方法
doGet() 是服务请求中最常用的方法,用于处理请求,当URL的请求类型为GET请求 ,或者是一个未指定请求类型HTML表单,那么该请求将由 doGet() 方法处理。
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
doPost() 方法
doPost() 是服务请求中最常用的方法,用于处理请求,当请求来自一个特别指定了请求类型为POST的 HTML 表单,那么该请求将由doPost() 方法处理。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
5.总结
三. Servlet的生命周期
创建Servlet对象后---------->初始化(调用 init () 方法)--------->处理/响应客户端的请求(调用 service() 方法)--------->销毁(调用 destroy() 方法)
默认情况:
1.启动服务器,不会创建servlet对象
2.第一次访问servlet时,完成创建和初始化,并只创建和初始化1次
3.关闭服务器,销毁servlet
手动设置:
在web.xml中配置了servlet的load-on-startup
1.启动服务器,完成创建和初始化,并只创建和初始化1次(load-on-startup数值越小启动越早)
2.关闭服务器,销毁servlet
注意:servlet使用单例设计模式
1.所有线程共享一个servlet实例化对象,效率高。
2.尽量不使用全局变量,容易出现线程安全问题。
四.在Tomcat中Servlet的运行原理
在Tomcat中,Servlet的运行原理可以简单描述如下:
-
客户端发起HTTP请求,请求到达Tomcat服务器。
-
Tomcat服务器接收到请求后,根据请求的URL路径找到对应的Web应用。
-
Tomcat根据Web应用的配置文件web.xml找到匹配的Servlet。
-
Tomcat创建一个ServletRequest对象和一个ServletResponse对象,并将它们传递给对应的Servlet进行处理。
-
Servlet容器调用Servlet的初始化方法(init)进行初始化。该方法只会在Servlet第一次被加载时执行一次。
-
Servlet容器调用Servlet的服务方法(service),并将ServletRequest和ServletResponse对象作为参数传递进去。
-
Servlet根据请求类型(如GET、POST等)进行不同的处理逻辑。
-
Servlet完成处理后,生成响应结果,并将其写入ServletResponse对象中。
-
Servlet容器将ServletResponse对象中的响应数据返回给Tomcat服务器。
-
Tomcat服务器将响应数据返回给客户端。
五.请求对象
1.GET和POST的区别
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST则没有。对参数的数据类型GET只接受ASCII字符,
-
POST既可是字符也可是字节。
-
GET相比POST来说不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
2.Service方法开发
1.获取请求数据
(1)获取请求行中数据
请求方式
String method = req.getMethod();
请求URI
String requestURI = req.getRequestURI();
请求URL
String requestURL = req.getRequestURL();
获取协议及版本
String protocol = req.getProtocol();
(2)获取请求头中数据
获取HTTP请求头部中的"Accept"字段的值
String accept =req.getHeader("Accept");
获取所有头的名字
Enumeration<String> headerNames = req.getHeaderNames();
(3)获取请求中参数
String 变量名 = req.getParameter("参数名")
注意:获取复选框有多个数据,可用数组来接收
String[] 数组名 = req.getParameterValue("参数名");
注意:如果出现乱码问题,可以在首行添加如下代码:
req.setCharacterEncoding("utf-8");
2.处理请求数据
3.处理响应