操作環境IDEA
首先創建項目

創建完成后導入 java ee jar包

配置tomcat


修改TomCat的默認訪問頁面
<welcome-file-list>
<welcome-file>xx.html</welcome-file>
</welcome-file-list>
缺省的默認訪問頁面是index.html
也可以指定一個servlet來作為默認訪問頁面,前提是這個servlet可以推送一個網頁。
在src下創建 com.xx.control包,servlet一般放在control下。一個簡單的HttpServlet
package com.xx.control;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TwoServlet")
public class TwoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用戶名: "+ uname);
System.out.println("方法: " + mt);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mt = request.getMethod();
String uname = request.getParameter("uname");
System.out.println("用戶名: "+ uname);
System.out.println("方法: " + mt);
}
}
然后在web目錄下配置WEB-INF中的web.xml
<servlet>
<servlet-name>WYF</servlet-name>
<servlet-class>com.lh.control.OneServlet</servlet-class>
<load-on-startup>10</load-on-startup>
<!-- 設置為啟動tomcat時即加載該實例,數字越小 加載優先級越高 -->
<!-- tomcat 訪問期間,只會有一個servlet被實例化-->
</servlet>
<servlet-mapping>
<servlet-name>WYF</servlet-name>
<url-pattern>/wyf</url-pattern>
</servlet-mapping>
有四種路徑配置方法,當路徑沖突時,優先級為 具體 > 前置 > 通配 > 后置
<!-- 具體路徑請求-->
<url-pattern>/wyf</url-pattern>
<!-- 前置條件請求-->
<url-pattern>/wyf/*</url-pattern>
<!-- 后置條件請求-->
<url-pattern>*.do</url-pattern>
<!-- 通配符請求路徑-->
<url-pattern>/*</url-pattern>
Response
為了給用戶一個返回數據,我們需要使用HttpServletResponse
從相應對象獲取一個輸入流
通過輸入流將返回結果寫入到響應體中
關閉輸入流
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result = "Hello Java";
PrintWriter out = resp.getWriter();
out.println(result);
out.close();
}
}
中文會亂碼
還是因為默認的響應體編碼是 ISO的
需要指定編碼
resp.setCharacterEncoding("utf-8");
還可以指定ContentType。
resp.setContentType("text/html;charset=utf-8");
Cookie
Cookie ck = new Cookie("key", "value");
resp.addCookie(ck);
讀取cookie
Cookie[] cookies = req.getCookies();
不好的是要獲取key就只能循環出來,不能單獨讀取。后續學到了再來做補充。
Session
通過在cookie中存一個session_id來確認用戶身份。
session創建方法
HttpSession hs = req.getSession(); HttpSession hs = req.getSession(false); HttpSession hs = req.getSession(true);
getSession() 已有session則返回現有session,否則創建返回
getSession(true) 同上
getSession(false) 已有session則返回現有session,否則返回空
session保存數據
hs.setAttribute("key","value");
hs.getAttribute("key");
設置session的空閑時間
1)Tomcat中配置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<!-- 單位分鐘 --!>
2)Servlet中配置
hs.setMaxInactiveInterval(120); #單位秒
ServletContext
ServletContext其實就是全局作用域對象, 上下文環境對象
利用context可以實現對,當前網站中所有的Servlet共享數據
context對象只能由Tomcat負責創建,在tomcat啟動時創建,關閉時銷毀
只能有一個context singleton。
使用
1)從request中獲取
ServletContext application = req.getServletContext();
2)context中存放數據
1)在tomcat中存放
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</context-param>
2) 在servlet中存放
application.setAttribute("name", "silly B");
取
String name = (String) application.getAttribute("name");
注意事項
消耗的是服務器端的內存,所以不要隨意往里面放東西。
Post時編碼問題
<html>
<body>
<div>
<form action="/Sample01/wyf" method="get">
<label>用戶名: </label><input type="text" name="uname"/>
<input type="submit" value="get"/>
</form>
<form action="/Sample01/wyf" method="post">
<label>用戶名: </label><input type="text" name="uname"/>
<input type="submit" value="post"/>
</form>
</div>
</body>
</html>
使用post傳參時會發現,tomcat在console的輸出會亂碼
原因
瀏覽器采用【get】請求時,請求參數保存在【請求頭】,請求頭的內容是由tomcat負責的。Tomcat9 編碼集默認為 utf-8, 以前也是ISO-8859-1
瀏覽器采用【post】請求時,請求參數保存在【請求體】,請求體的內容是由請求對象負責的。編碼集默認為 ISO-8859-1
解決方法
設置request對象的編碼
request.setCharacterEncoding("utf-8");
必須在讀取內容前調用該方法.
Tomcat9以前的版本還需要修改Tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
讀取復選框的參數
String array[] = req.getParameterValues("hobby");
<form action="/Sample01/cbs" method="get">
<label>愛好: </label><input type="checkbox" name="hobby" value="1">吳亦凡<br>
<input type="checkbox" name="hobby" value="2">才徐坤<br>
<input type="checkbox" name="hobby" value="3">郭德綱<br>
<input type="submit"/>
</form>
測試結果

過濾器
創建
1.實現了Filter接口的實現類被認為是一個過濾器
2.重寫doFilter方法,來過濾請求
3.webxml中注冊過濾器通知tomcat
生命周期
啟動時創建,一個過濾器只有一個實例對象,關閉時銷毀。
public class myFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String age = servletRequest.getParameter("age"); if(Integer.valueOf(age)<18){ servletResponse.getWriter().println("too young"); }else { filterChain.doFilter(servletRequest, servletResponse); // 繼續下一個filter } }
}
web.xml
<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.lh.control.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/18x.jpg</url-pattern> //還有通配符 前置 后置的匹配模式
</filter-mapping>
應用:用filter設置編碼集。 控制未登錄用戶訪問頁面
監聽器
servlet中的監聽器專門用于監控域對象(request,session,context)
public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { }
@Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
web.xml中注冊
<listener>
<listener-class>com.lh.control.MyListener</listener-class>
</listener>

浙公網安備 33010602011771號