一、Request請求
1.request對象的介紹:
作用:
由服務器創(chuàng)建,用來儲存請求的信息;
特點:
Request對象由服務器創(chuàng)建;一次請求創(chuàng)建一個對象,生命周期為一次請求內,請求結束即銷毀此次請求的request對象。
2.Request對象獲取請求數(shù)據(jù)的方法:
(1)request對象獲取請求行的方法:
1)getMethod():返回請求方式;
2)getRequestUrl():返回請求url;
3)getRequestUri():返回請求uri;
4)getQueryString():返回get請求中的URL中的用戶數(shù)據(jù);
5)getSchema():返回協(xié)議;
(2)Request對象獲取請求頭的方法:
1)getHeader():根據(jù)鍵名獲取請求頭信息;
注意:如果獲取的請求頭信息不存在返回null。
2)getHeaderNames() 返回存儲了請求頭鍵名的枚舉集合。
(3)Request對象獲取請求實體數(shù)據(jù)的方法:
1)getParameter(String name):根據(jù)鍵名獲取數(shù)據(jù);
注意:
鍵名其實就是前端頁面中的表單標簽的name屬性的值或者前端頁面其他方式提交數(shù)據(jù)的鍵的名字。
如果請求中沒有對應的請求數(shù)據(jù),則返回null。
2)getParameterValues(String name):根據(jù)鍵名獲取同名不同的值,返回數(shù)組;
3)getParameterNames():返回實體數(shù)據(jù)中鍵名的枚舉;
(4)Request對象請求網(wǎng)絡數(shù)據(jù)
1)getRemoteAddr():獲取客戶端的IP地址;
2)getRemotePort():取客戶端端口號;
3)getLocalAddr():獲取服務器端的ip;
4)getLocalPort():獲取服務器端的端口號;
package com.zlw.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* * request對象學習之獲取請求數(shù)據(jù) 請求數(shù)據(jù):
* 請求行:請求方式 請求URL 協(xié)議
* getMethod(); 返回請求方式
* getRequestUrl():返回請求url
* getRequestUri():返回請求uri
* getQueryString():返回get請求中的URL中的用戶數(shù)據(jù) 注意:post請求中沒有此方法。
* getSchema(); 返回協(xié)議
* 請求頭
* getHeader(String name) 根據(jù)鍵名獲取請求頭信息
* 注意:如果獲取的請求頭信息不存在返回null。
* getHeaderNames() 返回存儲了請求頭鍵名的枚舉集合。
* 請求實體
* getParameter(String name) 根據(jù)鍵名獲取數(shù)據(jù)
* 注意:
* 鍵名其實就是前端頁面中的表單標簽的name屬性的值或者前端頁面其他方式提交數(shù)據(jù)的鍵的名字
* 如果請求中沒有對應的請求數(shù)據(jù),則返回null.
* getParameterValues(String name) 根據(jù)鍵名獲取同名不同的值,返回數(shù)組
* 注意:如果沒有對應的鍵名,則返回null
* getParameterNames() 返回實體數(shù)據(jù)中鍵名的枚舉 請求網(wǎng)絡相關數(shù)據(jù)
* getRemoteAddr() 獲取客戶端的IP地址
* getRemotePort() 獲取客戶端端口號
* getLocalAddr() 獲取服務器端的ip
* getLocalPort() 獲取服務器端的端口號
*
* @author zhang
*
*/
public class RequestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取請求行信息
//獲取請求方式
String method = req.getMethod();
System.out.println("請求方式:"+method);
//獲取請求的URL信息
StringBuffer requestURL=req.getRequestURL();
System.out.println("請求URL:"+requestURL);
//獲取請求的URI信息
String requestURI = req.getRequestURI();
System.out.println("請求URI:"+requestURI);
//獲取get請求URL中的請求數(shù)據(jù)
String queryString = req.getQueryString();
System.out.println("獲取get請求中的URL數(shù)據(jù):"+queryString);
//獲取協(xié)議
String scheme = req.getScheme();
System.out.println("獲取請求協(xié)議:"+scheme);
//獲取請求頭信息
//根據(jù)鍵名獲取請求頭信息
String header=req.getHeader("User-Agent2");
System.out.println("獲取瀏覽器的版本信息:"+header);
//獲取請求頭中鍵名的枚舉
Enumeration headerNames=req.getHeaderNames();
while (headerNames.hasMoreElements()) {
//獲取請求頭鍵名
String name=(String)headerNames.nextElement();
//獲取請求頭的鍵名對應的值
String value=req.getHeader(name);
System.out.println(name+":"+value);
}
//獲取請求實體數(shù)據(jù)(用戶數(shù)據(jù))
//根據(jù)鍵名獲取數(shù)據(jù)
String uname = req.getParameter("uname2");
String pwd = req.getParameter("pwd");
System.out.println("請求實體數(shù)據(jù):"+uname+":"+pwd);
//獲取請求實體中鍵名的枚舉
Enumeration names= req.getParameterNames();
while(names.hasMoreElements()){
//獲取鍵名
String name=(String)names.nextElement();
//判斷
if("fav".equals(name)){
String [] favs2 = req.getParameterValues(name);
if(favs2!=null){
for(String s:favs2){
System.out.println(name+":"+s);
}
}
}else{
//獲取值
String value=req.getParameter(name);
System.out.println(name+":"+value);
}
}
//請求相關的網(wǎng)絡數(shù)據(jù)
//獲取客戶端信息
String remoteAddr = req.getRemoteAddr();
System.out.println("獲取客戶端的ip::"+remoteAddr);
//獲取客戶端的端口號(瀏覽器)
int remotePort = req.getRemotePort();
System.out.println("獲取客戶端的端口號:"+remotePort);
//獲取服務器主機的ip
String localAddr = req.getLocalAddr();
System.out.println("獲取服務器ip:"+localAddr);
//獲取服務器的端口號
int localPort= req.getLocalPort();
System.out.println("獲取服務器端口號:"+localPort);
//處理請求信息
//響應處理結果
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>RequestServlet</servlet-name>
<servlet-class>com.zlw.servlet.RequestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestServlet</servlet-name>
<url-pattern>/requset</url-pattern>
</servlet-mapping>
</web-app>

