servlet、jsp跳转(传值)总结及URL传参数


      Servlet传值总结
      1) redirect方式[效率不高]
        request和response没有传给目标页面
        response.sendRedirect("/a.jsp");
        页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
        response.sendRedirect("URL");跳转后浏览器地址栏变化。
        这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
        传值:HttpSession session =request.getSession();
                    session.setAttribute("bbbb", 1111111111);
        取值:session.getAttribute("bbbb");

        传值:RequestDispatcher rd
      =application.getRequestDispatcher("/queryResult.jsp?a="+000);
        取值:request.getParameter("a")

      2) forward方式[更多地使用此方法进行服务器端的跳转]
        ServletContext application =this.getServletContext();    //this是这个页面
        RequestDispatcher rd = application.getRequestDispatcher("/目标页面");
        rd.forward(request, response);
        Servlet页面跳转的路径是相对路径。forward方式只能跳转到本web应用中的页面上,跳转后浏览器地址栏不会变化。
        使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
        传值:request.setAttribute("a", 00);
        取值:request.getAttribute("a");

        传值:HttpSession session =request.getSession();
                    session.setAttribute("bbbb", 1111111111);
        取值:session.getAttribute("bbbb");

        传值:RequestDispatcher rd
      =application.getRequestDispatcher("/queryResult.jsp?a="+000);
        取值:request.getParameter("a");
        getParameter()只能传递字符串,而setAttribute()/getAttribute()还可以传递对象
        其次getParameter方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。 
        只能是页面发送到后台或者Web客户端传到Web服务器端

      =======================================================================
      servlet 和 jsp 跳转页面的几种方法 

      跳转分两部分:

      一是发生在servlet,一是在JSP,其实JSP也就是servlet,不过还是有点差异滴。当然,在servlet中,一般跳转都发生在doGet,
      doPost等方法里面。


      Servlet:

      (1)redirect 方式
      response.sendRedirect("/a.jsp");
      页面的路径是相对路径。
      sendRedirect可以将页面跳转到任何页面,不局限于本web应用中,如:response.sendRedirect(http://www.ycul.com);
      跳转后浏览器地址栏变化。
      这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。

        (2) forward方式
      request.getRequestDispatcher("/a.jsp").forward(request, response);
      或
      getServletContext().getRequestDispatcher("/a.jsp").forward(request,
      response);
      页面的路径是相对路径。
      forward方式只能跳转到本web应用中的页面上。
      跳转后浏览器地址栏不会变化。
      使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
      
        JSP

      1)response.sendRedirect();
      和servlet的response.sendRedirect()方式一样。
      此语句前不允许有out.flush(),如果有,会有异常:
      java.lang.IllegalStateException: Can't sendRedirect() after data has
      committed to the client.
      at
      com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)....
      跳转后浏览器地址栏变化
      如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
      如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转

      2)response.setHeader("Location","");
      此语句前不允许有out.flush(),如果有,页面不会跳转。
      跳转后浏览器地址栏变化
      此语句后面的语句执行完成后才会跳转.

      3)<jsp:forward page="" />
      此语句前不允许有out.flush(),如果有,会有异常:
      java.lang.IllegalStateException: forward() not allowed after buffer has
      committed.
      at
      com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
      at
      com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
      at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
      跳转后浏览器地址栏不变,但是只能跳到当前主机下
      此语句后面的语句执行完成后才会跳转
      ==============================================================
      例题:login.jsp---->LoginServlet.java----->UserDAO.java----->success.jsp

       请看下面项目部署结构:



       web.xml:
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app version="2.5"
          xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
         
          <servlet>
              <servlet-name>loginservlet</servlet-name>
              <servlet-class>com.laolu.servlet.LoginServlet</servlet-class>
          </servlet>
         
          <servlet-mapping>
              <servlet-name>loginservlet</servlet-name>
              <url-pattern>/loginservlet</url-pattern>
          </servlet-mapping>
         
        <welcome-file-list>
          <welcome-file>index.jsp</welcome
     
