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>