日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

發布時間:2023/12/10 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在開發中無時無刻都在與Servlet進行接觸,只是因為框架的封裝性,我們很少直接地去操作servlet,但再怎么封裝,基本的思路都不會變化,變得只是實現的方式,

Servlet是什么:

網上的回答基本是Servlet是Java類,用于處理業務邏輯,

詳細一點說Servlet確實是Java類,他是在Tomcat包中的,我們知道Tomcat是服務器,他為我們封裝Request和Response,我們只需要實現Servlet接口就可以拿到封裝好的Request和Response對象,是不是很方便呢,那么Servlet起到的作用就是在拿到封裝好的Request后進行業務邏輯處理,然后返回Response,Servlet的整個生命周期由Tomcat控制,

因此,通過這個就能很好的實現開發業務邏輯與Http封裝的解藕,開發也會更加高效,

Servlet的作用:

我們可以通過頂層接口來分析Servlet的作用:

這幾個方法都是由容器去調用,我們自己去調用是無效的,

  • init,這個接受一個容器幫我們封裝好的ServletConfig,然后保存到本地
  • getServletConfig返回先前保存到本地的ServletConfig
  • getServletInfo返回一些version或者author等信息
  • service接受請求對象,用作開發人員業務處理,完畢后返回響應對象
  • destroy,容器銷毀servlet
  • 我們去來到源碼中的GenericServlet,看看他是怎樣為我們去實現的:

    public abstract class GenericServlet implements Servlet, ServletConfig{private transient ServletConfig config;@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;this.init();}@Overridepublic String getInitParameter(String name) {return getServletConfig().getInitParameter(name);}@Overridepublic abstract void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;@Overridepublic ServletConfig getServletConfig() {return config;} }

    這里截取了部分方法實現,可以看到,使用了模板方法模式,

    反正我手長:模板方法模式?zhuanlan.zhihu.com

    GenericServlet是abstract類,你可以很經常地在abstract類中看見這種設計,

    另外還有一個HttpServlet,

    它的注釋讓我們不要去實現service方法,因為他已經為我們封裝了請求分發的邏輯,比如判斷一個請求是get還是post,然后分發到具體的方法上去,

    if (method.equals(METHOD_GET)) {doGet(req, resp);} else if (method.equals(METHOD_HEAD)) {doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req,resp);} else {//// Note that this means NO servlet supports whatever// method was requested, anywhere on this server.//String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}

    我們需要實現的是doGet、doPost這些方法,在里面寫我們的業務邏輯,這里又有模板方法模式的身影


    Servlet有兩個息息相關的類,

    ServletContext和ServletConfig,

    對應JSP中九大作用域中的application和config對象,本質是用于做數據分享,

    ServletContext:

    Web應用有且僅有一個ServleContext,在應用起動的時候會被創建,他可以實現應用內的數據共享,

    但是僅限單機版的應用程序,因為他僅僅是保存在一個JVM創建的上下文中,如果是分布式的,那建議使用數據庫、session或者其他組件來代替

    ServletConfig:

    /*** A servlet configuration object used by a servlet container to pass* information to a servlet during initialization.*/

    用于容器向Servlet傳遞信息,

    在ServletConfig和ServletContext都有getInitParameter方法, 這兩個方法的都能從web.xml中獲取參數,但是是有區別的。

    可以在xml中配置,

    <!-- 通過ServletContext#getInitParameter獲取 --> <context-param><param-name>test</param-name><param-value>ServletContext</param-value></context-param><servlet><servlet-name>testServletConfig</servlet-name><servlet-class>com.web.test.TestServletConfig</servlet-class><!-- 通過ServletConfig#getInitParameter獲取 --> <init-param><param-name>testServletConfig</param-name><param-value>getFromServletConfig</param-value></init-param><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param></servlet>

    如何獲得ServletContext和ServletConfig:

    ServletConfig:可以通過Servlet#getServletConfig獲取,該方法就在Servlet中,Servlet是在ServletContext初始化之后才初始化(Servlet可以在Web應用啟動或者發送請求的時候初始化,這要看load-on-startup的配置,當這個值>=0(相反為不配置或者<0)時,Web應用啟動的時候就會初始化),Servlet初始化之后你才能獲得ServletConfig。

    ServletContext:在web.xml中讀取到<context-param>的時候就會創建ServletContext,然后將<context-param>中的值(配置文件的地址)塞到ServletContext中,

    所以理論上來說,這一步之后,Web容器中的內容都能獲取ServletContext了,就看源碼設計者覺得哪個地方需要就提供一個方法,然后Tomcat啟動的時候會負責調用方法或者注入ServletContext等一系列操作:

  • 實現WebApplicationInitializer接口
  • 注冊監聽器,實現ServletContextListener
  • ServletConfig#getServletContext
  • ServletRequest#getServletContext
  • HttpSession#getServletContext
  • 側面也表現了ServletContext和ServletConfig的作用范圍,

    還有一個有意思的點,你只要是在能獲取到ServletContext的地方,你就可以通過ServletContext#setAttribute來設置值,這個操作對整個Web應用都可見,不需要返回ServletContext,因為我前面說過Web應用有且僅有一個ServleContext,出現的地方都是傳遞的引用:


    JavaWeb項目中有一個WEB-INF的文件夾,可以放置一些不能被客戶端直接訪問的數據,但不能被客戶端訪問并不代表不能被訪問,實際上可以通過Servlet映射或則重定向來訪問,

    RequestDispatcher rd = request.getRequestDispatcher("./WEB-INF/view/a.jsp"); rd.forward(request, response);<servlet><servlet-name>Customer</servlet-name><jsp-file>/WEB-INF/customer.jsp</jsp-file> </servlet> <servlet-mapping><servlet-name>Customer</servlet-name><url-pattern>/User</url-pattern> </servlet-mapping>

    總結

    以上是生活随笔為你收集整理的servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。