1. 程式人生 > 其它 >Servlet-請求轉發與重定向

Servlet-請求轉發與重定向

1.Servlet例項編寫

(1)編寫Servlet程式碼,一般繼承HttpServlet類,重寫doGet、doPost

(2)在web.xml中配置Servlet,可以配置url對映關係以及初始化引數

(3)在瀏覽器中訪問或者表單提交

(4)通過Http請求型別自動呼叫對應的doGet或者doPost等方法

/**
 * 建立日期:2021/12/20
 * 作者:高靖博
 * 公司:華為(昆明)數字經濟學院
 */
public class ServletDemo1 extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String method = req.getMethod();
        // GET
        System.out.println(method);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("登入操作");
        //初始化配置引數中取出引數值
        ServletConfig servletConfig = this.getServletConfig();
        //從配置檔案中取出使用者名稱和密碼
        String s_userName = servletConfig.getInitParameter("userName");
        String s_pwd = servletConfig.getInitParameter("pwd");

        //從請求引數中取得使用者填寫的使用者名稱和密碼
        String userName = req.getParameter("userName");

        String pwd = req.getParameter("pwd");

        System.out.println("userName:"+userName);
        System.out.println("pwd:"+pwd);
        //響應頁面的html
        String html = "";
        if(!(userName.equals(s_userName)&&s_pwd.equals(pwd))){

            html += "<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <title>登入</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "<span style='color:red'>使用者名稱或密碼錯誤!</span>"+
                    "  <form action=\"login\" method=\"post\">\n" +
                    "      <label>使用者名稱</label>\n" +
                    "      <input type=\"text\" name=\"userName\" /><br/>\n" +
                    "      <label>密碼</label>\n" +
                    "      <input type=\"password\" name=\"pwd\" />\n" +
                    "      <input type=\"submit\" value=\"登入\" />\n" +
                    "  </form>\n" +
                    "</body>\n" +
                    "</html>";

        }else{
            html += "<html>";
            html += "<head><title>結果</title></head>";
            html += "<body><h1>登入成功!</h1></body>";
            html += "</html>";
        }

        //返回響應  登入成功
        PrintWriter writer = resp.getWriter();

        writer.println(html);

        writer.flush();
        writer.close();

    }
}

2.Servlet的缺點

(1)Servlet需要返回HTML程式碼,將前端和後端程式碼耦合

3.請求重定向和請求轉發

1.請求轉發 RequestDispatcher介面

RequestDispatcher物件由Servlet容器建立,用於封裝一個由路徑所標識的伺服器資源。利用RequestDispatcher物件,可以把請求轉發給其它的Servlet或JSP頁面,這個介面中定義了兩個方法:

(1)forward(ServletRequest request, ServletResponse response)

該方法用於將請求從一個Servlet傳遞給伺服器上的其它Servlet、JSP或者是HTML頁面。在Servlet中,可以對請求進行初步處理,然後呼叫這個方法,由其它的資源來生成響應。

(2) include(ServletRequest request, ServletResponse response)

該方法用於在響應中包含其它資源的內容。與forward()不同的是,利用include()方法轉發的資源將產生的響應併入到原來的響應物件中,原先的Servlet還可以繼續輸出響應資訊。

2.請求轉發

三種方法

 利用ServletRequest介面中的getRequestDispatcher()方法。
 利用ServletContext介面中的getNamedDispatcher()方法。 
 利用ServletContext介面中的getRequestDispatcher()方法。

請求轉發特點

++ 伺服器端行為,伺服器進行servlet的轉發

++ 攜帶請求、響應物件交給另一個Servlet處理

++ 瀏覽器的位址列不會發生變化

++ forward方法是將請求響應交給另一個Servlet處理,自己本身的內容清空

++ include方法是將另一個Servlet的請求響應包含到當前Servlet中進行響應

forward方法:

req.getRequestDispatcher("Servlet的URL地址").forward(ServletRequest物件,ServletResponse物件)

include方法

req.getRequestDispatcher("Servlet的URL地址").include(ServletRequest物件,ServletResponse物件)

請求轉發中引數的傳遞

如:Servlet1中設定引數,然後轉發給Servlet2

 req.setAttribute("kkk","123456");

Servlet2取得引數

 Object kkk = req.getAttribute("kkk");

3.請求重定向

重定向的特點:

++ 重定向是客戶端行為

++ 重定向不能共享請求資源

++ 重定向客戶端位址列會發生變化

寫法:

//重定向是響應物件呼叫
        resp.sendRedirect("http://www.baidu.com");

4.服務端會話 Session

作用

++ 儲存登入驗證資訊(驗證令牌,驗證碼)

++ 服務端快取

(1)設定的方法,通過請求物件獲取

//獲取Session
        HttpSession session = req.getSession();

        session.setAttribute("userIsLogin",true);//設定儲存引數
        session.setMaxInactiveInterval(10);//設定過期時間(單位秒)

(2) 獲取session中的引數

HttpSession session = req.getSession();
Object obj = session.getAttribute("userIsLogin");

(3)獲取sessionid

String id = session.getId();//獲取SESSION物件的唯一標識

5.實際開發中的Servlet

(1)請求的查詢資料,Servlet返回結果使用JSON

(2)請求是增、刪、改,返回操作的提示,也是一個JSON

(3)請求頁面跳轉(請求的重定向)

1.專案中的資原始檔夾設定

後端業務模組分類:

​ 系統業務

​ ++ controller包: Servlet程式碼

​ ++ dao包: JDBC程式碼

​ ++ dto包 : 資料交換實體類

​ ++ util : 工具包(可以呼叫靜態方法的類)

​ 核心業務

。。。

前端模組劃分

++ views: 前端頁面部分

​ ++ 業務塊 ... : 針對各個業務的前端資料夾

​ ++ static : 前端使用的靜態資原始檔

++ lib:前端依賴(js)

2.編寫專案過程

Servlet->service->dao -> 前端

demo:

響應資料實體封裝

/**
 * 建立日期:2021/12/22
 * 作者:高靖博
 * 公司:華為(昆明)數字經濟學院
 */
public class Result implements Serializable {

    private String code;//成功程式碼

    private String msg;//返回的訊息(操作成功!  系統異常!  許可權不足)

    private Object data = new Object();//封裝返回資料的物件

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

跳轉到登入頁面

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //跳轉到登入頁面
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        String scheme = req.getScheme();
        String serverName = req.getServerName();
        int serverPort = req.getServerPort();
        String contextPath = req.getContextPath();

        String pathHead = scheme+"://"+serverName+":"+serverPort+contextPath;

        System.out.println(pathHead);

        this.getServletContext().setAttribute("pathHead",pathHead);

        resp.sendRedirect(pathHead+"/views/sys/loginIndex.html");

    }

登入Servlet

 /**
     * 相關的資料介面
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");

        //忽略邏輯判斷。。。呼叫Service類

        Result res = new Result();

        res.setCode("0000");
        res.setMsg("登入成功!");

        String s = res.toString();

        resp.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.print(s);
        writer.flush();
        writer.close();


    }

前端程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入</title>
</head>
<body>
<!-- ajax jsp -->
<form action="http://localhost:8080/JavaServletDemo/login" method="post">
    <label>使用者名稱</label>
    <input type="text" name="userName" /><br/>
    <label>密碼</label>
    <input type="password" name="pwd" />
    <input type="submit" value="登入" />
</form>
</body>
</html>