login.jsp:
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <%
      String path = request.getContextPath();
      String basePath =
      request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
        <head>
          <base href="<%=basePath%>">
          <title>login.jsp</title>
          <meta http-equiv="pragma" content="no-cache">
          <meta http-equiv="cache-control" content="no-cache">
          <meta http-equiv="expires" content="0">   
          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          <meta http-equiv="description" content="This is my page">
          <!--
          <link rel="stylesheet" type="text/css" href="styles.css">
          -->
        </head>
        <body>
          <form action="loginservlet" method="post">
               用户名:<input type="text" name="uname" /><br/>
               密码:<input type="password" name="ps" /><br/>
              文本域:<textarea rows="10" cols="30" name="text"></textarea><br/>
              <input type="submit" value="提交">
          </form>
        </body>
      </html>
      LoginServlet.java:
      package com.laolu.servlet;

      import java.io.UnsupportedEncodingException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import com.laolu.dao.UserDAO;

      public class LoginServlet extends HttpServlet{

          public void doGet (HttpServletRequest request,HttpServletResponse
      response){
              String name = request.getParameter("uname");
              byte[] b;
              try {
                  b = name.getBytes("iso8859-1");
                  String username = new String(b,"UTF-8");
                 
                  String password = request.getParameter("ps");
                 
                  String text = request.getParameter("text");
                 
                  //设置session范围属性
                  request.getSession().setAttribute("china", "李静");
                 
                  //设置request范围属性
                  request.setAttribute("n", "肖人");
                 
                  UserDAO user = new UserDAO();
                 
                  boolean flag = user.findUser(username,password);
                  if(flag){
                      //将需要转发或发送的地址进行转码操作。这样在目标页面更好取值,以免乱码产生
                      String url =
      "forward/success.jsp?first=传递第一个参数&second=传递第二个参数";
                      url = new String(url.getBytes("UTF-8"),"ISO8859-1");
                     
                      //客户端跳转。只有session范围的属性及url中参数会被传递下去
                      //response.sendRedirect(url);
                     
                      //服务器端跳转。request对象、url中的参数会被传递下去
                      request.getRequestDispatcher(url).forward(request,
      response);
                     
                  }else{
                      response.sendRedirect("forward/error.jsp");
                  }
              } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
                  }
             
          }
         
          public void doPost(HttpServletRequest request,HttpServletResponse
      response){
              doGet(request, response);
          }
      }
      success.jsp:
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <%
      String path = request.getContextPath();
      String basePath =
      request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      %>

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
        <head>
          <base href="<%=basePath%>">
          <title>My JSP 'login.jsp' starting page</title>
          <meta http-equiv="pragma" content="no-cache">
          <meta http-equiv="cache-control" content="no-cache">
          <meta http-equiv="expires" content="0">   
          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          <meta http-equiv="description" content="This is my page">
          <!--
          <link rel="stylesheet" type="text/css" href="styles.css">
          -->
        </head>
          <body>
              servlet登录成功。<br/><br/>
              <!-- 取得在servlet中设置的session范围属性值 -->
               <%= "session中取得的属性值"+ session.getAttribute("china") %><br/>
               <!-- 取得通过url传递的参数的值。并进行解码。否则会乱码 -->
               <%="url中第一个参数:"+ new
      String(request.getParameter("first").getBytes("ISO8859-1"),"UTF-8") %>
                  <br/>
                   <%="url中第二个参数:"+ new
      String(request.getParameter("second").getBytes("ISO8859-1"),"UTF-8") %>
      
              <br/>
              <!-- 取得在servlet中设置的request的属性值。并进行解码。否则会乱码 -->
              <%="request中取得的属性值:"+ request.getAttribute("n") %>
              <br/>
              <!-- 取得表单提交过来的数据。同样需要进行解码-->
              <%=new
      String(request.getParameter("text").getBytes("ISO8859-1"),"UTF-8") %>
        </body>
      </html>
      error.jsp:
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <%
      String path = request.getContextPath();
      String basePath =
      request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      %>

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
        <head>
          <base href="<%=basePath%>">
         
          <title>My JSP 'login.jsp' starting page</title>
         
          <meta http-equiv="pragma" content="no-cache">
          <meta http-equiv="cache-control" content="no-cache">
          <meta http-equiv="expires" content="0">   
          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          <meta http-equiv="description" content="This is my page">
          <!--
          <link rel="stylesheet" type="text/css" href="styles.css">
          -->
        </head>
        <body>
             servlet输入错误,<a href="forward/login.jsp">请重新登录</a>
        </body>
      </html>
      UserDAO:
      package com.laolu.dao;

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;

      public class UserDAO {
          Connection  conn = null;
          //去连接数据库,查询userInfo表中的数据
          //1.连接数据库
          public Connection getCon(){
              //1.加载数据库驱动程序:微软公司开发的数据库驱动程序jar包,添加到WEB-INF/lib目录下
              String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
              String url = "jdbc:sqlserver://localhost:1433;DataBaseName=abc";
             
              try {
                  Class.forName(driver);
                  try {
                      conn = DriverManager.getConnection(url,"sa","sasa");
                      System.out.println("数据库连接成功!");
                      System.out.println(conn);
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
              //取得数据库连接对象
             
              return conn;
          }
         
          /**
           * @通过用户名和密码查找用户
           * @param name
           * @param ps
           */
          public boolean findUser(String name,String ps){
              boolean flag = false;
              conn = this.getCon();
              //st对象用于执行sql语句
              Statement st;
              try {
                  st = conn.createStatement();
                  ResultSet rs = st.executeQuery("select * from userinfo where
      uname='"+name+"' and ps='"+ps+"'");
                  while (rs.next()) {
                      String uname = rs.getString("uname");
                      String password = rs.getString("ps");
                      //System.out.println(uname);
                      return flag=true;
                  }
                  rs.close();
                  st.close();
                  conn.close();
              } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              return flag;
          }
      }

      生成数据库表的脚本:a.sql
      USE [abc]
      GO
      /****** 对象:  Table [dbo].[userinfo]    脚本日期: 03/19/2012 14:25:31 ******/
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      SET ANSI_PADDING ON
      GO
      CREATE TABLE [dbo].[userinfo](
          [uname] [varchar](50) NOT NULL,
          [ps] [varchar](50) NULL
      ) ON [PRIMARY]
      GO
      SET ANSI_PADDING OFF
      GO




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值