JavaWeb三大组件学习笔记

JavaWeb三大组件

Servlet

服务器端组件,用于处理HTTP请求和响应的任务。

使用Tomcat运行

Servlet类

  1. javax .servlet.GenericServlet:所有Servlet类的父类
    包含:
    • 一个抽象的service 方法
    • 几个辅助方法用于日志操作和从应用和Servlet 配置中获取信息
  2. java.servlet.http.HttpServlet:继承了GenericServlet, 并实现了只接受HTTP 请求的service 方法。如下表
方法Servlet方法目的
GETdoGet()从指定的URL中获取资源
HEADdoHead()与GET类似,唯一的区别在于该请求只返回页面的头部数据
POSTdoPost()通常用于处理Web表单提交
PUTdoPut()存储URL中提供的实体
DELETEdoDelete()删除由URL标识的资源
OPTIONSdoOptions()返回支持的HTTP方法
TRACEdoTrace()用于诊断目的

写空方法返回405错误

初始化和销毁方法
  • init()
    • 调用init 方法时, Servlet 中的所有属性都已经设置完成,并提供了对ServletConfig 和javax.servlet.ServletContext 对象的访问
    • init 方法将在Web应用程序启动后,第一个请求到达Servlet 时调用
  • destroy()
    • destroy 在Servlet 不再接受请求之后立即调用。
    • 总是应该使用destroy 方法清理Servlet 待有的资源

配置Servlet

<?xml version="l . 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">
<display-name>Hello World Applica 七ion</display-name>
<servlet>
	<servlet-name>helloServlet</servlet-name>
	<servlet-class>com.wrox.HelloServlet</servlet-class>
    <load-on-startup>l</load-on-startup>
</servlet>
</web-app>

从上到下依次是

  • web-app xmlns:表示Web应用程序的根元素,告诉解析器在解析文档时使用哪个XML规范
  • xmlns:xsi:指定了XML Schema实例命名空间
  • xsi:schemaLocation:指定XML Schema的位置
  • <servlet>:创建一个Servlet 的实例
Servlet映射到URL
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/greeting</url-pattern>
</servlet-mapping>
  • 使用了该配置之后,所有访问应用程序相对URL)greeting 的请求都将由helloServlet 处理
  • <servlet><servlet-mapping>标签内的<servlet-name>标签应该一致

Servlet方法

HttpServletRequest

提供了访问和获取HTTP请求信息的方法

  1. 获取请求参数:

    POST /index.jsp?returnTo=productPage HTTP/1.1
    Host : www.example.com
    Content-Length : 48
    Content-Type : application/x-www-form-urlencoded
    
    addToCart&productld=9781118656464&category=Books
    
  2. 确定与请求内容相关的信息

    • getContentType 将返回请求的Milv庄(多用途互联网邮件扩展)内容类型
  3. 读取请求内容

    • getlnputStream 将返回一个javax. servlet. ServletlnputStream
      适用于二进制格式
    • 方法getReader 将返回一个java.io.BufferedReader
      适用于UTF-8 或IS0-8859-1 文本
  4. 获取请求特有的数据,例如URL 、URI 和头
    http://www.example.org/application/index.jsp?category=Books为例

    • getRequestURL: 返回客户端用于创建请求的完整URL
      http://www.example.org/application/index.jsp
    • getRequestURI:只返回URL 中的服务器路径部分
      /application/index.jsp
    • getServletPath:只返回用于匹配Servlet 映射的URL部分
    • getHeader:返回指定名字的头数据。如果有多个头使用了相同的名字,该方法将只返回第一个值。
    • getHeaderNames:返回请求中所有头数据的名字的枚举
    • getlntHeader:如果有某个特定的头的值一直是数字,那么可以调用该方法返回一个数字。
    • getDateHeader:对千可以表示有效时间戳的头数据,该方法将返回一个Urux 时间戳(毫秒)。
  5. 会话和Cookies

HttpServletResponse

继承自ServletRequest,提供了对请求中与HITP 协议相关属性的访问
可以使用响应对象完成设置响应头、编写响应正文、重定向请求、设置HITP 状态码以及将Coo如es 返回到客户端等任务。这

  1. 编写响应正文
    输出数据的方法: 不要同时使用

    • getOutputStream:返回一个javax.servlet.ServletOutputStream
    • getWriter:将返回一个java.io.PrintWriter

    使用PrintWriter 向客户端返回mML 或者其他基千字符编码的文本

  2. 设置头和其他响应属性

    • 设置头数据:
      • 会覆盖现有数据:setHeader 、setintHeader 和setDateHeader
      • 不会覆盖现有数据:addHeader 、addlntHeader 或addDateHeader
    • 设置HTTP 响应状态码:setStatus:
    • 判断当前响应的状态:getStatus
    • 设置状态码:sendError表示一条可选的错误消息将会输出到响应数据中,重定向到Web
      容器为客户端提供的错误页面,并清空缓存
    • 将客户端重定向至另一个URL:sendRedirect
