1.重定向
response是專門給客戶端相應數據的響應對象.
Http協議規定:響應數據也要分成三部分:
響應行,響應頭,響應體
功能:
public void setStatus(int sc);
//200:請求成功
//302:請求重定向
//404:訪問的資源不存在
//500:服務器內部錯誤
public void setHeader(String name,String value);
//設置響應頭信息,name表示屬性名,value表示屬性值.
//響應重定向的路徑
//response.setHeader("location","http://www.itcast.cn");
重定向的原理步驟:
1.1瀏覽器訪問Servlet1,但是該請求Servlet實現不了,想交給別的Servlet對象來實現.
1.2在Servlet1中完成設置
A:設置狀態碼302,通知瀏覽器找其他資源.
response.setStatus(302);
B:設置響應頭,高數瀏覽器訪問新資源的路徑.
response.setHeader("location","/項目名/servlet名");
1.3瀏覽器識別服務器返回的狀態碼.
馬上準備訪問新資源
1.4瀏覽器向新資源(新的Servlet對象)發出請求.
1.5新的Servlet對象響應瀏覽器的請求.
重定向的實現
方式一: 分解式
//1) 響應狀態碼.
response.setStatus(302);
//2) 響應重定向的路徑
response.setHeader("location","http://www.itcast.cn");
方式二: 合并式
response.sendRedirect("http://www.itcast.cn");
重定向和請求轉發的區別:
2.1相對于瀏覽器而言,是幾次請求幾次響應?
重定向:n次請求,n次響應
請求轉發:一次請求,一次響應
2.2瀏覽器地址和窗體內容是否一致?
重定向:一致
請求轉發:不一致
2.3頁面跳轉是在服務器內部,還是在服務器外部?
重定向:可以在服務器內部,也可以在服務器外部
請求轉發:只能在服務器內部
2.4關于是否可以跳轉項目外部的路徑
重定向:可以. response.sendRedirect("/項目名/servlet名");項目名沒有規定死,所以可以訪問外部路徑
請求轉發:不可以,request.getRequestDispatcher("/servlet名").forward(request,response);
瀏覽器已經自動定位到項目名了,所以只能訪問內部路徑了
2.5如果要將request當做容器,誰更合適?
重定向: 不合適
請求轉發: 更合適
頁面定時刷新到新網頁
應用場景:
您訪問的資源不存在,5s后跳轉到首頁.
支付成功,3s后跳轉到首頁
實現方式:
通過設置refresh響應頭信息來完成這個功能.
格式:
response.setHeader("refresh","秒數;url=網址");
例如:
response.setHeader("refresh","5;url=http://www.itcast.cn");
向瀏覽器輸出中文
應用場景:
瀏覽器現實的內容,下載文件等.
response: //以流的形式, 將內容輸出給瀏覽器.
response.getWriter(); //獲取響應體的字符輸出流.
response.getOutputStream(); //獲取響應體的字節輸出流.
注意:
1) 字符流和字節流不能同時使用.
2) 復制文件建議用: 字節流.
手動生成響應內容建議用: 字符流.
3) 不需要關流, tomcat會自動調用close(),flush()方法.
//方式一: 字符流, 合并式 //推薦使用
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("你們真的很棒!");
//方式二:
response.getOutputStream().write("你們真的很棒!".getBytes("gbk"));
EL表達式:
EL:Expression Language(表達語言的意思),是為了使JSP寫起來更加簡單.
作用:
快速獲取域容器中的數據(request容器,context容器).
格式:
${域對象.類名.屬性名}
eg: ${requestScope.product.name}
登錄案例
準備:
創建index.jsp,login.jsp
分層建包,web層,service層,dao層,domain包,utils包
導jar包,引入jdbcUtils工具類
創建User實體類
實現:
在web層創建LoginServlet
1.設置編碼
request.setCharacterEncoding("utf-8");
2.接收參數
request.getParameter("");
也可以使用request.getParameterMap();接收
3.new一個User對象
4.使用BeanUtils將接收到的map值封裝為User對象
BeanUtils.populater(user,map);
5.將User對象傳遞到service層
UserService us = new UserService();
boolean flag = us.isLogin(user);
(這里返回值為布爾類型,如果返回true,就證明登錄成功)
(service層)
6.將User對象傳遞到dao層
UserDao ud = new UserDao();
User us = ud.islog(user);
(這里返回值為User對象,所以要返回web層就需判斷User對象是否為空)
return us != null;
(應為返回值類型為布爾類型,所以如果us為空,null != null 是false,
如果us不為空,us != null 是true)
(dao層)
7.使用jdbcUtils工具類獲取連接池
QueryRunner qr = new QueryRunner (jdbcUtils.getDateSource());
創建SQL語句
String sql = "select * from users where username =? and password = ?;";
使用BeanHandler將查詢到的數據封裝為User對象 并返回
return qr.query(sql, new BeanHandler<>(User.class),user.getUsername,user.getPassword);
8.dao層的返回值將一層一層返回到web層
現在判斷web層的flag
if(flag){
如果flag為true,頁面重定向到index.jsp頁面
}else{
如果flag為false,頁面請求轉發到login.jsp頁面
}