Request请求
Request請求:
- Request請求,就是客戶端希望從服務器端獲取資源,向服務器發(fā)出詢問。在B/S架構(gòu)中,就是客戶瀏覽器向服務器發(fā)出詢問。在我們的JavaEE工程中,客戶瀏覽器發(fā)出詢問,要遵循HTTP協(xié)議所規(guī)定的。
- 請求對象,就是在JavaEE工程中,用于發(fā)送請求的對象。我們常用的對象就是ServletRequest和HttpServletRequest,它們的區(qū)別就是是否和HTTP協(xié)議有關。是Servlet四大域之一
請求對象方法:
| String | getContextPath() | 獲取虛擬目錄名稱 |
| String | getServletPath() | 獲取Servlet映射路徑 |
| String | getRemoteAdd() | 獲取訪問者ip地址 |
| String | getQueryString() | 獲取請求的消息數(shù)據(jù) |
| String | getRequestURI() | 獲取統(tǒng)一資源標識符 |
| StringBuffer | getRequestURL() | 獲取統(tǒng)一資源定位符 |
演示:
@WebServlet("/requestMethod") public class RequestMethod extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 訪問地址http://localhost:8081/demo/requestMethod// getContextPath() 獲取虛擬目錄名稱 /demoSystem.out.println(req.getContextPath());// getServletPath() 獲取Servlet映射路徑 /requestMethodSystem.out.println(req.getServletPath());// getRemoteAdd() 獲取訪問者ip地址 0:0:0:0:0:0:0:1System.out.println(req.getRemoteAddr());// getQueryString() 獲取請求的消息數(shù)據(jù) nullSystem.out.println(req.getQueryString());// getRequestURI() 獲取統(tǒng)一資源標識符 /demo/requestMethodSystem.out.println(req.getRequestURI());// getRequestURL() 獲取統(tǒng)一資源定位符 http://localhost:8081/demo/requestMethodSystem.out.println(req.getRequestURL());// URI的范圍更大(共和國),URL更具體(中華人民共和國)} }獲取請求頭方法:
| String | getHeader(String name) | 根據(jù)請求頭名稱獲取一個值 |
| Enumeration | getHeaders(String name) | 根據(jù)請求頭名稱獲取多個值 |
| Enumeration | getHeaderNames() | 獲取所有請求頭 |
演示:
@WebServlet("/requestHeaderDemo") public class RequestHeaderDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// getHeader(String name) 根據(jù)請求頭名稱獲取一個值System.out.println(req.getHeader("connection"));System.out.println("------------------------");// getHeaders(String name) 根據(jù)請求頭名稱獲取多個值Enumeration<String> values = req.getHeaders("accept-encoding");while (values.hasMoreElements()) {String value = values.nextElement();System.out.println(value);}System.out.println("------------------------");// getHeaderNames() 獲取所有請求頭Enumeration<String> names = req.getHeaderNames();while (names.hasMoreElements()) {String name = names.nextElement();String value = req.getHeader(name);System.out.println(name + " : " + value);}}獲取請求參數(shù)信息:
| String | getParameter(String name) | 根據(jù)名稱獲取數(shù)據(jù) |
| String[] | getPaeameterValues(String name) | 根據(jù)名稱獲取所有數(shù)據(jù) |
| Enumeration | getParameterNames() | 獲取所有名稱 |
| Map<String,String[]> | getParameterMap() | 獲取所有參數(shù)的鍵值對 |
演示:
注冊頁面:
獲取請求參數(shù):
@WebServlet("/servletDemo08") public class ServletDemo08 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getParameter(String name) 根據(jù)名稱獲取數(shù)據(jù)System.out.println(req.getParameter("username"));System.out.println(req.getParameter("password"));System.out.println("——————————————————————");// String[] getParameterValues(String name) 根據(jù)名稱獲取所有數(shù)據(jù)String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}System.out.println("——————————————————————");// Enumeration<String> getParameterNames() 獲取所有名稱Enumeration<String> names = req.getParameterNames();while (names.hasMoreElements()) {System.out.println(names.nextElement());}System.out.println("——————————————————————");// Map<String,String[]> getParameterMap() 獲取所有參數(shù)的鍵值對Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {String[] values = map.get(key);System.out.print(key + ":");for (String value : values) {System.out.print(value + " ");}System.out.println();}} }獲取參數(shù)手動封裝到對象:
學生類:
public class Student {private String username;private String password;private String[] hobby; }注冊頁面不變,改一下提交路徑即可
@WebServlet("/servletDemo09") public class ServletDemo09 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.獲取所有的數(shù)據(jù)String username = req.getParameter("username");String password = req.getParameter("password");String[] hobby = req.getParameterValues("hobby");// 2.封裝學生對象Student student = new Student(username, password, hobby);// 3.打印學生對象System.out.println(student);} }反射封裝對象:
@WebServlet("/servletDemo10") public class ServletDemo10 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {// 1. 獲取所有的數(shù)據(jù)Map<String, String[]> map = req.getParameterMap();// 2. 封裝學生對象Student student = new Student();// 3. 遍歷集合for (String name : map.keySet()) {String[] value = map.get(name);try {// 獲取Student對象的屬性描述器,就是獲取get/set,然后把get/set封裝到pd里// 拿到User對象中的屬性描述器。是誰的屬性描述器:是由構(gòu)造函數(shù)的第一個參數(shù)決定的。第二個參數(shù)是指定javabean的字節(jié)碼PropertyDescriptor pd = new PropertyDescriptor(name, student.getClass());//參數(shù)指的就是拿哪個類的哪個屬性的描述器// 設置javabean屬性的值Method writeMethod = pd.getWriteMethod();if (value.length > 1) {writeMethod.invoke(student, (Object) value);} else {writeMethod.invoke(student, value);//第一個參數(shù)是指的給哪個對象,第二個參數(shù)指的是賦什么值}} catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}// 4. 輸出對象System.out.println(student);} }BeanUtils封裝對象:
使用apache的commons-beanutils實現(xiàn)封裝
如果遇到報500可能是沒有將jar包要導入到項目中
流對象獲取請求信息:
方法:
| BufferedReader | getReader() | 獲取字符輸入流 |
| ServletInputStream | getInputStream() | 獲取字節(jié)輸入流 |
演示:
@WebServlet("/servletDemo04") public class ServletDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 字符流獲取必須使用post,字符流不是new出來的不需要關閉 /* BufferedReader reader = req.getReader();String len;while ((len = reader.readLine()) != null) {System.out.println(len);}*/// 如果用post出現(xiàn)亂碼就在代碼前加個編碼格式就可以了// setCharacterEncoding:設置編碼格式req.setCharacterEncoding("UTF-8");// 字節(jié)流ServletInputStream inputStream = req.getInputStream();byte[] bytes = new byte[1024];int len;while ((len = inputStream.read(bytes)) != -1) {System.out.println(new String(bytes, 0, len));}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }中文亂碼問題:
GET方式請求:
- GET方式請求的正文是在地址欄中,在Tomcat8.5版本及以后,Tomcat服務器已經(jīng)幫我們解決了,所以不會有亂碼問題了。
POST方式請求
- 在POST方式請求中,我們的亂碼問題可以用如下代碼解決:
請求域:
- 請求域(request域):可以在一次請求范圍內(nèi)進行共享數(shù)據(jù)
- 一般用于請求轉(zhuǎn)發(fā) 的多個資源中共享數(shù)據(jù)
請求對象操作共享數(shù)據(jù)方法:
| void | setAttribute(String name,Object value) | 向請求域?qū)ο笾写鎯?shù)據(jù) |
| object | setAttribute(String name) | 通過名稱獲取請求域?qū)ο笾械臄?shù)據(jù) |
| void | removeAttribute(String name) | 通過名稱移除請求域?qū)ο笾械臄?shù)據(jù) |
請求轉(zhuǎn)發(fā):
客戶端的一次請求到達以后,發(fā)現(xiàn)借助其他的Servlet來實現(xiàn)功能
特點:
- 瀏覽器地址不變
- 域?qū)ο笾械臄?shù)據(jù)不丟失
- 負責轉(zhuǎn)發(fā)的Servlet轉(zhuǎn)發(fā)前后的顯示正文會丟失
- 由轉(zhuǎn)發(fā)的目的地來響應客戶端
請求轉(zhuǎn)發(fā)的方法:
| RequestDispatcher | getRequestDispatcher(String name) | 獲取請求調(diào)度對象 |
| void | forward(ServletRequest req,ServletResponse resp) | 實現(xiàn)轉(zhuǎn)發(fā) |
請求包含:
可以合并其它Servlet中的功能一起響應給客戶端
特點:
- 瀏覽器地址不變
- 域?qū)ο髷?shù)據(jù)不丟失
- 被包含的Servlet響應頭會丟失
請求包含方法:
| RequestDispatcher | getRequestDispatcher(String name) | 獲取請求調(diào)度對象 |
| void | include(ServletRequest req,ServletResponse resp) | 實現(xiàn)包含 |
重定向和請求轉(zhuǎn)發(fā) :
- 重定向:通過各種方法將各種網(wǎng)絡請求重新定個方向轉(zhuǎn)到其它位置,地址會變
- 請求轉(zhuǎn)發(fā):客戶端發(fā)起請求后,在服務器之間的跳轉(zhuǎn),然后服務器返回頁面給客戶端進行顯示,地址不變
總結(jié)
- 上一篇: 我的世界服务器虚拟菜单插件,[综合|娱乐
- 下一篇: 希尔排序 最坏时间_排序算法(2)