HttpSession

HttpSession 对象在整个用户会话期间都会存在,可以存储和检索与用户会话相关的数据。

  1. Object getAttribute(String name):获取在 HttpSession 中指定名称的属性值。如果不存在该属性,则返回 null
  2. void setAttribute(String name, Object value):将指定名称和值的属性存储到 HttpSession 中。如果已经存在具有相同名称的属性,则将其值替换为新值。
  3. void removeAttribute(String name):从 HttpSession 中移除指定名称的属性。
  4. Enumeration<String> getAttributeNames():获取存储在 HttpSession 中的所有属性名称的枚举。
  5. long getCreationTime():获取 HttpSession 创建的时间,以毫秒为单位。
  6. String getId():获取 HttpSession 的唯一标识符。
  7. long getLastAccessedTime():获取 HttpSession 上一次访问的时间,以毫秒为单位。
  8. int getMaxInactiveInterval():获取 HttpSession 的最大不活动时间间隔(以秒为单位),即在用户未活动期间,HttpSession 多长时间后将失效。
  9. void setMaxInactiveInterval(int interval):设置 HttpSession 的最大不活动时间间隔(以秒为单位)。
  10. void invalidate():使 HttpSession 失效,即删除 HttpSession 中的所有属性并释放资源。

这些方法允许您在 HttpSession 中存储和获取数据,管理会话的生命周期,并与用户会话状态进行交互。通过使用这些方法,您可以实现用户登录状态管理、购物车功能、用户偏好设置等功能,为用户提供更好的网站体验。

用参数和接受表单提交

image-20230806095254271image-20230806095259726image-20230806095938808

初始化参数配置

上下文初始化参数

在web.xml 文件中使用<context-param>标签声明上下文初始化参数。

image-20230806110920295

应用程序中的所有Servlet 都将共享这些初始化参数,

使用Servlet初始化参数
  • 从ServletConfig 对象中获取

  • image-20230806111241059

    image-20230806111436761

  • 使用注解完成参数初始化image-20230806111614918

表单上传文件

将文件上传到Java EE Servlet

  1. 配置Servlet支持文件上传

    @WebServlet(
        name = "TicketServlet",
        urlPatterns = {"/tickets"},
        loadOnStartup = 1
    )
    @MultipartConfig(//告诉Web容器为该Servlet 提供文件上传支持。
        //location,告诉浏览器应该在哪里存储临时文件
        fileSizeThreshold = 5_242_880, // 5MB
        maxFileSize = 20_971_520L, // 禁止上传大小超过20MB 的文件,
        maxRequestSize = 41_943_040L // 禁止大小超过40MB 的请求
    )
    public class TicketServlet extends HttpServlet {
        ...
    }
    
    
  2. 接受文件上传

  3. 方法createTicket 将使用该方法和其他请求参数填充Ticket 对象, 调用另一个私有方法processAttachment将该对象添加到数据库中。

  4. 方法processAttachment将从multipart 请求中获得InputStream写入内存, 并将它复制到对象中。

private void createTicket(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    Ticket ticket = new Ticket();
    ticket.setCustomerName(request.getParameter("customerName"));
    ticket.setSubject(request.getParameter("subject"));
    ticket.setBody(request.getParameter("body"));

    Part filePart = request.getPart("file");
    if (filePart != null) {
        Attachment attachment = this.processAttachment(filePart);
        if (attachment != null) {
            ticket.addAttachment(attachment);
        }
    }

    int id;
    synchronized (this) {
        id = this.TICKET_ID_SEQUENCE++;
    }
    this.ticketDatabase.put(id, ticket);
    response.sendRedirect("tickets?action=view&ticketid=" + id);//将响应重定向到显示新创建的票据的页面,以便用户查看刚刚创建的票据。
}

private Attachment processAttachment(Part filePart) throws IOException {
    InputStream inputStream = filePart.getInputStream();//获取上传文件部分的输入流,用于读取文件内容。
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//将文件内容写入到内存中。
    int read;
    final byte[] bytes = new byte[1024];
    while ((read = inputStream.read(bytes)) != -1) {
        outputStream.write(bytes, 0, read);
    }
    Attachment attachment = new Attachment();
    attachment.setName(filePart.getSubmittedFileName());
    attachment.setContents(outputStream.toByteArray());
    return attachment;
}

多线程

Attachment:它定义了容器在拒绝客户端连接之前,队列中可以包含的最大连接数目。一旦出现可用线程,浏览器将从线程池中借出线程,并将请求传递给
线程,由线程进行处理。

