ServletContext、Request、Response應用

ServletContext

簡介:
上一篇文章說到了Servlet的運行過程,裏面提到了在執行servlet中會創建一個Web容器來進行訪問和請求。

  1. Web容器在啓動時,它會爲每個Web應用程序都創建一個對象的ServletContext對象,它代表當前Web應用
  2. 多個Servlet通過ServletContext對象來實現數據共享
  3. 獲取Web應用的初始化參數
  4. 用ServletContext實現請求轉發
  5. 利用ServletContext對象讀取資源文件

通過ServletContext來實現數據共享
在這裏插入圖片描述

ServletContext示例:

需求:兩個servlet之間通過ServletContext實現數據共享
實現代碼:

servlet01如下:(如何導包,上上篇博客圖解的很清楚)
public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//這裏對請求和響應都進行編碼格式的設定(如果不設定,使用中文有可能會發生亂碼)
    	//請求設定爲utf-8
    	request.setCharacterEncoding("utf-8");
    	//響應也設定爲utf-8
    	response.setCharacterEncoding("utf-8");
        //通過servlet對象可以獲取一個ServletContext;
        ServletContext context = this.getServletContext();
        String username = "暮凌寒雪";//可以通過JDBC去讀取;
        //setAttribute :設置一個屬性;(屬性名,屬性值)
        context.setAttribute("name",username);
       //將其輸出在servlet的web頁面
        response.getWriter().print("設置name成功:"+username);
    }
}
servlet02如下:
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//請求編碼格式設定爲utf-8
    	req.setCharacterEncoding("utf-8");
    	//響應編碼格式設定爲UTF-8
    	resp.setCharacterEncoding("utf-8");
		//獲取ServletContext對象
        ServletContext context = this.getServletContext();
        //原本這裏是Object對象,因爲我們爲開發者,知道servlet01傳過來的是string對象,因此這裏對其進行設定爲String對象,並進行了強轉
        String name = (String) context.getAttribute("name");
        //將收到的信息打印在Servlet的web頁面中
        resp.getWriter().print("我們獲取到的ServletDemo01信息爲:"+name);
    }
}
web.xml配置如下:(每行的意思在之前博客上也有很詳細的解釋)
<servlet>
        <servlet-name>servlet01</servlet-name>
        <servlet-class>com.pzy.servlet.ServletDemo01</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>servlet02</servlet-name>
        <servlet-class>com.pzy.servlet.ServletDemo02</servlet-class>
    </servlet>
    <!--=====================================================-->
    <servlet-mapping>
        <servlet-name>servlet01</servlet-name>
        <url-pattern>/q1</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>servlet02</servlet-name>
        <url-pattern>/q2</url-pattern>
    </servlet-mapping>

結果:
在這裏插入圖片描述
在這裏插入圖片描述

Request

public class RequestDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //查看request對象的方式
        System.out.println(request.getContextPath()); //獲得web項目路徑
        System.out.println(request.getRequestURI()); //請求的URL路徑
        //Remote 遠程
        System.out.println(request.getRemoteUser()); //獲得遠程的用戶名
        System.out.println(request.getRequestedSessionId()); //獲得SessionId;
        System.out.println(request.getServletPath()); //請求servlet的url
        System.out.println(request.getLocalAddr()); //獲得本地地址  防火牆
        System.out.println(request.getLocalName()); //獲得本地名字
        System.out.println(request.getLocalPort()); //獲得訪問的端口號
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

在這裏插入圖片描述

Request和Response示例

需求:Request對象接收前端用戶提交的參數

1.編寫前端註冊頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>註冊</title>
</head>
<body>
<h1>註冊</h1>
<form action="${pageContext.request.contextPath}/register" method="post">
    <p>
        <%-- 控件必須有name屬性,因爲Servlet要通過name才能接收到用戶輸入的信息 --%>
        用戶名:<input type="text" name="username">
    </p>
    <p>
        密碼:<input type="password" name="password">
    </p>
    <p>
        愛好 :
        <input type="checkbox" name="hobby" value="girl">女孩
        <input type="checkbox" name="hobby" value="code">代碼
        <input type="checkbox" name="hobby" value="movie">電影
        <input type="checkbox" name="hobby" value="music">音樂
    </p>
    <p>
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </p>
</form>
</body>
</html>
2.寫處理前端提交信息的Servlet如下:
public class FormServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //處理亂碼
        req.setCharacterEncoding("UTF-8");
        //處理前端的請求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("接收到的用戶名:"+username+"\n密碼:"+password+"\n愛好:");
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //請求轉發
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        /*
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
        requestDispatcher.forward(req,resp);
        */
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //睡眠兩秒,觀察其轉發的過程
    }
}
3.web.xml文件配置如下:
<servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>com.kuang.servlet.FormServlet1</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
  1. 提交測試
  • 檢查英文提交情況,服務器是否接收成功!
  • 提交中文,看看亂碼情況
  • 設置編碼統一,解決亂碼問題;

運行服務器結果:
在這裏插入圖片描述
中間會有一個兩秒的刷新時間(截不到圖…)
在這裏插入圖片描述
重定向和轉發的異同:

  • 重定向: 服務器告訴客戶端你應該請求另外一個地址; (地址欄會變)
    resp.sendRedirect(“url”);
    參數就是他要重定向的頁面

  • 轉發: 服務器把這個請求轉向另外一個Servlet去處理; (地址欄不會變)
    RequestDispatcher ,需要使用RequestDispatcher來進行處理,我們需要獲得這個類
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
    參數就是他要轉發到的頁面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章