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的作用:
這幾個方法都是由容器去調用,我們自己去調用是無效的,
我們去來到源碼中的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.comGenericServlet是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等一系列操作:
側面也表現了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的理解(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曝三星Galaxy S23处理器调整:曾
- 下一篇: java美元兑换,(Java实现) 美元