二、Response響應
1.服務器接收和響應請求數(shù)據(jù):
(1)接收瀏覽器的請求數(shù)據(jù):
服務器接收到瀏覽器的請求后,會創(chuàng)建一個 Request 對象,對象中存儲了此次請求相關的請求數(shù)據(jù)。服務器在調用 Servlet 時會將創(chuàng)建的Request 對象作為實參傳遞給 Servlet 的方法,比如:service 方法。
1)獲取請求頭數(shù)據(jù) ;
2)獲取請求行數(shù)據(jù) ;
3)獲取用戶數(shù)據(jù) ;
(2)響應請求數(shù)據(jù):
服務器在調用指定的 Servlet 進行請求處理的時候,會給 Servlet 的方法傳遞兩個實參 request 和 response。其中 request 中封存了請求相關的請求數(shù)據(jù),而 response 則是用來進行響應的一個對象。
1)設置響應頭;
2)設置響應編碼格式;
3)設置響應實體;
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* *resp對象之處理響應學習:
* 設置響應行: 協(xié)議 狀態(tài)碼 狀態(tài)消息
* resp.sendError(int status);
* 作用:可以自主的響應狀態(tài)給瀏覽器
* 設置響應頭
* addHeader(String name,String value) 添加響應頭信息,同名數(shù)據(jù)不會覆蓋
* setHeader(String nanme,String value) 設置響應頭信息,會覆蓋原有信息。如果沒有此響應頭則添加該信息。
* 設置響應實體(處理結果)
* resp.getWriter().write("實體內容");
* 注意:
* 實體內容可以分開進行響應。
* 注意:
* 一旦使用resp對象作出了請求響應,則意味著此次請求處理完畢。服務器在響應后會將此次請求相關的req對象和resp對象銷毀。
* @author zhang
*
*/
public class ResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取請求數(shù)據(jù)
// 處理請求數(shù)據(jù)
// 響應處理結果
// 設置響應行
// 自定義響應404異常
// resp.sendError(404);
// 設置響應頭
// 添加響應頭信息
resp.addHeader("mouse", "thinkpad");
resp.addHeader("mouse", "thinkpad2");
// 設置響應頭
// resp.setHeader("mouse", "tow fly birds");
// resp.setHeader("mouse", "tow fly birds3");
// 設置響應實體
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ResponseServlet</servlet-name>
<servlet-class>com.zlw.servlet.ResponseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseServlet</servlet-name>
<url-pattern>/response</url-pattern>
</servlet-mapping>
</web-app>

