zoukankan      html  css  js  c++  java
  • 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");

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

    %>

    <a href="JspServlet?action=toServlet">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()则不是。

    转载自:http://blog.csdn.net/sinzen/article/details/54016724

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/xunyi/p/7635478.html
Copyright © 2011-2022 走看看