您的位置:首页 > Web前端 > JavaScript

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

2016-04-30 21:01 453 查看


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-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: