分享

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

 英昌知识汇聚馆 2012-03-19

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.);
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在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./xml/ns/javaee"
    xmlns:xsi="http://www./2001/XMLSchema-instance"
    xsi:schemaLocation="http://java./xml/ns/javaee
    http://java./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-file>
  </welcome-file-list>
</web-app>
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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多