• Java学习----前端5


    Servlet

    Servlet 是一个用于扩展服务器端功能的服务器端组件技术
    • 运行在服务器端,所以调用执行是由服务器负责
      • web.xml中需要进行配置,就是将servlet和一个请求地址建立对应关系,当浏览器对地址 发起请求时,服务器则按照规则调用serlvet类中的方法
    • 服务器端的组件技术
      • 直接或者间接的实现Servlet接口
    • 用于扩展服务器端功能,可以实现动态网页的开发

    Servlet接口

    1 、定义类实现 Servlet 接口
    1. public class HelloServlet implements Servlet {
    2. //在Servlet类实例化后自动执行的方法,这个方法在servlet对象的整个生命周期中运行且只运
    3. 行一次。主要用于实现Servlet的初始化操作,例如读取配置文件中当前Servlet的初始化配置信息。
    4. 当服务器调用该方法时会将当前servlet的初始化配置存储在cnfig对象中
    5. public void init(ServletConfig config) throws ServletException {
    6. this.config=config; //缓存config对象
    7. }
    8. //用于供其它位置获取config对象时进行调用
    9. private ServletConfig config;
    10. public ServletConfig getServletConfig() {
    11. return config;
    12. }
    13. //在init方法执行后,服务器调用service方法用于生成针对客户端的响应信息。服务器采用多
    14. 线程的方式运行service方法,一个客户端请求对应一个线程。服务器调用service方法时会传入2个参
    15. 数对象,req用于封装客户端的请求信息,resp用于封装服务器的响应信息。Servlet默认采用单实例
    16. 多线程的方式对客户端浏览器请求提供服务,service执行完成后不会自动销毁,而是常驻内存
    17. public void service(ServletRequest req, ServletResponse resp) throws
    18. ServletException, IOException {
    19. }
    20. //一般供获取当前servlet对象的说明信息
    21. public String getServletInfo() {
    22. return "当前servlet对象的说明信息";
    23. }
    24. //在servlet对象销毁之前执行,用于进行资源回收。一个servlet对象在整个生命周期运行且只
    25. 运行一次。servlet对象默认是常驻内存,只有在服务器关闭或者内存严重不足而当前Servlet对象被
    26. GC机制选中时才会被销毁
    27. public void destroy() {
    28. }
    29. }
    2 、在 web.xml 中针对 servlet 类进行配置,将 servlet 和一个或者多个地址建立对应关系
    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    5. http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    6. id="WebApp_ID" version="4.0"> xml文件头用于说明当前xml文件的语法规则
    7. <servlet> 将servlet类和一个名称建立对应关系
    8. <servlet-name>helloservlet-name>
    9. <servlet-class>com.yan.action.HelloServletservlet-class>
    10. servlet>
    11. <servlet-mapping> 将一个servlet名称和请求地址建立对应关系
    12. <servlet-name>helloservlet-name>
    13. <url-pattern>/hello.dourl-pattern>
    14. servlet-mapping>
    15. web-app>

    servlet三生命周期

    • init
    • service
      • 单实例多线程的方式对外提供服务
      • 常驻内存
    • detroy

    Servlet开发

    • 直接实现Servlet接口
    • 抽象类GenericServlet用于非标准协议开发,例如游戏的服务器端
    • 抽象类HttpServletGenericServlet的子类,用于http协议应用开发,例如网站

    HttpServlet的运行原理

    1. public abstract class HttpServlet extends GenericServlet,针对Servlet接口的5
    2. 方法都提供了默认实现
    3. //按照Servlet的运行规则,服务器会调用service方法对外提供服务。
    4. protected void service(HttpServletRequest req, HttpServletResponse resp)
    5. throws ServletException, IOException {
    6. String method = req.getMethod(); //获取请求方法,http协议定义了7种请求,
    7. 例如get/post/put/delete,...
    8. if (method.equals(METHOD_GET)) { //如果请求方法为GET,则调用doGet方法进
    9. 行处理
    10. doGet(req, resp);
    11. } else if (method.equals(METHOD_HEAD)) {
    12. doHead(req, resp);
    13. } else if (method.equals(METHOD_POST)) {
    14. doPost(req, resp);
    15. } else if (method.equals(METHOD_PUT)) {
    16. doPut(req, resp);
    17. } else if (method.equals(METHOD_DELETE)) {
    18. doDelete(req, resp);
    19. } else if (method.equals(METHOD_OPTIONS)) {
    20. doOptions(req,resp);
    21. } else if (method.equals(METHOD_TRACE)) {
    22. doTrace(req,resp);
    23. } else {
    24. String errMsg =
    25. lStrings.getString("http.method_not_implemented");
    26. Object[] errArgs = new Object[1];
    27. errArgs[0] = method;
    28. errMsg = MessageFormat.format(errMsg, errArgs);
    29. resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    30. }
    31. }
    32. //针对不同的请求方法提供了对应的扩展点,运行子类进行覆盖定义
    33. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    34. throws ServletException, IOException {
    35. String protocol = req.getProtocol(); //获取请求协议,例如http
    36. String msg = lStrings.getString("http.method_get_not_supported");
    37. //根据参数获取默认的报错信息
    38. if (protocol.endsWith("1.1")) { 判断http协议的版本号,发送报错信息
    39. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    40. } else {
    41. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    42. }
    43. }

    Servlet初始化配置

    在服务器调用 Servlet init 方法时会传入一个 ServletConfig 对象,其中包含当前 Servlet 的所有初始化配置
    1. public void init(ServletConfig config) throws ServletException {}
    2. //GenericServlet中的方法实现
    3. public void init(ServletConfig config) throws ServletException {
    4. this.config = config; //缓存服务器提供的config对象
    5. this.init(); //提供扩展点
    6. }
    配置位于 web.xml 文件
    1. <servlet>
    2. <servlet-name>hello3servlet-name>
    3. <servlet-class>com.yan.action.Hello3Servletservlet-class>
    4. <init-param> 初始化参数,可以配置多个
    5. <param-name>rowsparam-name> 配置的参数名称
    6. <param-value>3param-value> 对应配置参数名称的配置值
    7. init-param>
    8. <init-param>
    9. <param-name>widthparam-name>
    10. <param-value>120param-value>
    11. init-param>
    12. servlet>
    servlet 中获取配置参数
    可以在 GenericServlet 提供的扩展点中获取配置参数
    
          
  • 相关阅读:
    带你学会指针进阶
    Mysql主从切换流程
    湖北2022农民丰收节 国稻种芯:麻城启动王忠林宣布活动
    网络框架重构之路plain2.0(c++23 without module) 综述
    QT+OSG/osgEarth编译之五十三:osgWidget+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5工具库osgWidget)
    Spring AOP案例:百度网盘密码数据兼容处理 与 SpringAOP总结
    gdb 常用命令
    【Flask从入门到精通:第一课:flask的基本介绍、flask快速搭建项目并运行】
    长沙驾考之路
    FreeRTOS入门教程(信号量的具体使用)
  • 原文地址:https://blog.csdn.net/hanxuya/article/details/128104724