• 学习servlet【续】


    Servlet的三生命周期

    Servlet的生命周期是由Servlet的容器来控制的,它可以分为3个阶段;初始化,运行,销毁。

    当客户端第一次请求Servlet时,Servlet被加载到内存中,容器会创建Servlet实例,并调用其init() 方法进行初始化工作

    容器创建请求对象和响应对象,然后调用Servletservice()方法为客户端提供服务

    Servlet不再被需要时,容器调用Servletdestory()方法将Servlet实例销毁。

    Servlet API

    直接实现Servlet接口,需要实现5个方法

    1. public interface Servlet {
    2. public void init(ServletConfig config) throws ServletException;
    3. //servlet对象创建后执行初始化操作,例如通过config读取配置信息
    4. public ServletConfig getServletConfig();
    5. //获取当前Servlet对象的相关 ServletConfig对象。ServletConfig对象用于封装当前Servlet对象的配置信息
    6. public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    7. //对外提供服务。Servlet针对多用户会采用单实例多线程的 方式对外提供服务
    8. public String getServletInfo();
    9. //获取当前Servlet的说明信息,一般供工具使用
    10. public void destroy();
    11. //在当前Servlet实例被GC回收前所运行的方法,一般用于资源回收
    12. }

    为了简化开发,所以Sun提供了一个通用抽象父类GenericServlet。针对大部分方法提供了默认的空实现,只需要Servlet提供service方法的实现即可,一般用于非通用协议开发中。采用的是适配器模式

    1. public class Hello3Servlet extends GenericServlet {
    2. @Override
    3. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    4. }
    5. }
    为了进一步简化开发,提供针对 http 协议的支持, Sun 提供了一个 GenericServlet 的子类 HttpServlet ,这个父类专门用于 http 协议的应用开发中,是模板模式
    1. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    2. String method = req.getMethod(); //获取客户端的请求方法,例如get/post之类
    3. if (method.equals(METHOD_GET)) { //如果是GET请求则调用doGet方法
    4. ...
    5. doGet(req, resp); //转向调用自己的doGet方法
    6. } else if (method.equals(METHOD_HEAD)) {
    7. doHead(req, resp);
    8. } else if (method.equals(METHOD_POST)) {
    9. doPost(req, resp);
    10. } else if (method.equals(METHOD_PUT)) {
    11. doPut(req, resp);
    12. } else if (method.equals(METHOD_DELETE)) {
    13. doDelete(req, resp);
    14. } else if (method.equals(METHOD_OPTIONS)) {
    15. doOptions(req,resp);
    16. } else if (method.equals(METHOD_TRACE)) {
    17. doTrace(req,resp);
    18. } else { //如果是其它请求方法则报错
    19. String errMsg = lStrings.getString("http.method_not_implemented");
    20. Object[] errArgs = new Object[1];
    21. errArgs[0] = method;
    22. errMsg = MessageFormat.format(errMsg, errArgs);
    23. resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    24. }
    25. }
    默认的 doGet 方法实现
    1. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    2. String protocol = req.getProtocol(); //获取请求所使用的协议,例如http/1.1
    3. String msg = lStrings.getString("http.method_get_not_supported");
    4. if (protocol.endsWith("1.1")) {
    5. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    6. } else {
    7. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    8. }
    9. }

    ServletConfig对象

    对应的是Servlet的配置参数信息,由服务器提供对应的具体实现。具体实现是在服务器调用init方法时传入到Servlet实例中。例如init()init(ServletConfig config)

    config对象由服务器提供实现,并在服务器调用该方法时传入Servlet实例

    1. public interface ServletConfig {
    2. public ServletContext getServletContext();
    3. //用于获取Servlet上下文对象
    4. public String getInitParameter(String name);
    5. //用于获取当前Servlet对象的配置 参数
    6. public Enumeration getInitParameterNames();
    7. //用于获取当前Servlet对象 的所有配置参数的迭代器
    8. }

    response响应

    ServletResponse对象用于封装服务器的响应信息

    设置响应头:

     request请求

    ServletRequest对象是在servlet接口中所定义的service方法中出现

    1. public void service(ServletRequest req, ServletResponse res)
    2. throws ServletException, IOException;
    ·用于封装客户端的请求信息
    ·是由服务器提供对应的实现类

    jspSmartUpload

    文件上传下载组件,是由jspsmart.com开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的 JSP 文件中

    1、使用简单。在 JSP 文件中仅仅书写三五行 JAVA 代码就可以搞定文件的上传或下载,方便

    2、能全程控制上传。利用 jspSmartUpload 组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。

    3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件

    4、下载灵活。仅写两行代码,就能把 Web 服务器变成文件服务器。不管文件在 Web 服务器的目录下或在其它任何目录下,都可以利用 jspSmartUpload 进行下载

  • 相关阅读:
    SpringMVC | SpringMVC中的 “数据绑定”
    黑客是什么?想成为黑客需要学习什么?
    Java 内部类
    前端页面设计 | 博客系统
    内核开发-同步场景与概念
    深圳台电:联合国的“沟通”之道
    碎片笔记 | 大模型攻防简报
    go 模板 ——动态数据和静态数据结合
    Python入门基础知识新手必备(赶紧收藏)
    JC/T 1062-2022 泡沫混凝土砌块检测
  • 原文地址:https://blog.csdn.net/qq_51074048/article/details/126192017