保护共享资源
  • `private volatile int TICKET_ID_SEQUENCE = 1 ;``

    • volatile: 这个关键字用于修饰实例变量,表示该变量是“易变的”(volatile)。在多线程环境下,当一个线程修改了该变量的值,其他线程能够立即看到最新的值。
  • synchronized(this) {}
    	id = this. TICKET ID SEQUENCE++;
    	this. ticketDatabase.put(id, ticket) ;
    }
    

Filter

过滤器可以把对资源的请求拦截下来,从而实现一-些特殊的功能。比如权限控制、统一编码处理、敏感字符处理。

步骤:

  1. 创建maven工程,pom中导入tomcat和servlet
  2. 定义configurator为tomcat7:run
  3. 定义类,实现Filter接口,并重写其所有方法:
public class FilterDemo implements Filter {
    public void init(FilterConfig filterConfig) {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    }

    public void destroy() {
    }
}
  1. 配置Filter拦截资源的路径:在类上定义@WebFilter注解:
@WebFilter("/*")
public class FilterDemo implements Filter {
}
  1. 在doFilter方法中输出一句话,并放行:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    System.out.println("filter被执行了...");
    // 放行
    chain.doFilter(request, response);
}

FilterChain chain:这个参数用于调用过滤器链中的下一个过滤器或目标 Servlet。如果不调用这个方法,请求处理将会停止,当前过滤器之后将不会执行任何其他过滤器或 Servlet。

执行流程

image-20230806210445977

执行放行前逻辑->放行->访问资源->执行放行后逻辑

拦截路径配置

@WebFilter("/*")

  • 拦截具体的资源: /indexjsp:只有访问index.jsp时才会被拦截。
  • 目录拦截: /user/*:访问/user下的所有资源,都会被拦截
  • 后缀名拦截: *.jsp:访问后缀名为jsp的资源,都会被拦截
  • 拦截所有 /*:访问所有资源,都会被拦截

过滤器链

一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链image-20230806223344052

实例-登陆验证

  1. 搭好大框架:
    • 创建类,配置路径,写三个方法
    • 创建HttpServletRequest变量用于获取 HTTP 请求的特定信息,例如请求的参数、头部、URL 等。
  2. 判断访问的是否是登录相关资源
    • 是:放行
      1. 获取当前访问的资源路径
      2. 循环判断当前访问的资源路径中是否含有显示登录界面相关信息
    • 不是:进行登录验证
  3. 判断用户是否登录:
    1. 判断session中是否有user
    2. 判断user是否为null
    3. 判断是否登陆过
      • 登陆过放行
      • 没登陆过存储提示信息,跳转登陆页面
        req.getRequestDispatcher("/login.jsp").forward(req,response); forward() 方法,用于将请求转发到指定的目标资源。

Listener

对三个对象进行监听,即application(ServletContext)、session(HttpSession)和request(ServletRequest)。
当这些对象被创建、销毁或者在它们内部的属性被添加、修改或删除时,监听器会自动执行相应的代码。

监听器分类监听器名称作用
ServletContext监听器ServletContextListener用于对ServletContext对象进行监听(创建、销毁)
ServletContextAttributeListener对ServletContext对象中属性的监听(增删改属性)
Session监听器HttpSessionListener对Session对象的整体状态的监听(创建、销毁)
HttpSessionAttributeListener对Session对象中的属性监听(增删改属性)
HttpSessionBindingListener监听对象于Session的绑定和解除
HttpSessionActivationListener对Session数据的钝化和活化的监听
Request监听器ServletRequestListener对Request对象进行监听(创建、销毁)
ServletRequestAttributeListener对Request对象中属性的监听(增删改属性)

使用

  1. 定义类,实现 ServletContextListener 接口
public class ContextLoaderListener implements ServletContextListener {
    /**
     * ServletContext对象被创建: 整个web应用发布成功
     * @param sce
     */
    public void contextInitialized(ServletContextEvent sce) {
        // 在此处添加初始化代码
    }

    /**
     * ServletContext对象被销毁: 整个web应用卸载
     * @param sce
     */
    public void contextDestroyed(ServletContextEvent sce) {
        // 在此处添加资源释放代码
    }
}
  1. 在类上添加 @WebListener 注解
java
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    // 同上,此处省略内容
}
/ 在此处添加初始化代码
    }

    /**
     * ServletContext对象被销毁: 整个web应用卸载
     * @param sce
     */
    public void contextDestroyed(ServletContextEvent sce) {
        // 在此处添加资源释放代码
    }
}
  1. 在类上添加 @WebListener 注解
java
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    // 同上,此处省略内容
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值