关于组件:其实就是类(组件是一些可以实现特殊功能的类)
一、servlet介绍
1、概念
Servlet:(server applet)概念:运行在服务器端的小程序,Servlet其实就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
注:Servlet组件:专门用来处理用户请求的组件,使用需要先导jar包
2、servlet体系结构
servlet组件是一个接口,该体系结构中有两个类 :GenericServlet(抽象类) 和 HttpServlet(抽象类)
- 注:GenericServlet类将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,但是工作中不常用,工作中常用HttpServlet
(1)HttpServlet
HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。(对Http协议的一种封装,可以用来简化操作)
响应流程:
- 1.Web客户向Servlet容器发出Http请求
- 2.Servlet容器解析Web客户的Http请求
- 3.Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息
- 4.Servlet容器创建一个HttpResponse对象
- 5.Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
- 6.HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
- 7.HttpServlet调用HttpResponse的有关方法,生成响应数据
- 8.Servlet容器把HttpServlet的响应结果传给Web客户
- 其中HttpServlet首先必须读取Http请求的内容,Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到HttpServlet对象中。
<1> HttpServlet中的service方法中做了请求方式判断操作,判断操作是何种类型,使用method.equals("GET")
3、servlet快速入门
(1)创建javaweb(javaEE)项目
(2)创建一个类,实现servlet接口
(3)实现接口中的抽象方法
package com.test.web;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
(4)配置servlet
方法1:在web.xml中配置 <实现servle的第一种方法>
当引入别人写的servlet时,使用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_4_0.xsd"
version="4.0">
<!-- 配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<!-- 必须写完全限定名 -->
<servlet-class>com.test.web.ServletDemo</servlet-class>
</servlet>
<!-- 配置servlet映射-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
方法2:注解配置
扫描二维码关注公众号,回复:
12656122 查看本文章

servlet是自己写的,用注解
@WebServlet("/demo1")
4、servlet执行原理
当服务器接收到浏览器客户的请求之后,会
- (1)解析请求的URL路径,获取访问的servlet的资源路径,找到项目;
- (2)查找web.xml文件,是否有对应的标签体内容,如果有,则找到对应的标签内的全类名
- (3)tomcat会将字节码文件加载进内存,并且创建其对象(cls.newInstance())
- (4)调用其方法(service)。
5、servlet生命周期
注:创建对象之前,需要进行类的加载
- 被创建: 执行servlet的 init()方法 , 只执行一次,说明servlet在内存中是单例的(多用户同时访问,可能存在线程安全问题,尽量不要在servlet中定义成员变量,即使定义了成员变量,也不要对其修改值),默认情况下,第一次被访问时被创建(可配置servlet的创建时期:值为负整数,第一次被访问时创建/值为0或者为正整数,则在服务器启动时创建
- 提供服务:执行 service()方法,每次访问servlet时service()方法都会被调用一次(多次调用)。
- 被销毁:destory()方法在servlet被销毁之前只执行一次,用于释放资源。服务器关闭时,servlet被销毁。只有服服务器正常关闭时,才会执行destory()方法。
package com.test.web;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
/**
* 初始化方法
* 在servlet被创建时执行,只会执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("-------init-------");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
*每次servlet被访问时都会被执行,执行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("-------service-------");
}
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在服务器正常关闭时执行,只会执行一次
*/
@Override
public void destroy() {
System.out.println("-------destory-------");
}
}
二、servlet3.0
1、创建servlet3.0项目步骤
- 创建JavaEE项目,选择servlet的版本3.0y以上,可以不创建web.xml
- 定义一个类,实现servlet接口
- 重写方法
- 在类上使用 @WebServlet 注解,进行配置
2、servlet3.0好处
支持注解配置,可以不用配置 web.xml(JavaEE6以后支持3.0)
3、servlet3.0新增特性
- 注解支持;Servlet、Filter、Listener无需在web.xml中进行配置,可以通过对应注解进行配置;
- 支持Web模块;
- Servlet异步处理;
- 文件上传API简化;
4、servlet使用
让一个类成为servlet的步骤:
- 继承 HttpServlet类
- 加入 @WebServlet注解,配置路径信息
- 实现service方法(麻烦,get和post各需要一个servlet)
5、doGet() 和 doPost()的使用
真正在开发中,是禁止直接实现service方法来提供服务的,转而重写doGet和doPost方法来提供服务
- 好处:一个servlet解决多个操作,简化了操作
- 注:既重写service,又重写了doGet()和doPost()时,调用service方法,因为子类实现了service方法,所以不会调用父类的service方法。
- 只有doGet和doPost时,会调用父类的service,父类的service中邪了判断请求方式的代码
package com.test.web;
import com.test.pojo.Book;
import com.test.utils.JDBCUtils;
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.math.BigDecimal;
@WebServlet("/book/update")
public class BookUpdateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
Book book = JDBCUtils.getOne("select bookISBN,name,author,price,press from book where bookISBN = ?", Book.class ,id);
request.setAttribute("book", book);
request.getRequestDispatcher("/WEB-INF/webPages/book/update.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
String name = request.getParameter("name");
String author = request.getParameter("author");
BigDecimal price = new BigDecimal(request.getParameter("price"));
String press = request.getParameter("press");
JDBCUtils.executeUpdate("update book set name=?,author=?,price=?,press=? where bookISBN = ?", name, author, price,press,id);
response.sendRedirect("list");
}
}
6、页面跳转操作
- 转发:request.getRequestDispatcher('路径'),forward(request, response);
- 重定向:response.sendRedirect("list");
7、servlet urlpartten配置
使用注解进行配置:@WebServlet("/path") 或者 @WebServlet({"/path","/path1"})
(1)路径配置规则
- /xxx
- /xxx/xxx 多层路径,目录结构
- *.后缀名
注:通配符 * 的方式优先级最低,其他的都匹配不到时,才走这条配置