将servlet数据传到html_Servlet详解(二)
【42】
請求轉發:
問題:服務器在接收到瀏覽器的請求后,僅僅使用一個Servlet 進行請求處理,會造成不同的 Servlet 邏輯代碼冗余,Servlet 的職責不明確。
解決:使用請求轉發。
特點:
- 一次請求
- 地址欄信息不改變。
- Request 對象作用域
問題:使用請求轉發后,不同的 Servlet 之間怎么進行數據的共享呢?或者說數據怎么從一個 servlet 流轉給另外一個 Servlet 呢?
解決:使用 request 對象的作用域
使用:
request.setAttribute(object name,Object value); request.getAttribute(Object obj)作用:解決了一次請求內的不同 Servlet 的數據(請求數據+其他數據)共享問題。
作用域:基于請求轉發,一次請求中的所有 Servlet 共享。
注意:使用 Request 對象進行數據流轉,數據只在一次請求內有效。
特點:
- 服務器創建
- 每次請求都會創建
- 生命周期一次請求
重定向
問題:如果當前的請求,Servlet 無法進行處理怎么辦?如果使用請求轉發,造成表單數據重復提交怎么辦?
解決:使用重定向
使用:response.sendRedirect(“路徑”).
本地路徑為:uri
網絡路徑為:定向資源的 URL 信息
特點:
- 兩次請求
- 瀏覽器地址欄信息改變
- 避免表單重復提交
轉發和重定向的區別:
Cookie
測試代碼:MyServlet1
public class MyServlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//設置請求編碼格式req.setCharacterEncoding("utf-8");//設置響應編碼格式resp.setContentType("text/html;charset=utf-8");//獲取請求信息String a=req.getParameter("a");String b=req.getParameter("b");//處理請求信息System.out.println(a+":"+b);//響應處理結果//創建Cookie數據Cookie c=new Cookie("b", b);//設置Cookie信息c.setMaxAge(3600*24*3);//設置cookie的有效期。//設置有效路徑c.setPath("/cookie/my2");//響應Cookie數據resp.addCookie(c);//直接響應resp.getWriter().write("我是MyServlet1,處理完畢");//請求轉發//重定向} }MyServlet2:
public class MyServlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//設置請求編碼格式req.setCharacterEncoding("utf-8");//設置響應編碼格式resp.setContentType("text/html;charset=utf-8");//獲取請求信息//String b=req.getParameter("b");String bc=null; //獲取Cookie數據Cookie[] cookies = req.getCookies();for(Cookie ck:cookies){if("b".equals(ck.getName())){bc=ck.getValue();}}String c=req.getParameter("c");//處理請求信息System.out.println(bc+":"+c);//響應處理結果//直接響應resp.getWriter().write("我是MyServlet2,處理完畢");//請求轉發//重定向} }Session
問題:Request 對象解決了一次請求內的不同 Servlet 的數據共享問題,那么一個用戶的不同請求的處理需要使用相同的數據怎么辦呢?
解決:使用 session 技術。
原理:用戶使用瀏覽器第一次向服務器發送請求,服務器在接受到請求后,調用對應的 Servlet 進行處理。在處理過程中會給用戶創建一個 session 對象,用來存儲用戶請求處理相關的公共數據,并將此 session 對象的 JSESSIONID 以 Cookie 的形式存儲在瀏覽器中(臨
時存儲,瀏覽器關閉即失效)。用戶在發起第二次請求及后續請求時,請求信息中會附帶 JSESSIONID,服務器在接收到請求后,調用對應的 Servlet 進行請求處理,同時根據 JSESSIONID 返回其對應的 session 對象。
特點:
- Session 技術是依賴 Cookie 技術的服務器端的數據存儲技術。
- 由服務器進行創建
- 每個用戶獨立擁有一個 session
- 默認存儲時間為 30 分鐘
作用:
解決了一個用戶的不同請求的數據共享問題。
使用:
- 創建 Session 對象
- 存儲數據到 session 對象
- 獲取 session 對象
- 獲取數據從 session 對象
- 如果獲取 session 中不存在的數據返回 null。
注意:只要不關閉瀏覽器,并且 session 不失效的情況下,同一個用戶的任意請求在項目的任意Servlet中獲取到的都是同一個session對象。
作用域:一次會話
session學習:
session的使用:
//創建session對象HttpSession session =req.getSession();//存儲數據到session中session.setAttribute(String name, Object value);//獲取session對象HttpSession session =req.getSession();//獲取session中的數據session.getAttribute(String uname);注意:返回的object類型,需要強制轉換//刪除session中的數據session.removeAttribute(String uname);//注意:如果有數據則刪除,沒有則什么都不做。流程: 1、瀏覽器發起請求到Aservlet,在AServlet中使用req.getSession()獲取Session對象,如果此次請求中沒有SessionID則創建一個新的Session對象,如果有SessionID則將其對應的Session對象返回(前提是該session對象沒有到期),如果session對象到期銷毀了,就算有sessionID也會重新創建一個Session。
2、校驗session是否失效,存儲數據到session對象中或者獲取session中的數據或者刪除session中的數據
特點:session解決了同一個用戶不同請求 的數據共享問題。
session的作用域:瀏覽器不關閉,session不失效,則同一用戶的任意請求獲取的都是同一個session 一次會話
session的設置:
session默認有效時間為30分鐘,可以在tomcat下的web.xml中進行配置
注意:此種配置方式是所有的tomcat下的項目默認為30分鐘
也可以在代碼中使用
session.setMaxInactiveInterval(int seconds);//設置session的有效時間,參數為整數類型的秒session.invalidate();//強制銷毀session
測試代碼:
UserServlet
public class UserServlet extends HttpServlet {@Overrideprotected 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)){//登錄成功//響應處理結果}else{//登錄失敗//創建Session并增加登錄失敗標記HttpSession session = req.getSession();session.setAttribute("flag","loginFalse");//響應處理結果(重定向到登錄頁面)resp.sendRedirect("login");}} }LoginServlet
public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//設置請求編碼格式req.setCharacterEncoding("utf-8");//設置響應編碼格式resp.setContentType("text/html;charset=utf-8");//獲取Session中的數據HttpSession session = req.getSession();String str=(session.getAttribute("flag")==null?"":"用戶名或密碼錯誤");//銷毀sessionsession.invalidate();//獲取請求信息//處理請求信息//響應處理結果//直接響應resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<form action='user' method='get'>");resp.getWriter().write("<font color='red'>"+str+"</font>");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='登錄'/><br />");resp.getWriter().write("</form>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }ServletContext 對象:
作用:解決了不同用戶之間的數據共享問題
使用:創建ServletContext對象
ServletContext sc1 = this.getServletContext();ServletContext sc2 =this.getServletConfig().getServletContext();ServletContext sc3=req.getSession().getServletContext();存儲用戶共享數據 sc.setAttribute(String name,Object value);
獲取用戶共享數據 sc.getAttribute(String name);
刪除共享數據 sc.removeAttribute(String name);
獲取web.xml中的全局配置屬性,作用:將部分動作和源文件進行解耦,我們只需要在xml配置文件中進行相關配置就會改變代碼的執行效果。
sc.getInitParameter(String name);注意返回的是String類型數據
獲取webRoot下的資源流對象
sc.getResourceAsStream(String path);
注意:path為相對路徑,寫從webRoot開始查找資源的路徑即可。
獲取webRoot下的資源絕對路徑 sc.getRealPath(String path);
注意:path為相對路徑,寫從webRoot開始查找資源的路徑即可。
特點:服務器創建,被所有用戶共享
生命周期:服務器開啟到服務器關閉
ServletConfig 對象:
問題:使用 ServletContext 對象可以獲取 web.xml 中的全局配置文件,在 web.xml 中每個 Servlet 也可以進行單獨的配置,那么該怎么獲取配置信息呢?
解決:使用 ServletConfig 對象
作用:ServletConfig 對象是 Servlet 的專屬配置對象,每個 Servlet 都
單獨擁有一個 ServletConfig 對象,用來獲取 web.xml 中的配置信息。
使用:a、獲取 ServletConfig 對象 b、 獲取 web.xml 中 servlet 的配置信息
總結
以上是生活随笔為你收集整理的将servlet数据传到html_Servlet详解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET环境下水晶报表使用总
- 下一篇: 如何在其他程序的窗口上创建按钮并使之能响