三、亂碼問題
(1)使用String進行重新編碼:
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
(2)Get方式請求:
1)在 service 方法中使用: req.setCharacterEncoding(“utf-8”);
2)在tomcat 服務器目錄下的 conf 文件下找到 server.xml 文件,打開進行在Connector標簽下添加useBodyEncodingForURL=“true”。
(3)Post方式請求:
1)在 service 方法中使用: req.setCharacterEncoding(“utf-8”);
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* * 請求亂碼問題:服務器獲取的請求數(shù)據(jù)亂碼
* post請求方式亂碼:
* req.setCharacterEncoding("utf-8");
* get請求方式亂碼解決:
* 方式一:每個數(shù)據(jù)都要單獨的進行轉換
* String uname=req.getParameter("uname");
* String uname2=new String(uname.getBytes("iso-8859-1"), "utf-8");
* 方式二:
* req.setCharacterEncoding("utf-8");
* 在tomcat的server.xml文件中的Connector標簽中增加屬性: useBodyEncodingForURI="true"
* 響應亂碼問題:瀏覽器中顯示的服務器響應數(shù)據(jù)亂碼
* resp.setContentType("text/html;charset=utf-8");
* service代碼編寫流程:
* 設置請求編碼格式
* 設置響應編碼格式
* 獲取請求信息
* 處理請求信息
* 響應處理結果
* @author zhang
*
*/
public class CodeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置請求編碼格式
req.setCharacterEncoding("utf-8");
//設置響應編碼格式
// resp.setHeader("content-type", "text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
//獲取請求數(shù)據(jù)
String uname=req.getParameter("uname");
//處理請求數(shù)據(jù)
System.out.println(uname);
//響應處理結果
resp.getWriter().write("請求處理完畢!");
}
}

四、簡單的登錄練習
1.Request請求
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Users extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置請求編碼格式
req.setCharacterEncoding("utf-8");
//設置響應編碼格式
resp.setContentType("text/html;charset=utf-8");
//獲取請求信息
String uname = req.getParameter("uname");
String pwd=req.getParameter("pwd");
//處理請求信息
if ("張三".equals(uname)&&"123".equals(pwd)) {
resp.getWriter().write("登錄成功!");//響應處理結果
} else {
resp.getWriter().write("用戶名或密碼錯誤");//響應處理結果
}
}
}
2.Response響應:
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Login extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置請求編碼格式
req.setCharacterEncoding("utf-8");
//設置響應編碼格式
resp.setContentType("text/html;charset=utf-8");
//獲取請求信息
//處理請求信息
//響應處理結果
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='users' method='post'>");
resp.getWriter().write("用戶名:<input type='text'name='uname' value=''/><br/>");
resp.getWriter().write("密碼:<input type='password'name='pwd' value=''/><br/>");
resp.getWriter().write("<input type='submit' value='登錄'/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
3.配置web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Login</servlet-name>
<servlet-class>com.zlw.servlet.Login</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Users</servlet-name>
<servlet-class>com.zlw.servlet.Users</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Users</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
</web-app>



