Java精品面試題來啦!附帶答案詳解

小夥伴們大家好啊!今天浙江優就業繼續為大家提供精品Java面試題啦~

Java精品面試題來啦!附帶答案詳解

1、Servlet 3中的異步處理指的是什麼?

答:在Servlet 3中引入了一項新的技術可以讓Servlet異步處理請求。有人可能會質疑,既然都有多線程了,還需要異步處理請求嗎?答案是肯定的,因為如果一個任務處理時間相當長,那麼Servlet或Filter會一直佔用著請求處理線程直到任務結束,隨著併發用戶的增加,容器將會遭遇線程超出的風險,這這種情況下很多的請求將會被堆積起來而後續的請求可能會遭遇拒絕服務,直到有資源可以處理請求為止。異步特性可以幫助應用節省容器中的線程,特別適合執行時間長而且用戶需要得到結果的任務,如果用戶不需要得到結果則直接將一個Runnable對象交給Executor並立即返回即可。

補充:多線程在Java誕生初期無疑是一個亮點,而Servlet單實例多線程的工作方式也曾為其贏得美名,然而技術的發展往往會顛覆我們很多的認知,就如同當年愛因斯坦的相對論顛覆了牛頓的經典力學一般。事實上,異步處理絕不是Serlvet 3首創,如果你瞭解Node.js的話,對Servlet 3的這個重要改進就不以為奇了。

下面是一個支持異步處理請求的Servlet的例子。

importjava.io.IOException; importjavax.servlet.AsyncContext; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = { "/async"}, asyncSupported = true) publicclassAsyncServletextendsHttpServlet{privatestaticfinallongserialVersionUID = 1L; @OverridepublicvoiddoGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException { // 開啟Tomcat異步Servlet支持req.setAttribute( "org.apache.catalina.ASYNC_SUPPORTED", true); finalAsyncContext ctx = req.startAsync(); // 啟動異步處理的上下文// ctx.setTimeout(30000);ctx.start( newRunnable() { @Overridepublicvoidrun() { // 在此處添加異步處理的代碼ctx.complete(); } }); } }

2、如何在基於Java的Web項目中實現文件上傳和下載?

答:在Sevlet 3 以前,Servlet API中沒有支持上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的文件,我們推薦使用Apache的commons-fileupload。

從Servlet 3開始,文件上傳變得無比簡單,相信看看下面的例子一切都清楚了。

上傳頁面index.jsp:

Select your photo and upload

${hint}

Photo file:

支持上傳的Servlet:

packagecom.jackfrued.servlet; importjava.io.IOException; importjavax.servlet.ServletException; importjavax.servlet.annotation.MultipartConfig; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.Part; @WebServlet( "/UploadServlet") @MultipartConfigpublicclassUploadServletextendsHttpServlet{privatestaticfinallongserialVersionUID = 1L; protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { // 可以用request.getPart()方法獲得名為photo的上傳附件// 也可以用request.getParts()獲得所有上傳附件(多文件上傳)// 然後通過循環分別處理每一個上傳的文件Part part = request.getPart( "photo"); if(part != null&& part.getSubmittedFileName().length() > 0) { // 用ServletContext對象的getRealPath()方法獲得上傳文件夾的絕對路徑String savePath = request.getServletContext().getRealPath( "/upload"); // Servlet 3.1規範中可以用Part對象的getSubmittedFileName()方法獲得上傳的文件名// 更好的做法是為上傳的文件進行重命名(避免同名文件的相互覆蓋)part.write(savePath + "/"+ part.getSubmittedFileName()); request.setAttribute( "hint", "Upload Successfully!"); } else{ request.setAttribute( "hint", "Upload failed!"); } // 跳轉回到上傳頁面request.getRequestDispatcher( "index.jsp").forward(request, response); } }

3、服務器收到用戶提交的表單數據,到底是調用Servlet的doGet()還是doPost()方法?

答:HTML的\

< %--靜態包含 --%> < %--動態包含 --%> < jsp:includepage= "..."> < jsp:param name= "..."value= "..."/> < /jsp:include>

4、Servlet中如何獲取用戶提交的查詢參數或表單數據?

答:可以通過請求對象(HttpServletRequest)的getParameter()方法通過參數名獲得參數值。如果有包含多個值的參數(例如複選框),可以通過請求對象的getParameterValues()方法獲得。當然也可以通過請求對象的getParameterMap()獲得一個參數名和參數值的映射(Map)。

5、Servlet中如何獲取用戶配置的初始化參數以及服務器上下文參數?

答:可以通過重寫Servlet接口的init(ServletConfig)方法並通過ServletConfig對象的getInitParameter()方法來獲取Servlet的初始化參數。可以通過ServletConfig對象的getServletContext()方法獲取ServletContext對象,並通過該對象的getInitParameter()方法來獲取服務器上下文參數。當然,ServletContext對象也在處理用戶請求的方法(如doGet()方法)中通過請求對象的getServletContext()方法來獲得。


分享到:


相關文章: