JavaEE學習day-47:Servlet技術(2)

一、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>
正確的用戶名和密碼
響應結果
錯誤的用戶名和密碼
響應結果
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容