目錄
2.2 例2 根據請求參數的名字,返回請求參數對應的字符串數組
三、HttpServletRequest(ServletReques子接口)
本章講的是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,在打開瀏覽器輸入下面內容:
點“提交”,ide顯示結果爲: