目錄
一、知識點
二、例子
2.1 例1 擷取請求參數
2.1.1 代碼
2.1.2 測試結果
2.2 例2 根據請求參數的名字,傳回請求參數對應的字元串數組
2.2.1 在index.jsp編寫表單
2.2.2 修改Login.java代碼
2.2.3 測試結果
2.3 例3 請求參數傳回枚舉及Map對象
2.3.1 在Login.java添加代碼
2.3.2 測試結果
三、HttpServletRequest(ServletReques子接口)
3.1 例子:擷取用戶端的URI
3.1.1 實作代碼
3.1.2 測試結果
本章講的是servet請求,也比較重要的章節,ServletRequest看名字就知道是處理請求的。
一、知識點
如何在Serlvet中擷取請求資訊:
1.Servlet 的service()方法用于應答請求:因為每次請求都會調用service()方法
public void service(ServletRequest request, ServletResponse response )
throws ServletException, IOException
ServletRequest:封裝了請求資訊。可以從中擷取到任何的請求資訊。
ServletResponse:封裝了響應資訊,如果想給使用者什麼響應,具體可以使用該接口的方法實作.
這兩個接口的實作類都是伺服器給予實作的,并在伺服器調用service方法時傳入。
2.ServletRequest: 封裝了請求資訊。可以從中擷取到任何的請求資訊。
1)擷取請求參數:
String getParameter(string name):根據請求參數的名字,近回參數值。
若請求參數有多個值(例如checkbox),該方法隻能擷取到第一個送出的值。
String[] getParametervalues(string name): 根據請求參數的名字,近回請求參數對應的字元串數組。
Enumeration getParameterNames():傳回參數名對應的Enumeration對象,
類似于Serv1etConfig(或ServletContext)的getInitParameterNames()方法。
Map getParameterMap(): 傳回請求參數的鍵值對: key: 參數名, value: 參數值, String 數組類型。
2)擷取請求的URL:
HttpServletRequest httpServletRequest = (HttpServ1etRequest) request;
String requestURI = httpServ1etRequest.getRequestURI();
System.out.println(requestURI); // /day_ 29/1oginServ1et
3)擷取請求方式:
String method = httpServletRequest.getMethod();
System.out.print1n(method); //GET
4)若是-一個GET請求,擷取請求參數對應的那個字元串,即?後的那個字元串.
String queryString = httpServletRequest.getQueryString();
//user=hua&password=123456&interesting=game&interesting=par
System.out.print1n(querystring);
5)擷取請求的Serlvet的映射路徑
String servletPath = httpServletRequest.getServletPath(); System.out.print1n(servletPath); // /loginServ1et
6)和attribute相關的幾個方法;
3. HttpServletRequest:是SerlvetRequest的子接口。針對于HTTP請求所定義。裡邊包含了大量擷取HTTP請求相關的方法。
更多友善請檢視https://javaee.github.io/javaee-spec/javadocs/中的ServletRequest接口
二、例子
下面所有例子都一樣,src下建立一個Login類并繼承Servlet接口,原始代碼如下:
import javax.servlet.*;
import java.io.IOException;
public class Login implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xm配置添加一個路由映射,如下:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
整個web.xlm配置如下:這個配置包括了上一章的web.xml配置
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>t1</servlet-name>
<servlet-class>T1</servlet-class>
<!-- 在<servlet>下面是它的二級配置-->
<init-param>
<param-name>user</param-name>
<param-value>hua</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<!-- 這個是在<servlet>外面,不是它的二級配置-->
<context-param>
<param-name>ctx</param-name>
<param-value>this is context-param value </param-value>
</context-param>
<servlet-mapping>
<servlet-name>t1</servlet-name>
<url-pattern>/t1</url-pattern>
</servlet-mapping>
2.1 例1 擷取請求參數
string getParameter(String name): 根據請求參數的名字,傳回參數值。
若請求參數有多個值(例如checkbox),該方法隻能擷取到第一個送出的值。
2.1.1 代碼
Login.java其中一個代碼修改如下:
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);
}
2.1.2 測試結果
根據HTML知識,要用Get方式傳參用“?參數名=值”或“?參數名1=值1&參數名2=值2..”
打開浏覽器尾部添加 “/login?user=hua&pwd=123”,我這裡是
http://localhost:8080/myservlet_war_exploded/login?user=hua&pwd=123
看到空白頁之後,再檢視ide輸出視窗為:
2.2 例2 根據請求參數的名字,傳回請求參數對應的字元串數組
什麼情況下才傳回 數組呢?多選就是了
String[] getParameterValues(String name):根據請求參數的名字,傳回請求參數對應的字元串數組。
2.2.1 在index.jsp編寫表單
在index.jsp編寫表單,代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>測試</title>
</head>
<body>
<form action="login" method="post">
user: <input type="text" name="user" />
pwd: <input type="password" name="pwd" />
<br>
愛好:<br>
<input type="checkbox" name="interesting" value="reading" />閱讀
<input type="checkbox" name="interesting" value="game" />遊戲
<input type="checkbox" name="interesting" value="party" />派對
<input type="checkbox" name="interesting" value="shopping" />購物
<input type="checkbox" name="interesting" value="sport" />體育
<input type="checkbox" name="interesting" value="TV" />電視<br/>
<input type="submit" style="margin-left: 390px" value="送出"/>
</form>
</body>
</html>
運作tomcat,自動跳出浏覽器,我的是火狐,效果圖如下:
2.2.2 修改Login.java代碼
修改Login.java代碼如下:
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);
String[] interestings =servletRequest.getParameterValues("interesting");
for(String interest: interestings){
System.out.println("-->"+interest);
}
}
2.2.3 測試結果
重新開機tomcat,在打開浏覽器輸入下面内容:
點“送出”,ide顯示結果為:
2.3 例3 請求參數傳回枚舉及Map對象
Enumeration getParameterNames(): 傳回參數名對應的Enumeration對象,
類似于ServletConfig(或ServletContext)的getInitPar ameterNames()方法。
Map getParameterMap(): 傳回請求參數的鍵值對: key: 參數名, value: 參數值,string數組類型.
2.3.1 在Login.java添加代碼
在Login.java修改如下:
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String user = servletRequest.getParameter("user");
String pwd = servletRequest.getParameter("pwd");
System.out.println(user+":"+pwd);
String[] interestings =servletRequest.getParameterValues("interesting");
for(String interest: interestings){
System.out.println("-->"+interest);
}
Enumeration<String> names = servletRequest.getParameterNames();
while (names.hasMoreElements()){
String name = names.nextElement();
String val = servletRequest.getParameter(name);
System.out.println("^^"+name+": "+val);
}
Map<String,String[]> map = servletRequest.getParameterMap();
for (Map.Entry<String,String[]> entry : map.entrySet()) {
System.out.println("**"+entry.getKey()+": "+ Arrays.asList(entry));
}
}
2.3.2 測試結果
重新開機tomcat,在打開浏覽器輸入下面内容:
點“送出”,ide顯示結果為:
三、HttpServletRequest(ServletReques子接口)
HttpServletRequest子接口更針對Http請求方面,封裝了比servlet更多的http方面的方法
HttpServletRequest對象代表用戶端的請求,當用戶端通過HTTP協定通路伺服器時,HTTP請求頭中的所有資訊都封裝在這個對象中,通過這個對象提供的方法,可以獲得用戶端請求的所有資訊。
3.1 例子:擷取用戶端的URI
3.1.1 實作代碼
在Loin.java類中的service()方法直接添加如下内容
//這個是在頂部添加的導入類
import javax.servlet.http.HttpServletRequest;
//HttpServletRequest是ServletRequest的子接口,可以強轉為ServletRequest接口
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);
3.1.2 測試結果
重新開機tomcat,在打開浏覽器輸入下面内容: