JavaWeb 基礎面試


1. 啟動項目時如何實現不在鏈接里輸入項目名就能啟動?  

  修改Tomcat配置文件 server.xml。找到自己的項目配置 :

<Context docBase="oneProject" path="/one Project" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

 

  改為如下配置:

<Context docBase="oneProject" path="/" reloadable="true" source="org.eclipse.jst.jee.server:userManager"/>

   經過這樣的修改,項目就可以在啟動服務器后不用輸入項目訪問了。

2.  1分鍾之內只能處理1000個請求,你怎么實現,手撕代碼?

  我知道的有兩種方式可以實現:

    a). Application 對所有用戶訪問的次數計數。同時定義一個計時器,單位為一分鍾。如果Application 中的用戶在單位時間內超出請求次數,就拒絕處理該請求。一分鍾再刷新application的值為0.

      使用一個Map 維護變量:

// 泛型 String 表示用戶標識,List中存放用戶不同請求的時間戳。
private Map<String, List<Long>> map = new ConcurrentHashMap<>();

 

    我們只需要在單位計數中判斷 List中數量是否超出限制即可。

    b). 使用 aop 實現請求的限制,在需要限制的請求方法上加上 aop 邏輯。即可實現,思路如下:

      自定義注解類實現請求限制的攔截邏輯,在需要限制的方法上使用注解,超出限制后拒絕處理請求。

3. 什么時候用assert

  在開發和測試過程中,很多時候我們需要對某些場景進行判斷,當這個判斷滿足我們預期的答案,才繼續往下執行,否則提出程序或者發出警告。assert就是這樣的功能,滿足判斷時返回true,否則返回false。但是真正到系統上線的時候,這些assert是不要使用的。

4.  java 應用服務器有哪些?

  Java 的應用服務器很多,從功能上分為兩大類,JSP 服務器和 Java EE 服務器,也可分其他小類。相對來說 Java EE 服務器的功能更加強大。我平時就用Tomcat。

JSP 服務器有 Tomcat 、Bejy Tiger 、Geronimo 、 Jetty 、Jonas 、Jrun 、Orion 、 Resin
Java EE 服務器有 TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、 JBoss、開源 GlassFish。(來源自百度百科)
 
5. 說一說四種會話跟蹤技術。
a).表單隱藏域
  
<input type="hidden" id="xxx" value="xxx">

 在表單的提交中,加入這樣一段數據提交的隱藏域,用戶在輸入時是看不到的,但是可以通過查看網頁源代碼來看到,在服務端只能通過post的方式獲取參數。這種方式在禁用Cookie的情況下也能工作,但是關閉瀏覽器后就會失效。

b).URL重寫
http://www.XXX.com/news?id=xxxx

 

在提交請求的URL后面加上請求需要的參數,常見的GET的請求。安全性能不高,參數可以在地址欄中看到,而且對於參數的長度有限制(1024字節),禁用Cookie的情況下也能使用,但是關閉瀏覽器后就會失效。
 
c).Cookie
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
        
        // 新建一個Cookie
        Cookie cookie = new Cookie("name", "pwd");
        // 設置Cookie的生命周期
        cookie.setMaxAge(Integer.MAX_VALUE);
        // 將Cookie發送到客戶端
        resp.addCookie(cookie);
        
        // Cookie的修改,創建一個和已有的cookie同名,然后再添加到客戶端,自動修改
        Cookie secCookie = new Cookie("name", "newPwd");
         resp.addCookie(secCookie); // cookie修改
         
         // cookie的刪除, 創建一個和已有的cookie同名,並設置maxAge為0,添加到客戶端,就會自動刪除
         Cookie thirCookie = new Cookie("name", "thirPwd");
         thirCookie.setMaxAge(0); // 修改生命周期為0
         resp.addCookie(thirCookie);  // 刪除客戶端cookie
    }
Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。 客戶端瀏覽器會把Cookie保存起來,並由瀏覽器通過域名管理不同網站的Cookie。
 
除了以上的Cookie屬性之外,還寫一些常用的屬性,可以根據實際的需求設置。
d).Session
Session代表服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。在Servlet中,session指的是HttpSession類的對象。
  Session創建時間的誤解:一般的誤解是Session在客戶端訪問的時候就會被創建,但其實 Session 的真正創建時機是 服務端程序調用 HttpServletRequest.getSession(true) . 我們知道JSP中有個內置對象是session,其實那是因為在我們編寫的JSP代碼中,默認有這么一句:HttpSession session = HttpServletRequest.getSession(true);在將JSP編譯為Servlet代碼的時候,Session就會被創建。但是Session會占用服務器的內存,因此我們不需要的時候,最好將該屬性置false。  <% @page session=”false”%>。

  但客戶端訪問.html 等靜態資源時,不涉及將JSP編譯為Servlet,因此Session不會創建。當客戶端第一次訪問JSP頁面時,服務器端將創建一個Session並保存在內存中,同時為客戶端返回一個sessionID,以供客戶端下次請求應用的時候帶着sessionID來表明自己的身份。一次會話一個Session,Session通過sessionID來唯一標識。同時Session默認是在服務器的內存中維護的(雖然我們可以通過技術將session持久化),因此Session的長度不宜太大(雖然本身沒有長度限制)。

  Session原理:因為http是無狀態的連接,Session也不能根據連接來識別是否是同一次會話,因此客戶端第一次請求JSP/Servlet之后,服務端會自動生成一個名叫JSESSIONID的Cookie,該Cookie的值就是sessionID,發送到客戶端,客戶端再次連接的時候,會自動帶上這個JSESSIONID,找到相應的session。如果客戶端端禁用了Cookie,那么這個JSESSIONID會通過URL重寫發送到服務端。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: JSESSIONID=819B75C412FB029EDEF52B11484A642B
Host: localhost:8080
Referer: http://localhost:8080/market/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36

 


  

  Session的生命周期:

  它的生命周期不累加的,而Cookie的生命周期是累加的,不累加的意思就是Session的計時是從最近一次訪問開始的,而Cookie是從開始到結束,無論你期間是否使用。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
        
        // 真正的創建一個Session
        HttpSession session = req.getSession(true);
        // 設置Session的生命周期
        session.setMaxInactiveInterval(Integer.MAX_VALUE);
  }

 

  Session相關的屬性:

6. 講講Request對象的主要方法 

 

序號  方法簡述
1 Cookie[] getCookies()
返回一個數組,包含客戶端發送該請求的所有的 Cookie 對象。
2 HttpSession getSession(boolean create)
返回與該請求關聯的當前 HttpSession,或者如果沒有當前會話,且創建是真的,則返回一個新的 session 會話。
3 Enumeration getParameterNames()
返回一個 String 對象的枚舉,包含在該請求中包含的參數的名稱。
4 Object getAttribute(String name)
以對象形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。
5 String getCharacterEncoding()
返回請求主體中使用的字符編碼的名稱。
6 String getMethod()
返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。
7 String getParameter(String name)
以字符串形式返回請求參數的值,或者如果參數不存在則返回 null。
8 String getRemoteHost()
返回發送請求的客戶端的完全限定名稱
9 String getRemoteAddr()
返回發送請求的客戶端的互聯網協議(IP)地址
10 String getRemoteHost()
返回發送請求的客戶端的完全限定名稱。

7.過濾器有哪些作用和用法?

過濾器的常見用途:

a).對用戶的請求進行統一的認證、對訪問的請求進行記錄和審核

b).對用戶傳輸的數據過濾和替換,轉換圖像格式,對響應內容進行壓縮,減少網絡傳輸

c).對用戶的請求和響應進行加密處理

d).觸發資源訪問事件

Filter工作流程:

 

 

 

 

 

 

 

 

 

 

 

 

和 Filter相關的接口定義:

// 編寫一個Filter需要 實現這個接口
public interface Filter {
    
    // 初始化Filter
    public default void init(FilterConfig filterConfig) throws ServletException {}

    // Filter的邏輯實現,如果有多個Filter,必須在末尾執行 chain.doFilter(req, resp);
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

    // 過濾器的銷毀過程,可用於關閉該過濾器中打開的資源
    public default void destroy() {}
}

// 當有多個過濾器連成一串的時候,知道真正的請求資源之前的一系列過濾
public interface FilterChain {

    public void doFilter(ServletRequest request, ServletResponse response)
            throws IOException, ServletException;

}

// 過濾器的配置相關
// 做Filter初始化的時候,作為參數傳入,初始化關於過濾器的配置
public interface FilterConfig {

    public String getFilterName();

    public ServletContext getServletContext();

    public String getInitParameter(String name);

    public Enumeration<String> getInitParameterNames();

}

 

注意事項: Filter 的執行順序是在 web.xml 中定義的順序,在多個Filter中的chain 中,一定在處理完當前Filter的邏輯之后,調用chain.doFilter(request, response) 轉到下一個Filter

 簡單例子:

/**
 * 實現字符編碼過濾的過濾器
 * @author ytuan
 *
 */
public class FilterTest implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        chain.doFilter(req, resp);
    }

}

 

8.請談談你對Javaweb開發中的監聽器的理解?

監聽器示意圖:

JavaWeb中的監聽器按照事件源分為三大類:作用范圍由大而小

a).ServletContext (針對整個應用程序上下文)

b).HttpSession (針對單個用戶會話)

c).ServletRequest (針對某一次ServletRequest )

針對這以上這三種不同作用域的對象,又把對象本身的事件類型分為三種:  

a).域對象自身的創建和銷毀事件監聽

b).域對象中屬性的增刪事件監聽

c).監聽綁定到HttpSession域中某個對象的狀態事件監聽

這里的對象創建和銷毀包括三個,域對象中屬性的增刪包括ServletContext 和 ServletRequest 兩個對象。需要重點注意一下HttpSession綁定的對象,它不同於前兩者。

  保存在Session域中的對象可以有多種狀態:綁定(session.setAttribute("bean",Object))到Session中;從 Session域中解除綁定(session.removeAttribute("bean"));隨Session對象持久化到一個存儲設備中;隨Session對象從一個存儲設備中恢復
  Servlet 規范中定義了兩個特殊的監聽器接口"HttpSessionBindingListenerHttpSessionActivationListener"來幫助JavaBean 對象了解自己在Session域中的這些狀態: ,實現這兩個接口的類不需要 web.xml 文件中進行注冊

  a). HttpSessionBindingListener接口

    實現了HttpSessionBindingListener接口的JavaBean對象可以感知自己被綁定到Session中和 Session中刪除的事件
    當對象被綁定到HttpSession對象中時,web服務器調用該對象的void valueBound(HttpSessionBindingEvent event)方法
    當對象從HttpSession對象中解除綁定時,web服務器調用該對象的void valueUnbound(HttpSessionBindingEvent event)方法

  b).HttpSessionActivationListener接口

    實現了HttpSessionActivationListener接口的JavaBean對象可以感知自己被活化(反序列化)和鈍化(序列化)的事件
    當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被鈍化(序列化)之前,web服務器調用該javabean對象的void sessionWillPassivate(HttpSessionEvent event) 方法。這樣javabean對象就可以知道自己將要和HttpSession對象一起被序列化(鈍化)到硬盤中.
    當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被活化(反序列化)之后,web服務器調用該javabean對象的void sessionDidActive(HttpSessionEvent event)方法。這樣javabean對象就可以知道自己將要和 HttpSession對象一起被反序列化(活化)回到內存中  (此處參考:https://www.cnblogs.com/xdp-gacl/p/3969249.html

9.說說web.xml文件中可以配置哪些內容?

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <!-- 配置web引用程序中Servlet上下文的初始化參數 -->
    <context-param>
        <param-name>name</param-name>
        <param-value>ytuan996</param-value>
    </context-param>

    <!-- 當程序中發生錯誤時,跳轉到哪一個頁面。這里的錯誤可以是異常,也可以是錯誤碼,但是只能是其中之一 -->
    <error-page>
        <exception-type></exception-type>
        <error-code>500</error-code>
        <location>error.jsp</location>
    </error-page>
    <!-- 配置自己定義的過濾器 -->
    <filter>
        <!-- 還可以在這里定義過濾器的自定義參數 -->
        <init-param>
            <param-name></param-name>
            <param-value></param-value>
        </init-param>
        <filter-name></filter-name>
        <filter-class></filter-class>
    </filter>

    <!-- 過濾器的規則 -->
    <filter-mapping>
        <filter-name></filter-name>
        <url-pattern></url-pattern>
    </filter-mapping>

    <!-- 監聽器 -->
    <listener>
        <listener-class></listener-class>
    </listener>

    <!-- 配置Servlet -->
    <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
    </servlet>

    <!-- 配置Servlet的請求路徑 -->
    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>

    <!-- 配置訪問應用的歡迎頁面,一般是首頁面 -->
    <welcome-file-list>
        <welcome-file></welcome-file>
    </welcome-file-list>


</web-app>

 

10.請談談JSP有哪些內置對象?作用分別是什么?

 

11.說一下表達式語言(EL)的隱式對象及其作用

 

12.JSP中的靜態包含和動態包含有什么區別?

  

 
 
 
 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM