天天看點

JSP與servlet之間的傳值方式

JSP與 servlet之間的傳值有兩種情況:JSP -> servlet, servlet -> JSP。

通過對象 request和 session (不考慮 application)完成傳值。

一、JSP -> servlet

JSP頁面有3種方法向 servlet傳值: form表單、URL 、其他

<!-- JSP page -->

...

<%......

       session.setAttribute("testSession","Hello session");

       reqeust.setAttribute("testRequest","Hello request");

%>

<a href="JspServlet?action=toServlet" target="_blank" rel="external nofollow" >click me</a>

<form action="JspServlet?action=toServlet" method="post" name="form">

       <input name="username" type="test" />

       <input type="submit" value="submit">

</form>

...

1、對于該JSP頁面 form表單的内容,如 <input>标簽,在 servlet可用 request.getParameter("username");擷取。

2、URL:比如這裡的 <a>标簽的 href屬性與 <form>标簽的 action屬性的值 "JspServlet?action=toServlet",在servlet同樣用 request.getParameter("action")擷取;所要注意的是這裡的 url 要和 servlet在web.xml裡的 <url-pattern>标簽的路徑所對應。這部分後面會提到。

3、java片段代碼,servlet隻能接到 session.setAttribute("testSession","Hello session")的内容,而接不到 request的内容。在 servlet裡用 request.getSession().getAttribute("testSession")擷取 session内容。

二、Servlet

1、關于 servlet,首先要提到它在 web.xml裡的注冊内容,如

    <servlet-name>JspServlet1</servlet-name>

        <servlet-class>com.demo.JspServletDemo</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>JspServlet1</servlet-name>

        <url-pattern>/JspServlet</url-pattern>

    </servlet-mapping>

    <servlet-name>JspServlet2</servlet-name>

        <servlet-class>com.demo.JspServletDemo</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>JspServlet2</servlet-name>

        <url-pattern>/admin/JspServlet</url-pattern>

    </servlet-mapping>

假如 project name 是 jsp2servlet,則該 project根目錄的 Context是 /jsp2servlet,在位址欄裡顯示是http://localhost:8080/jsp2servlet/;

在 project 根目錄下有 admin目錄,對應的 Context是/admin/jsp2servlet,在位址欄裡顯示是http://localhost:8080/jsp2servlet/admin,

在這兩個目錄下的 jsp 都想轉到 com.demo.JspServletDemo類做處理,這時的 url需要在 web.xml注冊兩次。

    1)在 http://localhost:8080/jsp2servlet/ 目錄下的 jsp 頁面 JspServlet1,url應寫為 "JspServlet"

    2)在 http://localhost:8080/jsp2servlet/admin/ 目錄下的 jsp 頁面通路 JspServlet2,url應寫為 "admin/JspServlet"

2、在 servlet直接用 request對象,得到發送來的請求内容;用 request.getSession(),得到 session對象,進而得到會話内容。

這裡的 request.getSession()的參數為 boolean 類型,該方法意思可了解為:

session可以認為是每一個IE程序對應一個會話(新開一個IE程序就可以對應兩個會話的),getSession都是傳回目前使用者的會話對象,參數的差別在于:

參數為true (預設),則如果“目前使用者的會話對象”為空(第一次通路時)則建立一個新的會話對象傳回;

參數為false,則如果“目前使用者的會話對象”為空,則傳回 null (即不自動建立會話對象)。

利用這個方法可以判斷 session是否過期,如下:

if(request.getSession(false)==null)

   System.out.println("Session has been invalidated!");

else

   System.out.println("Session is active!");

三、Servlet -> JSP

從 servlet轉到 jsp不外乎兩種方法,重定向 和 url轉發

1、重定向 ( Redirect):是路徑的跳轉,内容和 url都改變。不允許帶 request參數( session參數可以),即不允許在servlet裡給 request對象使用setAttribute方法傳給下一頁面。在 servlet裡使用 response.sendRedirect(url) 方法。注意這裡的 url前不帶斜線 /,如 response.sendRedirect(”test.jsp“)

2、url轉發 ( Forward):是頁面的跳轉,頁面内容發生改變,url不變。可以帶 request和 session參數。在 servlet裡使用 getServletConfig().getServletContext().getRequestDispatcher(url).forward(request, response)。而這裡的url前需要帶斜線 /,如getServletConfig().getServletContext().getRequestDispatcher(”/test.jsp“).forward(request, response)

servlet使用RequestDispatcher到jsp頁面 

String url="/EShop.jsp"; 

ServletContext sc = getServletContext(); 

RequestDispatcher rd = sc.getRequestDispatcher(url); 

rd.forward(req, res); 

servlet重定向jsp,并将資料發送到别一個JSP中: 

request.setAttubute("messages",aaa); 

RequestDispatcher requestDispatcher=request.getRequestDispatcher("/jsp/testbean.jsp"); 

requestDispatcher.forward(request,response);

3.7、Servlet跳轉

 從JSP跳轉到Servlet可以實作,通過表單送出或超連結可以做到,但是現在如果從一個Servlet跳轉到JSP呢?

 • HttpServletResponse對象,此對象可以完成跳轉:public void sendRedirect();

JumpServlet.java:

package org.lxh.demo ;

import javax.servlet.* ;

import javax.servlet.http.* ;

import java.io.* ;

public class JumpServlet extends HttpServlet{

 public void init() throws ServletException{

 }

 public void doGet(HttpServletRequest req,HttpServletResponse resp)

              throws ServletException,java.io.IOException{

  resp.sendRedirect("jump.jsp") ;

 }

 public void doPost(HttpServletRequest req,HttpServletResponse resp)

              throws ServletException,java.io.IOException{

  this.doGet(req,resp) ;

 }

 public void destroy(){

 }

};

web.xml:

 <servlet>

  <servlet-name>jump</servlet-name>

  <servlet-class>org.lxh.demo.JumpServlet</servlet-class>

 </servlet>

 <servlet-mapping>

  <servlet-name>jump</servlet-name>

  <url-pattern>/jump</url-pattern>

 </servlet-mapping>

 以上實作了跳轉的功能,但是跳轉之後,發現位址欄已經改變了,是以此跳轉稱為用戶端跳轉。如果此時假設一個Servlet要向JSP中傳遞屬性,那麼應該使用session範圍。

JumpServlet.java:

 public void doGet(HttpServletRequest req,HttpServletResponse resp)

              throws ServletException,java.io.IOException{

  request.getSession().setAttribute("name","hello") ;

  resp.sendRedirect("jump.jsp") ;

 }

jump.jsp:

<h1><%=session.getAttribute("name")%></h1>

 此時,發現可以通過session屬性範圍傳遞内容,但是如果現在傳遞的内容很多,而程式中使用session範圍的話則肯定會帶來額外的性能降低,但是此時,這些值隻使用一次顯示,那肯定沒有必要使用session對象,最好使用request範圍。如果request屬性範圍也有一個限制,必須是伺服器端跳轉,在JSP中使用<jsp:forward>語句完成,但是在servlet中呢?就隻能使用RequestDsipatcher接口完成,實際上<jsp:forward>語句也是使用包裝了此種應用,既然RequestDispatcher是一個接口,是以必須通過其他方式執行個體化,通過request對象完成。

JumpServlet.java:

 public void doGet(HttpServletRequest req,HttpServletResponse resp)

              throws ServletException,java.io.IOException{

  req.setAttribute("name","hello") ;

  // 準備跳轉到此頁面

  RequestDispatcher rd = req.getRequestDispatcher("jump.jsp") ;

  // 把所有的請求向下繼續傳遞

  rd.forward(req,resp) ;

 }

注意:

 當需要傳遞request屬性範圍的時候才使用伺服器端跳轉。如果不需要傳遞,則可以選擇任意的跳轉方式。

 但是一般情況下都使用RequestDispatcher進行跳轉,而且一定要記住的時候,跳轉之後頁面位址不會有任何的變化。

forward和sendRedirect差別

1.request.getRequestDispatcher()是請求轉發,前後頁面共享一個request ; 

response.sendRedirect()是重新定向,前後頁面不是一個request。

request.getRequestDispather();傳回的是一個RequestDispatcher對象。

2.RequestDispatcher.forward()是在伺服器端運作; 

HttpServletResponse.sendRedirect()是通過向客戶浏覽器發送指令來完成. 

是以RequestDispatcher.forward()對于浏覽器來說是“透明的”; 

而HttpServletResponse.sendRedirect()則不是。

繼續閱讀