ServletContext
簡介:
上一篇文章說到了Servlet的運行過程,裏面提到了在執行servlet中會創建一個Web容器來進行訪問和請求。
- Web容器在啓動時,它會爲每個Web應用程序都創建一個對象的ServletContext對象,它代表當前Web應用
- 多個Servlet通過ServletContext對象來實現數據共享
- 獲取Web應用的初始化參數
- 用ServletContext實現請求轉發
- 利用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>
- 提交測試
- 檢查英文提交情況,服務器是否接收成功!
- 提交中文,看看亂碼情況
- 設置編碼統一,解決亂碼問題;
運行服務器結果:
中間會有一個兩秒的刷新時間(截不到圖…)
重定向和轉發的異同:
-
重定向: 服務器告訴客戶端你應該請求另外一個地址; (地址欄會變)
resp.sendRedirect(“url”);
參數就是他要重定向的頁面 -
轉發: 服務器把這個請求轉向另外一個Servlet去處理; (地址欄不會變)
RequestDispatcher ,需要使用RequestDispatcher來進行處理,我們需要獲得這個類
req.getRequestDispatcher("/success.jsp").forward(req,resp);
參數就是他要轉發到的頁面