servlet间传值

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方式 [ 更多地使用此方法进行服务器端的跳转 ]
   Servlet Context 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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值